2014-12-26 61 views
0

今天,我讀了在Java教程中的基本I/O和I發現一些問題:使用的FileReader讀取文件

public class CopyCharacters { 
    public static void main(String[] args) throws IOException { 
     FileReader inputStream = null; 
     FileWriter outputStream = null; 
     try { 
      inputStream = new FileReader("/workspaces/test/a.txt"); 
      outputStream = new FileWriter("/workspaces/test/b.txt"); 
      int c; 
      while ((c = inputStream.read()) != -1) { 
       outputStream.write(c); 
      } 
     } finally { 
      if (inputStream != null) { 
       inputStream.close(); 
      } 
      if (outputStream != null) { 
       outputStream.close(); 
      } 
     } 
    } 
} 

但是當我運行演示,它失敗了。在控制檯中:

Exception in thread "main" java.io.FileNotFoundException: /workspaces/test/b.txt (Access is denied) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:110) 
    at java.io.FileWriter.<init>(FileWriter.java:63) 
    at Demo.CopyCharacters.main(CopyCharacters.java:13) 

我該怎麼做?

回答

1

文件可能有一個鎖,並禁止您打開它進行寫入(例如,您的應用程序仍然處於調試模式的中斷點,並且您忘記停止它,或者您已殺死該應用程序,並且該進程仍在內存中運行) 。你可以這樣做檢查:

 inputStream = new FileReader("/workspaces/test/a.txt"); 
     File outFile = new File("/workspaces/test/b.txt"); 
     if (!outFile.canWrite()) { 
      System.err.println("Cannot write into file: " + outFile.getAbsolutePath()); 
     } 
     outputStream = new FileWriter(outFile); 

您也可以renname其他東西你出的文件「b.txt」,它會像以前一樣正常工作(直到你再次鎖定它意外)。另一種方法是使用臨時文件:

public static void main(String[] args) throws Exception { 
    FileReader inputStream = null; 
    FileWriter outputStream = null; 
    try { 
     inputStream = new FileReader("/workspaces/test/a.txt"); 
     File file = File.createTempFile("test", null); 
     outputStream = new FileWriter(file); 
     System.out.println(file.getAbsolutePath()); 
     int c; 
     while ((c = inputStream.read()) != -1) { 
      outputStream.write(c); 
     } 
    } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
     if (outputStream != null) { 
      outputStream.close(); 
     } 
    } 

} 

適合編碼(和調試)。它確保它在被操作系統刪除之後。

+0

非常感謝你 – thinkinjava

+0

幸福它幫助:) – Apokai

0

也許你應該嘗試使用一個新的功能,通過將它們放入try-catch塊來自動處理您的資源?

public static void main(String[] args) throws IOException { 
    try (
      FileReader inputStream = new FileReader("/workspaces/test/a.txt"); 
      FileWriter outputStream = new FileWriter("/workspaces/test/b.txt"); 
     ) 
     { 
     int c; 
     while ((c = inputStream.read()) != -1) { 
      outputStream.write(c); 
     } 
    } 
} 

如果以這種方式編寫代碼,你不需要finally塊,因爲Java將是try塊括號內的資源服務。

+0

這是很好的建議,但不回答這個問題。 – VGR

+0

好吧,問題是釋放資源,以便它們可以重複使用。這是一個很好,乾淨的做法。 – Ubica

相關問題