Java - Чтение ввода из файла. java.io.FilterInputStream.available (неизвестный источник)? - PullRequest
0 голосов
/ 11 января 2010

Я не писал Java годами, и вернулся к тому, чтобы освежить свою память простым примером «чтение из файла». Вот мой код ..

import java.io.*;
public class filereading {

    public static void main(String[] args) {
        File file = new File("C:\\file.txt");
        FileInputStream fs = null;
        BufferedInputStream bs = null;
        DataInputStream ds = null;

        try
        {
            fs = new FileInputStream(file);
            bs = new BufferedInputStream(bs);
            ds = new DataInputStream(ds);

            while(ds.available()!= 0)
            {
                String readLine = ds.readLine();
                System.out.println(readLine);
            }

            ds.close();
            bs.close();
            fs.close();
        }

        catch(FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

Это прекрасно компилируется (хотя, очевидно, ds.readLine () удален), но во время выполнения это дает мне

Исключение в теме "главная" java.lang.NullPointerException в java.io.FilterInputStream.available (Неизвестно Источник) в filereading.main (filereading.java:21)

Что дает?

Ответы [ 2 ]

6 голосов
/ 11 января 2010

Вы сделали простую опечатку:

ds = new DataInputStream(ds);

должно быть

ds = new DataInputStream(bs);

Ваш код инициализирует DataInputStream с нулевым источником, поскольку ds еще не был создан.

Сказав это, ответ Джона Скита дает лучший способ написать программу для чтения файлов (и вы всегда должны использовать Readers / Writers вместо Streams при работе с текстом).

3 голосов
/ 11 января 2010

Чтобы прочитать текстовый файл, используйте BufferedReader - в этом случае оберните InputStreamReader, оберните FileInputStream. (Это позволяет вам явно задавать кодировку - что вам определенно следует делать.) Конечно, вы также должны закрывать ресурсы в блоках finally.

Затем следует читать строки до тех пор, пока readLine() вернет ноль, а не полагаться на available() IMO. Я подозреваю, что вы обнаружите, что readLine() возвращал null для последней строки в файле, хотя available() вернул 2, чтобы указать окончательный \r\n. Просто предчувствие.

String line;
while ((line = reader.readLine()) != null)
{
    System.out.println(line);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...