2015-04-27 28 views
0
public static String findAndDeleteStudent(String qStudent) 
{ 
    String fileName = "data/Students.txt"; 
    String findNumber = qStudent; 
    File file = new File(fileName); 
    Scanner dataText = null; 
    String result=""; 

    try 
    { 
     dataText = new Scanner(file); 
     while (dataText.hasNext()) 
     { 
      String line = dataText.nextLine(); 
      if (line.contains(findNumber)) 
      { 
       //System.out.println(line); 
       //line.trim(); 
       //System.out.println(items[1]); 
       System.out.println(line); 

       result ="done"; 
      } 
     } 
    } 
    catch (NumberFormatException nfe) 
    { 
     result = "error"; 
    } 
    catch (NoSuchElementException nsf) 
    { 
     result = "error"; 
    } 
    catch (FileNotFoundException fnf) 
    { 
     result = "error"; 
    } 

    return result; 
} 

我想知道刪除的行字符串,而無需重新編寫沒有行字符串的全部文本文件(我想刪除)的最短途徑。 我可以使用上面的代碼從文件中以字符串的形式檢索該行。 但無法刪除。請幫忙。在Java中,如何刪除符合搜索條件的文本文件中的行?

+5

你不能隨機訪問文件,所以你必須做你不想做的事。的 – MarsAtomic

+0

可能重複[刪除指定行從Java文本文件?(http://stackoverflow.com/questions/5800603/delete-specific-line-from-java-text-file) – MarsAtomic

+0

感謝兄弟。我會試一試。 – VD007

回答

0

如果文件足夠小並且您是批量刪除,那麼您總是可以讀入HashMap並運行.remove(qStudent)(假設該密鑰基於qStudent)。然後,在完成所有刪除後,可以將HashMap寫出到文件中。但是,如果你只是在一個地方刪除一個,那麼是的,你必須做一些形式或(重新)寫。如果(1)每個條目具有完全相同的大小,(2)該大小已知,並且(3)有確定性的方式來定位每個學生(但是不太可能),則可以對文件進行隨機訪問, 。然後,您可以使用java.io.RandomAccessFile及其seek函數跳過確切位置。對於較大的文件,如果它們已排序,則可以使用RandomAccessFile和二進制搜索來加速查找有問題的記錄。對於大文件,也可以使用內存映射。然而,最後兩個仍然需要文件(重新)寫入。

0

由於MarsAtomic建議,(和熱舔糾正),你不能從文件中刪除隨機字節。

但也有了兩個優化可能。


但有沒有必要完全重寫文件
如果您的訂單將要刪除的是橫跨半個文件,你並不需要接觸文件的前半部分。你只需要重寫文件的後半部分。


您可以逐行掃描,一旦找到該行,就可以開始複製。

但是複製時,不需要一行一行地去行,你可以通過一次傳輸大量行來更快地複製。

希望這會有所幫助。

+0

文件**可以**隨機訪問。文件甚至可以隨意修改。但是文件不能在中間添加或刪除字節,而不用重寫文件的「尾部」。 –

+0

感謝您的輸入。我已經相應地更新了答案。 –