2012-07-20 99 views
0

如何从二进制文件写入/读取字符串?读取/写入带有字符串的BINARY文件?

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

谢谢。

+0

如果您正在使用Java 7,请查看新的[Files](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html)类。 – Chris911 2012-07-20 18:02:13

+0

令我嫉妒,但Java 7让我与许多较旧的程序不兼容,我宁愿以另一种方式做。 – 2012-07-20 18:04:26

+1

向我们展示您迄今为止所尝试的内容以及您遇到错误/问题的位置。 – Chris911 2012-07-20 18:05:49

回答

2

忘掉的FileWriter,DataOutputStream类一会儿。

  • 对于二进制数据,一个使用OutputStreamInputStream类。他们处理byte[]
  • 对于文本数据,使用ReaderWriter类。他们处理String,它可以存储所有类型的文本,因为它在内部使用Unicode。

从文本到二进制数据的交叉可以通过指定编码完成,默认为OS编码。

  • new OutputStreamWriter(outputStream, encoding)
  • string.getBytes(encoding)

所以,如果你想避免byte[]和使用字符串必须滥用涵盖以任意顺序全部256个字节值的编码。所以没有“UTF-8”,但可能是“windows-1252”(也称为“Cp1252”)。

但内部存在转换,在极少数情况下可能会发生问题。例如é可以在Unicode中是一个代码,或者两个,e +结合变音标记右侧口音'。有一个转换函数(java.text.Normalizer)。

导致问题的一种情况是不同操作系统中的文件名; MacOS有另一个Unicode规范化比Windows,因此在版本控制系统中需要特别注意。

所以原则上最好使用更繁琐的字节数组或ByteArrayInputStream或java.nio缓冲区。请注意,字符串char s是16位。

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 
+0

我已经在使用writeUTF/readUTF - 它太麻烦了。我有没有提到我想读取/写入二进制文件而不是纯文本?抱歉...编辑主帖 – 2012-07-20 19:49:03

+0

我无法想象使用writeUTF/readUTF更简单。没有看到你的代码,我无法想象你是什么原因引起麻烦。 – 2012-07-20 20:01:10