使用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)

最佳答案

您的“核心”问题很可能在这里...

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的方法,这可能会使您的生活变得轻松很多

09-10 07:25
查看更多