2015-03-18 2 views
1

Итак, я написал простой файл резервной копии в моем java-коде, но когда я тестирую метод в своем тестовом классе и снова проверяю свою папку, я не вижу созданного файла копирования или резервной копии, хотя я получаю сообщение об успешности. Это даже правильно или я что-то упускаю?Это правильный способ резервного копирования файла с потоками и исключениями?

import java.io.*; 
import java.util.ArrayList; 
import javax.swing.*; 

public class BasicFile { 

File file1; 
JFileChooser selection; 
File file2 = new File(".", "Backup File"); 

public BasicFile() { 
    selection = new JFileChooser("."); 
} 

public void selectFile() { 
    int status = selection.showOpenDialog(null); 

    try { 
     if (status != JFileChooser.APPROVE_OPTION) { 
      throw new IOException(); 
     } 
     file1 = selection.getSelectedFile(); 

     if (!file1.exists()) { 
      throw new FileNotFoundException(); 
     } 
    } catch (FileNotFoundException e) { 
     JOptionPane.showMessageDialog(null, "File Not Found ", "Error", JOptionPane.INFORMATION_MESSAGE); 
    } catch (IOException e) { 
     System.exit(0); 
    } 
} 

public void backupFile() throws FileNotFoundException { 
    DataInputStream in = null; 
    DataOutputStream out = null; 
    try { 
     in = new DataInputStream(new FileInputStream(file1)); 
     out = new DataOutputStream(new FileOutputStream(file2)); 

     try { 
      while (true) { 
       byte data = in.readByte(); 
       out.writeByte(data); 
      } 
     } catch (EOFException e) { 
      JOptionPane.showMessageDialog(null, "File has been backed up!", 
        "Backup Complete!", JOptionPane.INFORMATION_MESSAGE); 
     } catch (IOException e) { 
      JOptionPane.showMessageDialog(null, "File Not Found ", 
        "Error", JOptionPane.INFORMATION_MESSAGE); 
     } 
    } finally { 
     try { 
      in.close(); 
      out.close(); 
     } catch (Exception e) { 
      display(e.toString(), "Error"); 
     } 
    } 

} 

boolean exists() { 
    return file1.exists(); 
} 

public String toString() { 
    return file1.getName() + "\n" + file1.getAbsolutePath() + "\n" + file1.length() + " bytes"; 
} 

ответ

0

Это правильно, но ужасно неэффективно. Вам также не нужны DataInputStream или DataOutputStream. Канонический способ скопировать поток в Java является:

int count; 
byte[] buffer = new byte[8192]; // or more if you like 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

Этот код не бросает EOFException поэтому вам нужно настроить свой код соответственно.

+0

Мой профессор сказал мне, что мне пришлось использовать классы DataInputSteam, DataOutputStream, ReadByte и WriteByte I: – beginnercoder010812

+0

В этом случае я не вижу ничего плохого в вашем коде. Странные ограничения. Файл «Backup» должен находиться в текущем каталоге, из которого вы используете этот код. Но когда вы получаете какое-либо исключение, кроме «EOFException» здесь, вы должны отображать собственное сообщение об исключении, а не ваше собственное. Например, «Файл не найден» не является правильным сообщением для 'catch (IOException)' после catch для 'EOFException.' – EJP

Смежные вопросы