gpt4 book ai didi

java - 无法从文件中获取数据

转载 作者:行者123 更新时间:2023-12-01 10:05:11 25 4
gpt4 key购买 nike

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

If it saving to the file properly via my JFileChooser, does it mean that there is collation between them?

让我们看看您的 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 的东西这可能会让你的生活变得更轻松

关于java - 无法从文件中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36527748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com