Выбор между FileReader и InputStreamReader - PullRequest
13 голосов
/ 30 марта 2012

У меня есть два метода для чтения текстового файла В 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);
}

и Other is

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);
}

Хотя оба дают мне вывод ...просто хочу узнать, какой из них лучший.

Ответы [ 4 ]

21 голосов
/ 30 марта 2012

Я бы настоятельно рекомендовал бы использовать 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));

Из Java 8

Java 8 представила кучу новых классов и методов в java.nio.files, многие из которых по умолчанию (разумно) имеют значениеUTF-8:

Path path = Paths.get("C:\\testnew\\out.text");
List<String> lines = Files.readAllLines(path);
2 голосов
/ 30 марта 2012

Оба подхода хороши, потому что вы используете BufferedReader, который значительно повышает производительность по сравнению с подходом без буфера. Во втором случае нет необходимости заключать FileInputStream в DataInputStream. Последний подход - давайте вам укажем кодировку файла через InputStreamReader, что обычно является важной вещью.

1 голос
/ 30 марта 2012

Это зависит от того, хотите ли вы прочитать файл, который содержит только текст (я имею в виду текстовый файл), тогда вам следует использовать первый регистр.

Если вы хотите прочитать какой-нибудь файл, представляющий двоичные данные (iозначает файл изображения или видеофайл и т. д.), вы должны использовать второй случай.

0 голосов
/ 30 марта 2012

Ну, вы изначально создаете BufferedReader из FileInputStream. Вы должны сделать это следующим образом:

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

Чтобы получить правильный подход к потоку.

...