我需要在文件中将字符串写为UTF-8中的字节,然后从文件中返回这些字节并将其转换回字符串并作为后果获取相同的字符串。可能听起来很容易但是存在隐藏的问题,例如文件中的符号不正确。我的意思是在追加到文件后它必须包含类似:
00000008 d0bad0bb d18ed187 00000010等...
但它包含这样的东西:
mystring ---很多空间---(以及这里没有显示的符号)
那么,我已经做了什么?我试过这种方式:
在代码阅读之前:我在HashMap中保留字符串<字符串,字符串>这就是我的代码包含get(...)等的原因
try {
FileOutputStream oStream = new FileOutputStream("filename.txt");
Set<String> keySet = storage.keySet();
ByteBuffer buffer = ByteBuffer.allocate(1024);
for (String key : keySet) {
byte[] keyInByte = key.getBytes("UTF-8");
byte[] valueInByte = storage.get(key).getBytes("UTF-8");
oStream.write(buffer.putInt(0, valueInByte.length).array());
oStream.write(keyInByte);
oStream.write((buffer.putInt(0, valueInByte.length).array()));
oStream.write(valueInByte);
}
} catch (Exception e) {
System.err.println("permission denied");
}
我也尝试过使用PrintWriter,FileWriter等......但它并没有给出我需要的东西。例如,其中一些需要toString()方法但是在toString()之后我将失去使用字节的能力。
!请注意,我尝试将记事本更改为UTF-8编码,但没有结果。
答案 0 :(得分:2)
如果您想使用“属性”,则可以执行此操作。
new Properties(map).save(new FileOutputStream("filename.proeprties"));
加载属性
Properties prop = new Properties();
prop.load(new FileInputStream("filename.properties"));
map.putAll(prop);
要保存复制数据,您可以使用属性作为地图。
key1=value1
key2=value2
注意:密钥不能包含=
或换行符。
我就是这样做的二进制格式
DataOutputStream dos = new BufferedOutputStream(new FileOutputStream("filename.dat")));
dos.writeInt(map.size());
for (Map.Entry<String, String> entry : map.entrySet()) {
dos.writeUTF(entry.getKey());
dos.writeUTF(entry.getValue());
}
dos.close();
这就是我用文字写的方式,使用UTF-8
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOuputStream("filename.txt") "UTF-8"));
pw.println(map.size());
for (Map.Entry<String, String> entry : map.entrySet()) {
pw.println(encode(entry.getKey()));
pw.println(encode(entry.getValue()));
}
pw.close();
public static String encode(String s) {
// if you can assume no new lines, don't do anything.
return s.replaceAll("\\\\", "\\\\\\\\").replaceAll("\n", "\\\\n");
}
这会产生类似
的内容key1
value1
key2
value2
这可以让你轻松编辑。如果您认为密钥没有=
或:
或标签,则可以像属性文件一样使用一行