Java 저장 기능은 작동하지 않습니다
-
12-09-2019 - |
문제
이봐, 나는이 코드를 저장해야 할 코드가있다 java.util.Vector
사용자 정의 직렬화 가능한 클래스 :
if(filename.equals("")){
javax.swing.JFileChooser fc = new javax.swing.JFileChooser();
if(fc.showSaveDialog(this) == javax.swing.JFileChooser.APPROVE_OPTION){
filename = fc.getSelectedFile().toString();
}
}
try{
java.io.FileOutputStream fos = new java.io.FileOutputStream(filename);
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos);
oos.writeObject((Object)tl.entities);
baos.writeTo(fos);
oos.close();
fos.close();
baos.close();
}catch(java.io.FileNotFoundException e){
javax.swing.JOptionPane.showMessageDialog(this, "FileNotFoundException: Could not save file: "+e.getCause()+" ("+e.getMessage()+")", "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
}catch(java.io.IOException e){
javax.swing.JOptionPane.showMessageDialog(this, "IOException: Could not save file: "+e.getCause()+" ("+e.getMessage()+")", "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
}
그러나 저장할 때는 정의 된 대화 상자 오류 중 하나가 다음과 같습니다. IOException: Could not save file: null (com.sun.java.swing.plaf.windows.WindowsFileChooserUI)
그리고 있습니다 NullPointerException
명령 줄에서 javax.swing.plaf.basic.BasicListUI.convertModelToRow(BasicListUI.java:1251)
해결책 5
오류를 발견했습니다. 저장 대화 스크립트 자체가 완벽하게 작동했지만 벡터의 클래스에는 널 포인터가있어 오류가 발생했습니다.
그러나 모든 답장에 감사드립니다. 나는 그들 중 일부를 사용할 수 있습니다 :)
다른 팁
아마도 당신은 파일 이름을 더 잘 확인할 수 있습니다 :
if (filename == null || "".equals(filename)){
javax.swing.JFileChooser fc = new javax.swing.JFileChooser();
if(fc.showSaveDialog(this) == javax.swing.JFileChooser.APPROVE_OPTION){
filename = fc.getSelectedFile().toString();
}
if (filename == null || "".equals(filename)) {
// Display a message or anything else
return;
}
}
try {
...
}
예외 메시지가 명확하지 않기 때문에 문제가 무엇인지 정확히 모르겠습니다. 그러나 귀하의 코드에 대해 두 가지 언급이 있습니다.
- 파일 이름 (또는 파일)의 널 확인은 괜찮습니다 (제안대로 Romaintaz)
- 파일을 파일 이름으로 변경하는 이유는 무엇입니까? 파일 객체를 유지하고 스트림으로 전달하십시오.
코드에는 몇 가지 문제가 있습니다.
- 파일 이름을 조건부로 설정했습니다. 설정하지 않으면 여전히 사용하려고합니다.
- BytearRayoutputStream을 닫습니다 (쓸모 없음, API 참조)
- 파일 객체를 파일 이름으로 다시 변환하는 반면 FileObject를 사용하여 스트림에 쓸 수 있습니다.
나는 이것과 같이 이것을 코딩하는 것을 제안합니다 :
while(file == null) { // force a file to be choosen
javax.swing.JFileChooser fc = new javax.swing.JFileChooser();
if(fc.showSaveDialog(this) == javax.swing.JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile()
}
else {
javax.swing.JOptionPane.showMessageDialog(this, "No file selected", "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
}
}
try{
java.io.FileOutputStream fos = new java.io.FileOutputStream(file);
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos);
oos.writeObject((Object)tl.entities);
baos.writeTo(fos);
oos.close();
fos.close();
}catch(java.io.FileNotFoundException e){
javax.swing.JOptionPane.showMessageDialog(this, "FileNotFoundException: Could not save file: "+e.getCause()+" ("+e.getMessage()+")", "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
}catch(java.io.IOException e){
javax.swing.JOptionPane.showMessageDialog(this, "IOException: Could not save file: "+e.getCause()+" ("+e.getMessage()+")", "Error", javax.swing.JOptionPane.ERROR_MESSAGE);
}
당신이 잡는 예외의 스택 흔적을 보여주지 않기 때문에 문제는 진단하기가 어렵습니다.
그리고 왜 당신은 무언가를 연속화 할 것입니다 ByteArrayOutputStream
바이트 배열을 파일에만 쓰는 것만? 어떤 이유로 메모리를 낭비해야합니까?
제휴하지 않습니다 StackOverflow