[英]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.