我想将一些字符串存储在一个简单的.txt文件中,然后读取它们,但是当我想用Base64对它们进行编码时,它不再起作用了:它写得很好但是读取不起作用。 ^^
写方法:
private void write() throws IOException {
String fileName = "/mnt/sdcard/test.txt";
File myFile = new File(fileName);
BufferedWriter bW = new BufferedWriter(new FileWriter(myFile, true));
// Write the string to the file
String test = "http://google.fr";
test = Base64.encodeToString(test.getBytes(), Base64.DEFAULT);
bW.write("here it comes");
bW.write(";");
bW.write(test);
bW.write(";");
bW.write("done");
bW.write("\r\n");
// save and close
bW.flush();
bW.close();
}
阅读方法:
private void read() throws IOException {
String fileName = "/mnt/sdcard/test.txt";
File myFile = new File(fileName);
FileInputStream fIn = new FileInputStream(myFile);
BufferedReader inBuff = new BufferedReader(new InputStreamReader(fIn));
String line = inBuff.readLine();
int i = 0;
ArrayList<List<String>> matrice_full = new ArrayList<List<String>>();
while (line != null) {
matrice_full.add(new ArrayList<String>());
String[] tokens = line.split(";");
String decode = tokens[1];
decode = new String(Base64.decode(decode, Base64.DEFAULT));
matrice_full.get(i).add(tokens[0]);
matrice_full.get(i).add(tokens[1]);
matrice_full.get(i).add(tokens[2]);
line = inBuff.readLine();
i++;
}
inBuff.close();
}
任何想法为什么?
答案 0 :(得分:4)
您的代码中有几处错误。
首先说明您的代码:
*/
但是没有一个开始注释标记。read
方法中的catch-block)是非常糟糕的想法,除非你真的知道你在做什么。它大部分时间的作用是隐藏你的潜在问题。至少写一个例外的堆栈跟踪是catch
块。回到解决方案:
运行程序。它引发了一个例外:
02-01 17:18:58.171: E/AndroidRuntime(24417): Caused by: java.lang.ArrayIndexOutOfBoundsException
由此处的行引起:
matrice_full.get(i).add(tokens[2]);
检查变量tokens
表明它有2
个元素,不是3
。
因此,让我们打开write
方法生成的文件。这样做会显示此输出:
here it comes;aHR0cDovL2dvb2dsZS5mcg==
;done
here it comes;aHR0cDovL2dvb2dsZS5mcg==
;done
here it comes;aHR0cDovL2dvb2dsZS5mcg==
;done
注意这里打破了。这是因为Base64.encodeToString()
在编码字符串的末尾添加了额外的换行符。要生成一行而不添加额外的换行符,请添加Base64.NO_WRAP
作为第二个参数,如下所示:
test = Base64.encodeToString(test.getBytes(), Base64.NO_WRAP);
请注意,您必须删除之前创建的文件,因为它有不正确的换行符。
再次运行代码。它现在创建一个包含适当内容的文件:
here it comes;aHR0cDovL2dvb2dsZS5mcg==;done
here it comes;aHR0cDovL2dvb2dsZS5mcg==;done
打印matrice_full
的输出现在给出:
[
[here it comes, aHR0cDovL2dvb2dsZS5mcg==, done],
[here it comes, aHR0cDovL2dvb2dsZS5mcg==, done]
]
请注意,您没有对代码中的decode
变量中的值执行任何操作,因此第二个元素是从文件中读取的该值的Base64表示。