最近在学习javaI/O这块,学到 DataOutputStream 写入一个String,然后读出来时报Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readFully(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at com.test.nio.DataOutPutTest.main(DataOutPutTest.java:22)
代码如下
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class DataOutPutTest { public static void main(String[] args) throws Exception {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("dat.txt")));
dos.write(1);
dos.writeUTF("hellow");
dos.writeLong(5);
dos.close();

DataInputStream din = new DataInputStream(new BufferedInputStream(new FileInputStream("dat.txt")));
System.out.println(din.readInt());
System.out.println(din.readUTF());
System.out.println(din.readLong());
// for (int i = 0; i < din.available(); i++) {
// System.out.println(din.readUTF());
// }
din.close();
}
}
           其中  System.out.println(din.readInt());
System.out.println(din.readLong());
这两行是可以打印的
就是System.out.println(din.readUTF());
这行报错
请问这是什么原因呢。

解决方案 »

  1.   

    这个错,就是说文件已经读到末尾了,你还在读。在这段代码中,我确实没办法帮你解决这个异常。
    不过你为什么不换个流来读列?  Java.io 家庭有60多个流对象。。每个流有自己的专长。用DataInputStream来读一个文本文件,本身就是一种错误的选择。API上说:reading primitive Java data types from an underlying input stream。
    我们一般都用他们来写一个对象,读一个对象。。
    关于:DataInputStream/DataOutputStream
      

  2.   

    写入的时候你使用的是dos.write(1);而读取的时候你却使用了din.readInt()。
      

  3.   

    补充:
    dos.write(1);将指定字节(参数 b 的八个低位)写入基础输出流。也就是说它只写1个字节的数据。
    din.readInt();读取四个输入字节并返回一个 int 值。也就是说它要读取4个字节的数据。也就是你多读取了3个字节的内容。导致后面的文件无法读取所需的字节数。才会报java.io.EOFException
    异常的。
      

  4.   

    但是我重新做了一个Demo却没有报错
    package com.rooyeetone.vhost;import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;public class DataOutputTest { public static void main(String[] args) throws Exception {
    FileOutputStream out = new FileOutputStream("e:/data.txt");
    BufferedOutputStream bout = new BufferedOutputStream(out);
    DataOutputStream dout = new DataOutputStream(bout); FileInputStream in = new FileInputStream("e:/data.txt");
    BufferedInputStream bin = new BufferedInputStream(in);
    DataInputStream din = new DataInputStream(bin); dout.writeByte(-12);
    dout.writeLong(12);
    dout.writeChar('1');
    dout.writeFloat(1.01f);
    dout.writeUTF("好");
    dout.close(); System.out.println(din.readByte());
    System.out.println(din.readLong());
    System.out.println(din.readChar());
    System.out.println(din.readFloat());
    String s;
    s = din.readUTF();
    System.out.println(s); din.close();
    }
    }
      

  5.   


    还是你比较细心
    代码纯属粗心啊。。write()和writeInt()是完全不同的