Функция сохранения Java не работает - PullRequest
0 голосов
/ 21 апреля 2009

эй, у меня есть этот код, который должен сохранить 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);
}

Но при сохранении он показывает одну из определенных диалоговых ошибок:

Ответы [ 5 ]

0 голосов
/ 21 апреля 2009

Я нашел ошибку, сам скрипт диалога сохранения работал отлично, но класс в векторе имел нулевой указатель, который вызвал ошибку.

Но спасибо за все ответы, я мог бы использовать некоторые из них:)

0 голосов
/ 21 апреля 2009

Ваша проблема трудно диагностируется, потому что вы не показываете в стеке следы исключений, которые вы перехватываете.

А зачем вам сериализовать что-то в ByteArrayOutputStream только для записи байтового массива в файл? Вам нужно по какой-то причине тратить память?

0 голосов
/ 21 апреля 2009

Я не знаю точно, в чем проблема, поскольку ваши сообщения об исключениях не настолько ясны. Но у меня есть 2 замечания по поводу вашего кода:

  1. Нулевая проверка имени файла (или файла) будет в порядке (как предложено romaintaz )
  2. Почему вы меняете имя файла? Сохраните File-Object и передайте его потоку.
0 голосов
/ 21 апреля 2009

В вашем коде есть несколько ошибок.

  • Вы задаете имя файла условно. Если вы не установите его, вы все равно попытаетесь его использовать.
  • Вы закрываете ByteArrayOutputStream (который бесполезен, см. API)
  • Вы преобразовываете файловый объект обратно в имя файла, в то время как вы можете использовать файловый объект для записи в поток

Я бы посоветовал закодировать это так:

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);
}
0 голосов
/ 21 апреля 2009

может быть, вы можете лучше проверить имя файла:

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 {
 ...
 }
...