Java 在FileReader和InputStreamReader之间选择

Java 在FileReader和InputStreamReader之间选择,java,java-io,Java,Java Io,我有两种在java中读取文本文件的方法,一种是使用FileReader,另一种是文件InputStream FileReader fr=new FileReader("C:\\testq\\test.txt"); BufferedReader br=new BufferedReader(fr); String s; while((s=br.readLine())!=null){ System.out.println("value are "+s); } 另一个是 FileInputSt

我有两种在java中读取文本文件的方法,一种是使用FileReader,另一种是文件InputStream

FileReader fr=new FileReader("C:\\testq\\test.txt");
BufferedReader br=new BufferedReader(fr);
String s;
while((s=br.readLine())!=null){
    System.out.println("value are "+s);
}
另一个是

FileInputStream fstream = new FileInputStream("C:\\testnew\\out.text");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null){
   System.out.println (strLine);
}
虽然两者都提供输出…但我只想知道哪种方法是最好的。

我强烈建议使用
InputStreamReader
,而不是
FileReader
,而是明确指定字符编码。这确实是使用
InputStreamReader
的最大好处(而且缺少为
FileReader
指定编码的能力是API中的一个主要漏洞,IMO)

我还将使用
DataInputStream
删除“层”-只需将
FileInputStream
传递给
InputStreamReader
构造函数即可

在Java 8之前

备选,考虑使用一些可以使这类事情变得更简单的许多便利方法。例如:

File file = new File("C:\\testnew\\out.text");
List<String> lines = Files.readLines(file, Charsets.UTF_8));

好的,您最初从
文件输入流
创建了一个
BufferedReader
。您应该按照以下步骤进行操作:

FileInputStream fstream = new FileInputStream("C:\\testnew\\out.text");
BufferedInputStream bstream = new BufferedInputStream(fstream);

获得适当的与流相关的方法。

这两种方法都可以,因为您使用了BufferedReader,与无缓冲区方法相比,它可以极大地提高性能。在第二种情况下,不需要将FileInputStream包装到DataInputStream中。最后一种方法是,让我们通过InputStreamReader指定文件编码,这通常是一件重要的事情。

这取决于,如果要读取仅包含文本的文件(我指的是文本文件),则应使用第一种情况


如果要读取表示二进制数据的文件(我指的是图像文件或视频文件等),则应使用第二种情况。

为什么?他想阅读文本,所以读者更合适——我怀疑它是否值得在两个层次上明确缓冲。我不是说他应该在这种情况下使用这种方法。我的意思是流相关的方法必须这样使用:)@AlexStybaev:所以要解决不同的问题,你会使用不同的代码吗?我认为这是理所当然的。。。你的回答与OP的实际问题有什么关系?@Jon Skeet:他问了两种方法中最好的一种,我指出第二种方法实际上并不正确,是字节读取,而不是文本读取。这与他的问题不相关吗?@AlexStybaev:这绝非一个坏方法——这是一个好方法。OP想要阅读文本-因此他想要的是
阅读器
,而不是
输入流
。从
InputStream
创建
Reader
的正确方法是使用
inputstreeamreader
,就像在文章中一样。您还没有展示如何从
BufferedInputStream
读取文本数据。第二个示例中的
DataInputStream
没有任何作用:没有它,代码也可以工作。谢谢。它工作了,但“显式指定字符编码”的确切含义是什么。。请求可以用很小的篇幅来解释detail@Sebs_Jedi你不明白其中哪一点?目前,您正在调用使用默认字符编码的构造函数,但可以指定一个(UTF-8、UTF-16等)。使用默认编码很少是一个好主意,尽管显然您需要使用文本文件所用的任何编码。即使是java.nio.file包也与[Files.readAllLines(…)](,java.nio.charset.charset))@GagandeepBali:在java 7中,是的。如果我们能在基础库中看到越来越多的番石榴功能,我会很高兴的…@Jon Skeet你好,伙计,你能给我一些番石榴的想法吗?它是什么或任何开始学习的链接?谢谢你的回答,但你能告诉我哪种替代方法吗,文章中的代码根本不使用
DataInputStream.readLine
。它使用的是
BufferedReader.readLine
-仔细看一看。@Sebs_Jedi如果你用对了,你的代码绝对是写的。我以前误解了这一点。很抱歉
FileInputStream fstream = new FileInputStream("C:\\testnew\\out.text");
BufferedInputStream bstream = new BufferedInputStream(fstream);