Выбор между FileReader и InputStreamReader

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

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

Ответ 1

Я настоятельно рекомендую использовать InputStreamReader вместо FileReader, но явно указывая кодировку символов. Это действительно самое большое преимущество использования InputStreamReader (и отсутствие возможности указывать кодировку для FileReader является основным отверстием в API, IMO).

Я также удаляю "layer" с помощью DataInputStream - просто передайте FileInputStream в конструктор InputStreamReader.

В качестве альтернативы рассмотрим использование некоторых из многих удобных методов в Guava, которые могут сделать эту вещь намного проще. Например:

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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