簡體   English   中英

刪除和重命名文件 java

[英]Deleting and Renaming file java

我正在嘗試刪除和重命名文件,但是 delete() 和 rename() function 不起作用。 我似乎無法在代碼中找到錯誤,因為它應該按邏輯正確運行(我認為)。 誰能告訴我為什么它不能刪除填充。 此代碼有效,除了刪除舊 txt 並將 temp.txt 重命名為舊文件。

public Boolean deleteItem(String item){
    try{
        // creating and opening file
        File f = new File("temp.txt");
        f.delete(); // to delete existing data inside file;
        File old = new File(file);
        FileWriter writer = new FileWriter(new File("temp.txt"), true);

        FileReader fr = new FileReader(old);
        BufferedReader reader = new BufferedReader(fr);
        String s;

        // creating temporary item object
        String[] strArr;

        //searching for data inside the file
        while ((s = reader.readLine()) != null){
            strArr = s.split("\\'");                
            if (!strArr[0].equals(item)){
                writer.append(s + System.getProperty("line.separator"));
            }
        }

        //rename old file to file.txt

        old.delete();
        boolean successful = f.renameTo(new File(file));
        writer.flush();
        writer.close();
        fr.close();
        reader.close();

        return successful;
    }
    catch(Exception e){ e.printStackTrace();}
    return false;
}

邏輯似乎有點混亂。 這就是我認為的樣子。

你刪除 file.txt
您創建一個新的 file.txt 並將“文件”復制到其中
你刪除'文件'
您將 file.txt 重命名為“文件”
您關閉輸入和 output 文件

我的猜測是您的操作系統(未指定)正在阻止刪除和重命名打開的文件。 將關閉移動到刪除/重命名之前。 並檢查這些函數的返回。

另外:作為可讀性的一個小改進,您不需要繼續使用相同的 xxx 調用“new File(xxx)”。 文件只是文件名的表示。 做一次。 並且 'File tempFile = new File("file.txt")' 比將其稱為 'f' 更容易理解。

不要使用舊的java.io.File 它因其松散的錯誤處理和無用的錯誤消息而臭名昭著。 使用“較新”的 NIO.2 java.nio.file.Pathjava.nio.file.Files方法在 ZD52387880E1EA22817A72D375Z213 中添加

例如,如果文件未被刪除, file.delete()方法將返回false 不會拋出異常,所以你永遠不會知道為什么,而且由於你甚至不檢查返回值,你也不知道它也沒有刪除文件。

該文件沒有被刪除,因為您仍然打開它。 在嘗試刪除+重命名之前關閉文件,並使用try-with-resources執行此操作,也在Java 7 中添加

您的代碼應如下所示,通過捕獲異常並將它們轉換為boolean返回值容易出錯(請參閱file.delete()的問題)。

public boolean deleteItem(String item){
    try {
        // creating and opening file
        Path tempFile = Paths.get("temp.txt");
        Files.deleteIfExists(tempFile); // Throws exception if delete failed

        Path oldFile = Paths.get(file);
        try ( BufferedWriter writer = Files.newBufferedWriter(tempFile);
              BufferedReader reader = Files.newBufferedReader(oldFile); ) {

            //searching for data inside the file
            for (String line; (line = reader.readLine()) != null; ) {
                String[] strArr = line.split("\\'");
                if (! strArr[0].equals(item)){
                    writer.append(line + System.lineSeparator());
                }
            }

        } // Files are flushed and closed here

        // replace file with temp file
        Files.delete(oldFile); // Throws exception if delete failed
        Files.move(tempFile, oldFile); // Throws exception if rename failed

        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

基本上,您想從文本文件中刪除選定的行。
以下代碼使用stream API 1 它過濾掉所有不需要的行並將您想要的行寫入臨時文件。 然后它將臨時文件重命名為原始文件,從而有效地從原始文件中刪除不需要的行。 請注意,我假設您的“全局”變量file是一個字符串。

/* Following imports required.
import java.io.File
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
*/
Path path = Paths.get(file);
final PrintWriter[] pws = new PrintWriter[1];
try {
    File tempFile = File.createTempFile("temp", ".txt");
    tempFile.deleteOnExit();
    pws[0] = new PrintWriter(tempFile);
    Files.lines(path)
         .filter(l -> !item.equals(l.split("'")[0]))
         .forEach(l -> pws[0].println(l));
    pws[0].flush();
    pws[0].close();
    Files.move(tempFile.toPath(), path, StandardCopyOption.REPLACE_EXISTING);
}
catch (IOException xIo) {
    xIo.printStackTrace();
}
finally {
    if (pws[0] != null) {
        pws[0].close();
    }
}

1 Stream API 引入 Java 8

暫無
暫無

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

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