我正在努力熟悉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)
有人能指出原因吗?感谢。
答案 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或其他类似的字节并且您知道自己在做什么)。