如何从二进制文件中读取/读取字符串?
我尝试过使用writeUTF
/ readUTF
(DataOutputStream / DataInputStream),但这太麻烦了。
感谢。
答案 0 :(得分:3)
暂时忘掉FileWriter,DataOutputStream。
OutputStream
和InputStream
类。他们处理byte[]
。Reader
和Writer
类。它们处理String
,它可以存储所有类型的文本,因为它在内部使用Unicode。从文本到二进制数据的交叉可以通过指定编码来完成,默认为OS编码。
new OutputStreamWriter(outputStream, encoding)
string.getBytes(encoding)
因此,如果您想避免使用byte[]
并使用String,则必须滥用以任何顺序覆盖所有256字节值的编码。所以没有“UTF-8”,但可能是“windows-1252”(也称为“Cp1252”)。
但内部存在转换,在极少数情况下可能会出现问题。例如,Unicode中é
可以是一个代码,或两个e
+组合变音标记右重音'
。存在转换函数(java.text.Normalizer)。
一个已导致问题的案例是不同操作系统中的文件名; MacOS还有另一种Unicode规范化,因此在版本控制系统中需要特别注意。
因此,原则上最好使用更麻烦的字节数组,或ByteArrayInputStream或java.nio缓冲区。还要注意,字符串char
是16位。
答案 1 :(得分:2)
如果你想写文字,你可以使用作家和读者。
您可以使用Data * Stream writeUTF / readUTF,但字符串长度必须小于64K字符。
public static void main(String... args) throws IOException {
// generate a million random words.
List<String> words = new ArrayList<String>();
for (int i = 0; i < 1000000; i++)
words.add(Long.toHexString(System.nanoTime()));
writeStrings("words", words);
List<String> words2 = readWords("words");
System.out.println("Words are the same is " + words.equals(words2));
}
public static List<String> readWords(String filename) throws IOException {
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
int count = dis.readInt();
List<String> words = new ArrayList<String>(count);
while (words.size() < count)
words.add(dis.readUTF());
return words;
}
public static void writeStrings(String filename, List<String> words) throws IOException {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filename)));
dos.writeInt(words.size());
for (String word : words)
dos.writeUTF(word);
dos.close();
}
打印
Words are the same is true