我有一个字符串,希望将其持久化到文件中,并能够再次将其检索为字符串。
我的代码出了点问题,因为它假定我必须编写一些二进制不可读的文件,但是当我打开文件时,我可以看到以下内容:
原始字符串:
[{"name":"asdasd","etName":"111","members":[]}]
在二进制文件中存储的字符串:
[ { " n a m e " : " a s d a s d " , " e t N a m e " : " 1 1 1 " , " m e m b e r s " : [ ] } ]
我发现了两个问题:
这是我存储字符串的代码:
public static void storeStringInBinary(String string, String path) {
DataOutputStream os = null;
try {
os = new DataOutputStream(new FileOutputStream(path));
os.writeChars(string);
os.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这是我的将其从二进制读取为字符串的代码:
public static String retrieveStringFromBinary(String file) {
String string = null;
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader (file));
String line = null;
StringBuilder stringBuilder = new StringBuilder();
while((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
return stringBuilder.toString();
} catch (Exception e){
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return string;
}
谢谢。
答案 0 :(得分:1)
首先,文本文件和二进制文件之间并没有真正的区别。文本文件只是内容属于与字符对应的字节值范围内的文件。
如果要加密文件的内容,以致仅通过添加文件就无法读取文件的内容,则需要选择适当的加密方法。
在Java中第二种混合阅读器/编写器和流绝不是一个好主意,选择一种样式并坚持下去。
将字符串保存到文件的函数存在的问题是您正在使用writeChars()
方法,该方法从文档中执行以下操作:
将char作为2字节的值写到基础输出流,高字节在前。如果未引发异常,则写入的计数器将增加2。
由于您的字符串是由单字节字符组成的,因此会导致字符串以空字节填充,而在读回时将其转换为空格。如果将其更改为writeBytes()
,则应该得到的输出没有多余的空字节。
由于文件中的前导0x00,空字节也会使您的读取函数停止工作,因为readLine()
函数在第一次调用时将返回null
。
答案 1 :(得分:0)
public static void storeStringInBinary(String string, String path) {
try(ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path))) {
os.writeObject(string);
} catch (IOException e) {
e.printStackTrace();
}
}
public static String retrieveStringFromBinary(String file) {
String string = null;
try (ObjectInputStream reader = new ObjectInputStream(new FileInputStream(file))){
string = (String) reader.readObject();
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
return string;
}