2012-11-03 81 views
4

請問爲什麼這個字符「」出現在我的輸出文件的末尾。 (我使用try/catch)用java複製文件

 File f1 = new File("C:/Users/NetBeansProjects/QuestionOne/input.txt"); 
     File f2 = new File("C:/Users/NetBeansProjects/QuestionOne/output.txt"); 
     fin = new FileInputStream(f1); 
     fout = new FileOutputStream(f2); 

     do { 
      i = fin.read(); 
      fout.write(i); 

     } while (i != -1); 

該代碼複製文件內容,但它以這個奇怪的字符結束它。 我是否必須包含整個代碼?

謝謝。

+1

爲什麼重新發明輪子? Apache Commons IO有一個功能。 –

回答

13

方法fin.read()在沒有剩下可讀的情況下返回-1;但是你實際上將-1寫入到fout,即使它不在fin中發生。它顯示爲ÿ字符。

一寫你的循環,以避免這個問題的方法是

while((i = fin.read()) != -1){ 
     fout.write(i); 
    } 
+2

+1另外考慮使用'BufferedInputStream'和'BufferedOutputStream'來獲得更好的性能。 –

+0

謝謝,它工作+使用緩衝... – InspiringProgramming

5

因爲最後的fin.read()不會讀取任何內容。根據JavaDoc它將返回-1,因爲你的fout.write(i)會寫出-1。你會做這樣的事情,爲了解決這一問題:

do { 
    i = fin.read(); 
    if (i>-1) //note the extra line 
    fout.write(i); 
} while (i != -1); 

或改變do .. whilewhile .. do電話。

我建議你也應該看看新的NIO API,這種API在一次傳輸一個字符時性能會更好。

File sourceFile = new File("C:/Users/NetBeansProjects/QuestionOne/input.txt"); 
File destFile = new File("C:/Users/NetBeansProjects/QuestionOne/output.txt"); 

FileChannel source = null;              
FileChannel destination = null;             

try {                   
    if (!destFile.exists()) {             
     destFile.createNewFile();            
    }                   
    source = new FileInputStream(sourceFile).getChannel();      
    destination = new FileOutputStream(destFile).getChannel();     
    destination.transferFrom(source, 0, source.size());       
} catch (IOException e) {              
    System.err.println("Error while trying to transfer content");    
    //e.printStackTrace();              
} finally {                  
    try{                   
    if (source != null)               
     source.close();               
    if (destination != null)              
     destination.close();              
    }catch(IOException e){              
     System.err.println("Not able to close the channels");     
     //e.printStackTrace();             
    }                   
} 
1

,或者你可以簡單地檢查,如果(我!= -1)之前FOUT

do { 
    i = fin.read(); 
    if(i != -1) 
    fout.write(i); 
    } while (i != -1); 
5

嘗試使用新文件Java 7中引入的類別

public static void copyFile(File from, File to) throws IOException { 
    Files.copy(from.toPath(), to.toPath()); 
}