无法从文件

时间:2016-04-10 08:51:05

标签: java io file-handling randomaccessfile eofexception

使用JFileChooser保存文件,一切都很完美:

private void saveFileDialog(){

    fileChooser = new JFileChooser(System.getProperty("employees.dat"));
    disableTextField(fileChooser.getComponents());

    fileChooser.setSelectedFile(new File("employees.dat"));
    fileChooser.setDialogTitle("File to save");

    int userSelection = fileChooser.showSaveDialog(this);
    if (userSelection == JFileChooser.APPROVE_OPTION) {
        File fileToSave = fileChooser.getSelectedFile();
        save();
        System.out.println("Save as file: " + fileToSave.getAbsolutePath());
    }
}

调用方法save()

public void save(){
    RandomAccessFile file = null;
    try {
        file = new  RandomAccessFile("employees.dat", "rw");
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     try{
         for(Employee em: list){
      if(list != null){

        file.writeUTF(em.getPps());
        file.writeUTF(em.getName());
        file.writeUTF(em.getSurname());
        file.writeUTF(em.getGender());
        file.writeUTF(em.getDep());
        file.writeInt(em.getSalary());
        file.writeUTF(em.getFullTime());
             }  
         }  

       file.close();

     }catch(IOException e1){
         System.out.println("Cant save");
     }  
}

在我的电脑上打开文件,记录并保存所有数据。

问题是:我无法从文件中获取数据

这是我的getFromFile方法:

   public void getFromFile(){
    RandomAccessFile file = null;
    try {
        file = new  RandomAccessFile("employees.dat", "rw");
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try{
    while ( file.getFilePointer() < file.length() ){ 

          Employee em = new Employee();

                System.out.println("Saving");
                em.setPps(file.readUTF());
                em.setName(file.readUTF());
                em.setSurname(file.readUTF());
                em.setGender(file.readBoolean());
                em.setDep(file.readUTF());
                em.setSalary(file.readInt());
                em.setFulltime(file.readBoolean());  
                list.add( em );

    }
         file.close();
         }catch(IOException e1){
             System.out.println("Cant save");
             e1.printStackTrace();
         }  
}

我的JFileChooser来自档案:

    openItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        fileChooser = new JFileChooser(".");

        fileChooser.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            System.out.println("Action");

          }
        });

        int status = fileChooser.showOpenDialog(null);

        if (status == JFileChooser.APPROVE_OPTION) {

          File selectedFile = fileChooser.getSelectedFile();
          getFromFile();

          System.out.println(selectedFile.getParent());
          System.out.println(selectedFile.getName());
        } else if (status == JFileChooser.CANCEL_OPTION) {
          System.out.println("calceled");

        }

      }
});

控制台显示System.out.println(“Saving”);,然后显示System.out.println(“Cant save”); 。在我看来,一切都应该有效,但文件是空的,我的程序中没有任何新内容。

以下是异常:

 java.io.EOFException
        at java.io.RandomAccessFile.readFully(RandomAccessFile.java:399)
        at java.io.DataInputStream.readUTF(DataInputStream.java:592)
        at java.io.RandomAccessFile.readUTF(RandomAccessFile.java:921)

1 个答案:

答案 0 :(得分:1)

你的核心&#34;问题很可能就在这里......

System.out.println("Saving");
em.setPps(file.readUTF());
em.setPps(file.readUTF());
em.setName(file.readUTF());
em.setSurname(file.readUTF());
em.setGender(file.readBoolean());
em.setDep(file.readUTF());
em.setSalary(file.readInt());
em.setFulltime(file.readBoolean()); 

您已经两次致电setPps

此外,使用JFileChooser选择的内容与文件写入/读取的位置之间没有排序规则

如果我们快速查看读/写操作,我们可以看到双读操作

+----------------------------------+-------------------------------------+
| Write                            | Read                                |
+----------------------------------+-------------------------------------+
| file.writeUTF(em.getPps());      | em.setPps(file.readUTF());          |
+----------------------------------+-------------------------------------+
| file.writeUTF(em.getName());     | em.setPps(file.readUTF());          |
+----------------------------------+-------------------------------------+
| file.writeUTF(em.getSurname());  | em.setName(file.readUTF());         |
+----------------------------------+-------------------------------------+
| file.writeUTF(em.getGender());   | em.setSurname(file.readUTF());      |
+----------------------------------+-------------------------------------+
| file.writeUTF(em.getDep());      | em.setGender(file.readBoolean());   |
+----------------------------------+-------------------------------------+
| file.writeInt(em.getSalary());   | em.setDep(file.readUTF());          |
+----------------------------------+-------------------------------------+
| file.writeUTF(em.getFullTime()); | em.setSalary(file.readInt());       |
+----------------------------------+-------------------------------------+
|                                  | em.setFulltime(file.readBoolean()); |
+----------------------------------+-------------------------------------+

您的写作和您正在阅读的内容之间也存在差异

例如,您使用file.writeUTF(em.getGender());撰写了性别,但是您使用em.setGender(file.readBoolean());

来阅读

您应该使用file.writeBoolean(em.getGender());

  

如果它通过我的JFileChooser正确保存到文件中,是否意味着它们之间存在整理?

让我们来看看您的saveFileDialog方法

private void saveFileDialog(){

    fileChooser = new JFileChooser(System.getProperty("employees.dat"));
    disableTextField(fileChooser.getComponents());

    fileChooser.setSelectedFile(new File("employees.dat"));
    fileChooser.setDialogTitle("File to save");

    int userSelection = fileChooser.showSaveDialog(this);
    if (userSelection == JFileChooser.APPROVE_OPTION) {
        File fileToSave = fileChooser.getSelectedFile();
        save();
        System.out.println("Save as file: " + fileToSave.getAbsolutePath());
    }
}

你创建一个名为fileToSave的局部变量,它保存(我假设你想要保存文件的目录),但它只有这个方法的上下文,没有其他人可以使用

所以,你的方法应该是......

private void saveFileDialog(){
    save();
}

它基本上可以达到相同的效果

我也考虑使用类似JAXB的东西,这可能会让你的生活更轻松