2012-03-11 44 views
1

我試圖做的是要刪除我做 的預訂這個樣子的txt文件刪除多條線路從txtFile

08:00 
Niel Butaye 
1 

,我已經刪除了預約的代碼是一個保留:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.PrintWriter; 

public class ReservatieVerwijderen { 
    static String naamklant=""; 
    public ReservatieVerwijderen() {} 

    public void removeLineFromFile(String file, String lineToRemove) { 

    try { 

     File inFile = new File(file); 

     if (!inFile.isFile()) { 
     System.out.println("Parameter is not an existing file"); 
     return; 
     } 

     //Maak een nieuw bestand dat later het originele bestand wordt 
     File tempFile = new File(inFile.getAbsolutePath() + ".tmp"); 

     BufferedReader br = new BufferedReader(new FileReader(file)); 
     PrintWriter pw = new PrintWriter(new FileWriter(tempFile)); 

     String line = null; 

     //Lees het originele bestand en schrijf naar het tijdelijke bestand 
     //Als de lijn == de lijn die we zoeken schrijven we dit niet over 
     while ((line = br.readLine()) != null) { 

     if (!line.trim().equals(lineToRemove)) { 

      pw.println(line); 
      pw.flush(); 
     } 
     } 
     pw.close(); 
     br.close(); 

     //Verwijder het originele bestand 
     if (!inFile.delete()) { 
     System.out.println("Could not delete file"); 
     return; 
     } 

     //Hernoem het tijdelijke bestand naar het originele 
     if (!tempFile.renameTo(inFile)) 
     System.out.println("Could not rename file"); 

    } 
    catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
    } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    } 

    public static void main(String[] args) { 
    ReservatieVerwijderen util = new ReservatieVerwijderen(); 
    SimpleInOutDialog input = new SimpleInOutDialog("Reserveringen"); 
    naamklant = input.readString("Geef de volledige naam in"); 
    util.removeLineFromFile("L:\\Documents/Informatica/6de jaar/GIP/Reserveringen.txt", naamklant); 
    } 
} 

只刪除保留製造者的名字,我需要刪除保留的時間(08:00)和種類(1)太。任何幫助?

public class SimpleInOutDialog { 

    private String titel; 

    /** 
    * Constructor van een SimpleInOutDialog. 
    * 
    * @param titel een String met de titel van het venstertje. 
    */ 
    public SimpleInOutDialog(String titel) { 
     this.titel = titel; 
    } 
    /** 
    * Tonen van een tekst in een dialoogvenstertje. 
    * @param message een String met een te tonen berichtje. 
    * @param output een String met de te tonen tekst. 
    */ 
    /** 
    * 
    * @param 
    */ 


    public void showString(String message, String output) { 
     JOptionPane.showMessageDialog(
      null, 
      message + "\n\n" + output + "\n\n", 
      titel, 
      JOptionPane.PLAIN_MESSAGE); 

    } 

    /** 
    * Tonen van een geheel getal in een dialoogvenstertje. 
    * @param message een String met een te tonen berichtje. 
    * @param een int met het te tonen getal. 
    */ 
    public void showInteger(String message, int getal) { 
     JOptionPane.showMessageDialog(
      null, 
      message + "\n\n" + Integer.toString(getal) + "\n\n", 
      titel, 
      JOptionPane.PLAIN_MESSAGE); 

    } 

    /** 
    * Tonen van een geheel getal in een dialoogvenstertje. 
    * @param message een String met een te tonen berichtje. 
    * @param een double met het te tonen getal. 
    */ 
    public void showDouble(String message, double getal) { 
     JOptionPane.showMessageDialog(
      null, 
      message + "\n\n" + Double.toString(getal) + "\n\n", 
      titel, 
      JOptionPane.PLAIN_MESSAGE); 
    } 

    /** 
    * Inlezen van een String. 
    * @param message een String met de tekst die in het dialoogvenster 
    * moet getoond worden. 
    * @return de ingelezen String. Indien het venster zonder 
    * invoer wordt afgesloten is de String null. 
    */ 
    public String readString(String message) { 
     Object[] possibilities = null; 
     String s = null; 
     s = 
      (String) JOptionPane.showInputDialog(
       null, 
       message, 
       this.titel, 
       JOptionPane.PLAIN_MESSAGE, 
       null, 
       possibilities, 
       ""); 

     if ((s == null) || (s.length() == 0)) { 
      s = null; 
     } 
     return s; 
    } 

    /** 
    * Inlezen van een geheel getal. 
    * @param message een String met de tekst die in het dialoogvenster 
    * moet getoond worden. 
    * @return het ingelezen geheel getal (een int). Indien het venster zonder 
    * correcte invoer wordt afgesloten is het getal 0 (nul). 
    */ 
    public int readInteger(String message) { 
     boolean isAnInteger = false; 
     String tekst = null; 
     int gelezen = 0; 
     while (!isAnInteger) { 
      tekst = readString(message); 
      if (tekst != null) { 
       try { 
        gelezen = Integer.parseInt(tekst); 
        isAnInteger = true; 
       } catch (NumberFormatException nfe) { 
        isAnInteger = false; 
       } 
      } else { 
       isAnInteger = true; 
       gelezen = 0; 
      } 
     } 
     return gelezen; 
    } 

    /** 
    * Inlezen van een kommagetal. 
    * @param message een String met de tekst die in het dialoogvenster 
    * moet getoond worden. 
    * @return het ingelezen getal (een double). Indien het venster zonder 
    * correcte invoer wordt afgesloten is het getal 0.0 (nul). 
    */ 
    public double readDouble(String message) { 
     boolean isADouble = false; 
     String tekst = null; 
     double gelezen = 0.0; 
     while (!isADouble) { 
      tekst = readString(message); 
      if (tekst != null) { 
       try { 
        gelezen = Double.parseDouble(tekst); 
        isADouble = true; 
       } catch (NumberFormatException nfe) { 
        isADouble = false; 
       } 
      } else { 
       isADouble = true; 
       gelezen = 0.0; 
      } 
     } 
     return gelezen; 
    } 

    /** 
    * Wanneer je in je programma geen uitvoer meer nodig hebt 
    * MOET je deze bewerking op het SimpleInOutDialog-object uitvoeren. 
    * Het programma wordt dan beëindigd. 
    */ 
    public void stop() { 
     System.exit(0); 
    } 

} 
+0

@deporter已更新它。 – PauloPawelo 2012-03-11 09:52:46

回答

1

你得到更清潔的代碼,如果你認爲在完全保留,而不是各行:

void deleteReservations(String reservationName, BufferedReader input, 
     PrintWriter output) throws IOException { 
    String date; 
    while ((date = input.readLine()) != null) { 
     String name = input.readLine(); 
     String tickets = input.readLine(); 

     // You can check any part of a reservation here 
     // to figure out wether to keep or delete it. 
     if (!name.equals(reservationName)) { 
     output.println(date); 
     output.println(name); 
     output.println(tickets); 
     } 
    } 
    } 

這將體現在沒有關注的三線塊格式的文件顯然失敗了,但隨後無論如何,文件仍然被打破。基於謝爾蓋·布倫納的回答

樣品輸入:

08:00 
Niel Butaye 
1 
09:00 
dean koontz 
2 
10:00 
stephen king 
3 
命名爲 dean koontz輸出

08:00 
Niel Butaye 
1 
10:00 
stephen king 
3 
0

如果可能的話,當你爲它創建一個文件,我建議把像$$標記開始和你保留刪除或排序標籤爲它的結束。如果文件中保留的位置相同,則始終可以遍歷文件並檢查需要刪除的行。

您已將http://www.javadb.com/remove-a-line-from-a-text-file的代碼取出,該代碼需要字符串作爲要刪除的參數。所以你必須事先知道哪一條確切的線必須被刪除。

編輯:

輸入文件

08:00 
Niel Butaye 
1 
09:00 
dean koontz 
1 
10:00 
stephen king 
1 

public static int findLineToDelete(String file, String lineToRemove) { 
    int lineFound=0; 
    try { 

     File inFile = new File(file); 

     if (!inFile.isFile()) { 
     System.out.println("Parameter is not an existing file"); 
     return -1; 
     } 

     BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line = null; 

     //Lees het originele bestand en schrijf naar het tijdelijke bestand 
     //Als de lijn == de lijn die we zoeken schrijven we dit niet over 
     int i=0; 
     while ((line = br.readLine()) != null) { 
     i++; 
     if (line.trim().equals(lineToRemove)) { 
      System.out.println(i); 
      lineFound=i;   
     } 
     } 

     br.close(); 

    } 
    catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
    } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

    return lineFound; 
    } 

public static void removeNthLine(String f, int toRemove) throws IOException { 

    File tmp = File.createTempFile("tmp", ""); 

    BufferedReader br = new BufferedReader(new FileReader(f)); 
    BufferedWriter bw = new BufferedWriter(new FileWriter(tmp)); 
    int i=0; 
    String l=null; 
     System.out.println("toRemmove"+toRemove); 
    while (null != (l = br.readLine())){ 
     i++; 
     if(i!=toRemove-1&&i!=toRemove&&i!=toRemove+1){ 
      System.out.println(l); 
      bw.write(String.format("%s%n", l)); 
     } 
    } 

    br.close(); 
    bw.close(); 

    File oldFile = new File(f); 
    if (oldFile.delete()) 
     tmp.renameTo(oldFile); 

    } 
    public static void main(String[] args) { 


    int found = findLineToDelete("a.txt", "dean koontz"); 
    System.out.println(found); 
    try{ 
    removeNthLine("a.txt",found); 
    }catch(Exception e){e.printStackTrace();} 

    } 

希望它可以幫助升技。

+0

如果我在開始和結束時放入$$,他不會找到我要找的文件,因爲文件中有多個保留,然後它們全部被刪除,對吧?有沒有辦法說當他找到我正在尋找的字符串時,不要複製臨時文件前後的行? – PauloPawelo 2012-03-11 10:04:09

+0

如果你有三行預留你遍歷文件獲取行的數量,並刪除一個之後索引+1和該行之前與所需行的索引-1。我假設你有一個在兩者之間進行預約的人的姓名。這是一個刪除第N行的示例http://stackoverflow.com/questions/6477762/java-delete-line-from-text-file-by-overwriting-while-reading-it – 2012-03-11 10:07:58

+0

是的,名字介於兩者之間,所以我需要稍微改變班級,所以它讀取文件,如果他找到我正在尋找的線路,他需要獲得該號碼,所以我可以確定前後的號碼。然後他將所有內容都複製到除這些行之外的新文件中?你知道如何在我的代碼中得到這個嗎? – PauloPawelo 2012-03-11 10:12:13

1

儘管將文本文件中的預留實體存儲起來並不是一種很好且安全的方式,但我已經調試了與操作文本文件相關的代碼。在你的removeLineFromFile()方法改變你的while循環到下面的代碼,它會完成。

boolean go = true; 
while (go) 
{ 
    String temp = ""; 
    for (int i = 0; i < 3; i++) 
    { 
     line = br.readLine(); 
     if (line != null) 
      temp += line + "\n"; 
     else 
      go = false; 
    } 

    if (!temp.trim().contains(lineToRemove)) 
    { 
     pw.print(temp); 
     pw.flush(); 
    } 
} 
+0

發生了錯誤,他表示無法刪除文件 – PauloPawelo 2012-03-11 10:50:15

+0

是否已放入\t \t \t pw.close(); \t \t \t br.close(); while循環之後? – Juvanis 2012-03-11 10:50:58

+0

現在做到了,它完美無缺!非常感謝你!你剛剛度過我的週末! – PauloPawelo 2012-03-11 10:53:42

-1

下面的例子可以很容易地刪除文本文件中多行。

輸入文件名。

輸入首行代碼:

輸入no。行,你想刪除。

查看下面的評論內容!

import java.io.BufferedReader; 

import java.io.File; 

import java.io.FileReader; 

import java.io.FileWriter; 


public class RemoveLines 



{ 
public static void main(String[] args) 
{ 

    //Enter name of the file here 
    String filename="foobar.txt"; 

    //Enter starting line here 

    int startline=1; 

    //Enter number of lines here. 
    int numlines=2; 

    RemoveLines now=new RemoveLines(); 
    now.delete(filename,startline,numlines); 
} 
void delete(String filename, int startline, int numlines) 
{ 
    try 
    { 
     BufferedReader br=new BufferedReader(new FileReader(filename)); 

     //String buffer to store contents of the file 
     StringBuffer sb=new StringBuffer(""); 

     //Keep track of the line number 
     int linenumber=1; 
     String line; 

     while((line=br.readLine())!=null) 
     { 
      //Store each valid line in the string buffer 
      if(linenumber<startline||linenumber>=startline+numlines) 
       sb.append(line+"\n"); 
      linenumber++; 
     } 
     if(startline+numlines>linenumber) 
      System.out.println("End of file reached."); 
     br.close(); 

     FileWriter fw=new FileWriter(new File(filename)); 
     //Write entire string buffer into the file 
     fw.write(sb.toString()); 
     fw.close(); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Something went horribly wrong: "+e.getMessage()); 
    } 
} 
+0

添加一些解釋。你改變了什麼?首先OP是什麼錯誤? – Peanut 2017-08-22 12:08:39