簡體   English   中英

使用FileReader讀取文件

[英]Use the FileReader to read the file

今天,我閱讀了Java教程中的Basic I / O,發現了一些問題:

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)

我怎樣才能做到這一點?

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

        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);

您也可以將輸出文件重新命名為“ 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();
        }
    }

}

適用於編碼(和調試)。 這樣可以確保操作系統以后將其刪除。

也許您應該嘗試使用一項新功能,將其放入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塊括號內的資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM