用字符串读/写BINARY文件?

时间:2012-07-20 17:54:07

标签: java string binary datainputstream dataoutputstream

如何从二进制文件中读取/读取字符串?

我尝试过使用writeUTF / readUTF(DataOutputStream / DataInputStream),但这太麻烦了。

感谢。

2 个答案:

答案 0 :(得分:3)

暂时忘掉FileWriter,DataOutputStream。

  • 对于二进制数据,使用OutputStreamInputStream类。他们处理byte[]
  • 对于文本数据,使用ReaderWriter类。它们处理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