详细 代码如下 ,请各位老大帮小弟看看package src;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class DataInputStreamTest {
public static void main(String[] args) throws Exception{
String fname = "D:\\Myworkspace\\IOTest\\src\\student.txt";
new Student("dawei").save(fname);
new Student("zhengyuan").save(fname);
Student.display(fname);
}
}
class Student{

static int count = 0;
int number = 1;
String name;
Student(){
this("");
}
Student(String name){
this.count++;
this.number = this.count;
this.name = name;
}
// 保存 数据
public void save(String fname)throws Exception{
File f = new File(fname);
f.createNewFile();
FileOutputStream fo = new FileOutputStream(fname,true);
DataOutputStream dout = new DataOutputStream(fo);
dout.writeInt(this.number);
dout.writeChar('\t');
dout.writeChars(this.name);
dout.writeChar('\n');
dout.close();
}
// 显示数据
public static void display(String fname)throws Exception{
FileInputStream fi = new FileInputStream(fname);
DataInputStream dfi = new DataInputStream(fi);
int i = dfi.readInt();
while(i!=-1){
System.out.println("i="+i);
char ch;
while ((ch = dfi.readChar())!= '\n'){   // 这句话报出异常
System.out.println(ch);
i = dfi.readInt();
}
}
dfi.close();
}

}

解决方案 »

  1.   

    EOF:end of file应该是你的while的判断条件的问题。\n可能不行吧。换成\r\n看看
      

  2.   

    楼上的老大 ,请您运行一下我的代码可以吗?
    帮我看看,\n 改成 \r\n 好像不可以
      

  3.   

    import java.io.DataInputStream; 
    import java.io.DataOutputStream; 
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileOutputStream; public class DataInputStreamTest { 
    public static void main(String[] args) throws Exception{ 
    String fname = "D:\\student.txt"; 
    new Student("dawei").save(fname); 
    new Student("zhengyuan").save(fname); 
    Student.display(fname); 


    class Student{ static int count = 0; 
    int number = 1; 
    String name; 
    Student(){ 
    this(""); 

    Student(String name){ 
    this.count++; 
    this.number = this.count; 
    this.name = name; 

    // 保存 数据 
    public void save(String fname)throws Exception{ 
    File f = new File(fname); 
    f.createNewFile(); 
    FileOutputStream fo = new FileOutputStream(fname,true); 
    DataOutputStream dout = new DataOutputStream(fo); 
    dout.writeInt(this.number); 
    dout.writeChar( '\t'); 
    dout.writeUTF(this.name); 
    dout.writeChar( '\n'); 
    dout.close(); 

    // 显示数据 
    public static void display(String fname)throws Exception{ 
    FileInputStream fi = new FileInputStream(fname); 
    DataInputStream dfi = new DataInputStream(fi); 
    int i = dfi.readInt(); 
    while(i!=-1){ 
    System.out.print(dfi.readChar());
    System.out.print(dfi.readUTF());
    System.out.print(dfi.readChar());
    try{
    i = dfi.readInt();
    }catch(Exception e){
    break;
    }

    dfi.close(); 
    } }
      

  4.   

    开始没仔细看不好意思你写的这个有问题啊read一次之后,游标就移动一次。
    i = dfi.readInt();执行之后也会移动游标啊。应该放在第二个while外面吧,或者使用i = (int) ch;还有就是外层while循环的判断(i!=-1)。当读到zhengyuan\n之后,最后的ch是\n,而i呢?i = dfi.readInt();如果在第二个while里面,就执行不了了。
    而如果放在第二个while外面,i = dfi.readInt();就会异常。
    i!=-1是干什么用的
      

  5.   

    楼上的老大可以解释一下上面的 这段 代码吗?
    while(i!=-1){  
      System.out.print(dfi.readChar()); 
      System.out.print(dfi.readUTF()); 
      System.out.print(dfi.readChar()); 
      try{ 
        i = dfi.readInt(); 
      }catch(Exception e){ 
        break; 
      } 
    }  
      

  6.   

    你应该先用i = dfi.readInt()来读
    然后判断i是不是-1,然后再(char)i转换过去啊
      

  7.   

    对于readChar抛出EOFException异常,Java Doc中的解释是:
    "EOFException if this input stream reaches the end before reading two bytes"现结合楼主的程序分析一下抛出EOFException异常的原因:
    1. int i = dfi.readInt();
    2. while (i != -1) {
    3. System.out.println("i=" + i);
    4. char ch;
    5.     while ((ch = dfi.readChar()) != '\n') { // 这句话报出异常
    6.         System.out.println(ch);
    7.         i = dfi.readInt();
    8.     }
    9. }
    第一行readInt()是读取四个字节整数,也就是在save中写入的整数:
    dout.writeInt(this.number);
    所以有第三行的输出:i=1
    第五行的readChar()是读取两个字节,对应save中写入的char型数据:
    dout.writeChar('\t');
    所以有第六行的输出:'\t'
    接着第七行的readInt()又读取四个字节,也就是对应在save中写入的字符串:
    dout.writeChars(this.name); // "dawei"
    "dawei"的前两个字符'd','a'(一个char占两个字节)
    然后再进入第五行循环,readChar()读取两个字节,对应的是"dawei"中的'w'字符,
    所以有第六行的输出:'w'
    接着第七行的readInt()又读取四个字节,对应的是"dawei"中的'e','i'两个字符(虽然不是整数,但是把这四个字节转换
    成整数进行输出,加个打印语句就可以看到结果)
    再进入第五行循环,readChar()读取两个字节,刚好是save中写入的'\n'
    dout.writeChar('\n');
    因此程序跳到第二行循环,测试的i显然不是-1(是前面读取的'e','i'四个字节转换得到的整数,也就是接下来第三行的输出:i=6619241)
    接着程序运行到第五行,显然此时输入流已经到达文件尾,当再调用readChar()的时候自然会
    抛出java.io.EOFException异常,也就是这句话描述的意思:
    "EOFException if this input stream reaches the end before reading two bytes"
      

  8.   

    在 进行对象 序列化的时候 , 如果保存了多个 对象 ,如: 多 Stu 对象在 一个 txt 文本中,那么使用 
    writeObject() 方法读取的时候,只会读取 一个 Stu 对象 ,有没有 方法 显示所有的 Stu 对象??????