簡體   English   中英

使用java從文件中刪除一行

[英]Delete a line from a file using java

我只是 Java 編程的初學者,正在嘗試編寫代碼以從 Java 文件中刪除特定行。

在這里,我使用掃描器類來讀取文件和打印器類,結合 FileWriter 來寫入臨時文件。 我想知道我在代碼中犯了什么錯誤。 沒有語法錯誤。

這里“u”是包含文本的原始文件,而“t”是文件內容被復制到的臨時文件,后來被重命名為原始文件。 在函數“int ldel 是要刪除的行的索引。假設文件是​​:

  aaa
  bbb
  ccc

現在,如果 ldel 的值作為 2 傳遞,則文件必須格式化為:

 aaa
 ccc 

我想了很多,找不到一個邏輯錯誤。 如果你找到了請告訴我。編碼如下:

void deleteline(int ldel)throws IOException
{
   Scanner dr=new Scanner(u);
   FileWriter fwd= new FileWriter(t,true);
   PrintWriter pd= new PrintWriter(fwd,true);
   int c=0;
   while(dr.hasNextLine()==true)
   {
       c++;
       if(c!=ldel)
       pd.println(dr.nextLine());
       else if(c==ldel)
       continue;

    }
    t.renameTo(u);
    u.delete();
    dr.close();
    fwd.close();
    pd.close();
}     

即使您不想輸出它,也應該調用nextLine() ,否則它會在循環的下一次迭代中進行處理。

像這樣改變循環:

while (dr.hasNextLine()) {
    c++;
    String line = dr.nextLine();
    if (c != ldel) {
        pd.println(line);
    }
}

無需使用continue

另外我認為您應該在重命名t之前刪除u文件。

[1] 您將名為“t”的文件重命名為新名稱“u”..,然后刪除名為“u”的文件。 這聽起來不對。

[2] 當您的 'if' 跳過 nextLine 語句時,您根本不消耗一行,這意味着您仍然可以獲得輸出文件中的所有行。 因此,即使當 c == ldel 時,您也需要調用 .readLine() 來擺脫它。

[3] 在各種文件系統上,重命名打開的文件不起作用。 應該在重命名之前發出關閉呼叫。

[4] 'else if (ldel==c)' 是多余的; 一個簡單的“其他”就可以了。 就此而言, continue 是多余的, continue 只是意味着在這里結束循環並返回到開始。 如果它是循環中的最后一件事,它實際上什么都不做。 這是循環中的最后一件事。 徹底擺脫它。 這不會改變您的代碼的作用,但它確實使您的代碼更易於理解。

[5] 打開文件進行讀/寫時。 您應該明確說明字符集。 FileWriter 不允許您這樣做。 不要使用那個類。 查看新的文件 API 並使用類似Files.newInputStream東西,注意您必須更改大部分代碼才能使用新的 API,這是一個可選的樣式建議。

[6] 您應該使用 try-with-resources 構造(如果您不知道這是什么,請在網上搜索“java try-with-resources”)。 這段代碼的問題在於它在發生異常時會泄漏資源。 對於一次性應用程序(例如,它運行,做一件事,然后退出)這無關緊要,但是如果您將此代碼放在更大的構造中(例如,這是網絡服務器的一部分),它最終會關閉整個虛擬機。 最好通過 try-with-resources 結構進入始終打開資源的正確做法。

盡管您的代碼不是邏輯的最佳實現,但如果您想修復您的代碼,您應該在c==ldel條件下調用nextLine()方法以忽略該行。 所以你的循環應該是這樣的:

   while(dr.hasNextLine()==true)
   {
       c++;
       if(c!=ldel)
           pd.println(dr.nextLine());
       else if(c==ldel)
       {
            dr.nextLine()
            continue;
       }


    }

暫無
暫無

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

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