Java DataInputStream读取操作抛出异常

时间:2011-03-30 17:34:39

标签: java io

我正在努力熟悉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 个答案:

答案 0 :(得分:4)

而不是

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

你需要

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

答案 1 :(得分:3)

执行readUTF时,前两个字节用于长度。这意味着如果你有随机字节(不是来自writeUTF),你将尝试读取非常长的字符串,因为没有足够的数据,你将得到EOFException。

答案 2 :(得分:1)

我认为this link会有所帮助。抛出异常(来自oracle docs) -

  

如果此输入流在读取所有字节之前到达结尾。

答案 3 :(得分:0)

在文件中的整数后,您没有UTF字符。当您尝试读取UTF时,会有文件结束,因此您有例外。

在您阅读并手动检查文件之前尝试调试模式停止,那么您有什么?

答案 4 :(得分:0)

您只能使用readUTF()来读取使用writeUTF()编写的项目。

对于任何XXX的readXXX()和writeXXX()通常都是如此(除非您想读取int或其他类似的字节并且您知道自己在做什么)。