Java DataInputStream операции чтения, выбрасывающие исключения - PullRequest
0 голосов
/ 30 марта 2011

Я пытаюсь ознакомиться с классами Java IO, поэтому я написал следующий код:

public static void main(String[] args)throws IOException {
    FileOutputStream fos = new FileOutputStream("fileIO.txt");
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    DataOutputStream dos = new DataOutputStream(bos);

    //fos.write(9999);
    //bos.write(9999);
    dos.writeInt(9999);
    dos.writeBytes("中文字(Chinese)\n");
    dos.writeChars("中文字(Chinese)\n");
    dos.flush();

    FileInputStream fis = new FileInputStream("fileIO.txt");
    BufferedInputStream bis = new BufferedInputStream(fis);
    DataInputStream dis = new DataInputStream(bis);

    System.out.println(dis.readInt());
    System.out.println(dis.readUTF());
}

К сожалению, я получаю это:

9999
Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:180)
at java.io.DataInputStream.readUTF(DataInputStream.java:592)
at java.io.DataInputStream.readUTF(DataInputStream.java:547)
at IO.main(IO.java:34)

Может кто-нибудь указатьЗачем?Спасибо.

Ответы [ 5 ]

4 голосов
/ 30 марта 2011

Вместо

dos.writeBytes("中文字(Chinese)\n");
dos.writeChars("中文字(Chinese)\n");

вам нужно

dos.writeUTF("中文字(Chinese)\n");
3 голосов
/ 30 марта 2011

Когда вы выполняете readUTF, первые два байта используются для длины.Это означает, что если у вас есть случайные байты (не из writeUTF), вы попытаетесь вместо этого прочитать очень длинную строку, а поскольку данных недостаточно, вы получите EOFException.

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

Я думаю эта ссылка будет полезна. Исключение выдается (из oracle docs ) -

если этот поток ввода достигает конца перед чтением всех байтов.

0 голосов
/ 31 марта 2011

Вы можете использовать readUTF () только для чтения элементов, которые были написаны с помощью writeUTF ().

В общем, это верно для readXXX () и writeXXX () для любого XXX (если вы не хотите читать байты типа int или чего-то подобного и знаете, что делаете).

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

В вашем файле нет UTF-символа после целого числа. Когда вы пытаетесь прочитать UTF, есть конец файла, поэтому у вас есть исключение.

Попробуйте в режиме отладки остановить, прежде чем читать и вручную проверить файл, что у вас тогда?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...