Java 从TXT文件中删除多行

Java 从TXT文件中删除多行,java,bufferedreader,printwriter,temporary-files,Java,Bufferedreader,Printwriter,Temporary Files,我想做的是删除我的预订 保留在txt文件中看起来像这样 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.P

我想做的是删除我的预订 保留在txt文件中看起来像这样

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);
    }

}

我建议在预订的开始和结束处放置一个类似$$的标记,以便在为其创建文件时删除或排序标记(如果可能)。如果保留在文件中的位置相同,则始终可以遍历文件并检查需要删除的行

您从这里获取了需要删除字符串作为参数的代码。 因此,您必须事先知道必须删除哪条精确的线

编辑:

输入文件

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


希望对您有所帮助。

我建议您在预订的开始和结束处放置一个类似$$的标记,以便在为其创建文件时删除或排序标记(如果可能)。如果保留在文件中的位置相同,则始终可以遍历文件并检查需要删除的行

您从这里获取了需要删除字符串作为参数的代码。 因此,您必须事先知道必须删除哪条精确的线

编辑:

输入文件

08:00
Niel Butaye
1
09:00
dean koontz
1
10:00
stephen king
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();
    }
}
boolean go=true;
while(go)
{
字符串temp=“”;
对于(int i=0;i<3;i++)
{
line=br.readLine();
如果(行!=null)
温度+=行+“\n”;
其他的
go=假;
}
如果(!temp.trim()包含(lineToRemove))
{
印刷(温度);
pw.flush();
}
}

尽管像您这样将预订实体存储在文本文件中不是一种安全的好方法,但我已经调试了与操作文本文件相关的代码。在
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();
    }
}
boolean go=true;
while(go)
{
字符串temp=“”;
对于(int i=0;i<3;i++)
{
line=br.readLine();
如果(行!=null)
温度+=行+“\n”;
其他的
go=假;
}
如果(!temp.trim()包含(lineToRemove))
{
印刷(温度);
pw.flush();
}
}

如果您以完全保留的方式而不是以单独的行来思考,您会得到更清晰的代码:

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);
      }
    }
  }
对于不遵循3行块格式的文件,这显然会失败,但是,文件仍然会被破坏

基于Sergey Brenner回答的样本输入:

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

如果您以完全保留而不是单独的行进行思考,您将获得更清晰的代码:

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);
      }
    }
  }
对于不遵循3行块格式的文件,这显然会失败,但是,文件仍然会被破坏

基于Sergey Brenner回答的样本输入:

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

下面的示例可以轻松地从文本文件中删除多行

输入文件名

输入第一行编号:

输入要删除的行数

在注释下查看下面的示例

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());
    }
}
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.io.FileWriter;
公共类移除
{   
公共静态void main(字符串[]args)
{
//在此处输入文件名
字符串filename=“foobar.txt”;
//在这里输入起跑线
int=1;
//在此处输入行数。
int numlines=2;
RemoveLines now=新的RemoveLines();
立即删除(文件名、startline、numlines);
}
void delete(字符串文件名、整数行、整数行)
{
尝试
{
BufferedReader br=新的BufferedReader(新文件读取器(文件名));
//用于存储文件内容的字符串缓冲区
StringBuffer sb=新的StringBuffer(“”);
//记下电话号码
int linenumber=1;
弦线;
而((line=br.readLine())!=null)
{
//将每个有效行存储在字符串缓冲区中
if(线号=直线+多直线)
sb.追加(第+行“\n”);
linenumber++;
}
if(直线+多直线>线号)
System.out.println(“到达文件末尾”);
br.close();
FileWriter fw=新的FileWriter(新文件(文件名));
//将整个字符串缓冲区写入文件
fw.写(sb.toString());
fw.close();
}
捕获(例外e)
{
println(“发生了可怕的错误:+e.getMessage());
}
}

下面的示例可以轻松地从文本文件中删除多行

输入文件名

输入第一行编号:

输入要删除的行数

在注释下查看下面的示例

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());
    }
}
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.io.FileWriter;
公共类移除
{   
公共静态void main(字符串[]args)
{
//在此处输入文件名
字符串filename=“foobar.txt”;
//在这里输入起跑线
int=1;
//在此处输入行数。
int numlines=2;
RemoveLines now=新的RemoveLines();
立即删除(文件名、startline、numlines);
}
void delete(字符串文件名、整数行、整数行)
{
尝试
{
BufferedReader br=新的BufferedReader(新文件读取器(文件名));
//用于存储文件内容的字符串缓冲区
StringBuffer sb=新的StringBuffer(“”);
//记下电话号码
int linenumber=1;
弦线;
而((行=br.r