按行读取和写入FileInputStream和FileOutputStream

4

FileInputStream读取文件的所有字节,而FileOutputStream将所有字节写入文件

如果我想逐行读取文件的所有字节,应该使用哪个类?

这样,如果fileA包含两行

line1 line2

那么将分别读取line1和line2的字节

对于FileOutputStream也是同样的情况


“lines” 意味着文本数据。 “output stream” 意味着二进制数据。 哪一个是它? - Kevin Bourrillion
2个回答

15
弗雷德里克在BufferedReader方面是正确的,但我不同意他关于PrintWriter的看法,我的问题是PrintWriter会吞噬异常。
值得理解的是,为什么FileInputStreamFileOutputStream没有与行相关的方法: *Stream类是关于二进制数据流的。二进制数据中没有“行”这个概念。而*Reader*Writer类是处理文本的,其中“行”的概念更有意义……尽管一个通用的Reader不能够聪明地读取一行数据(只能读取一个字符块),这就是BufferedReader的用处。 InputStreamReaderOutputStreamWriter是适配器类,它们可以将字节流应用特定字符编码以将其转换为字符流,或将字符流转换为字节流。
因此,您可能需要使用BufferedReader包装InputStreamReader包装FileInputStream来进行读取——然后调用readLine()。对于写入操作,请使用BufferedWriter包装OutputStreamWriter包装FileOutputStream——然后调用write(String)newLine()。(这将给您平台默认的换行符——如果需要特定的换行符,请将其作为字符串写入。)

此外还有FileReader类,它有点像将FileInputStreamInputStreamReader结合起来(FileWriter也是相同的)。但这些类始终使用平台默认编码,这几乎永远不是你想要的。我认为这使它们几乎没有用处。


我同意PrintWriter有缺点,但它是最接近问题的一个。我一开始建议使用Writer,但它确实不能“逐行”处理。不过这是个好观点(+1)。 - Fredrik
@Fredrik:Java库的设计者决定赋予PrintWriter太多的职责,这不是你的错 :( - Jon Skeet
@Jon:谢谢 :-) 我知道,我只是想解释一下为什么我还是推荐它。 - Fredrik

7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接