Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从文本文件中删除元素_Java - Fatal编程技术网

Java 从文本文件中删除元素

Java 从文本文件中删除元素,java,Java,我创建了一个名为“Month.txt”的文本文件,其中包含以下字符串:“一月-二月-三月”。 下面是我从文本文件中删除“二月”的程序: import java.io.*; import java.util.*; class Delete_element_from_txtfile { public static void main()throws IOException { FileReader fr=new FileReader("Month.txt");

我创建了一个名为“Month.txt”的文本文件,其中包含以下字符串:“一月-二月-三月”。 下面是我从文本文件中删除“二月”的程序:

import java.io.*;
import java.util.*;

class Delete_element_from_txtfile
{
    public static void main()throws IOException
    {
        FileReader fr=new FileReader("Month.txt");
        BufferedReader br=new BufferedReader(fr);

        FileWriter fw=new FileWriter("Month.txt");
        BufferedWriter bw=new BufferedWriter(fw);
        PrintWriter pw=new PrintWriter(bw);

        String str;
        String newstr="";

        while((str=br.readLine())!=null)
        {
            StringTokenizer S=new StringTokenizer(str);
            while(S.hasMoreTokens()==true)
            {
                String month=S.nextToken();
                if(month.equals("February"))
                {
                    continue;
                }
                else
                    newstr=newstr+(month+" ");
            }
        }
        pw.print(newstr);

        pw.close();
        bw.close();
        fw.close();

        br.close();
        fr.close();
    }
}

但是在运行程序之后,当我打开文件时,它是空的。我刚刚开始用java处理文件,所以我不知道发生了什么。我想在这个问题上得到一些帮助。谢谢

问题在于您正在打开同一个文件进行读写。因为您在读取后立即打开文件进行写入,因此它将覆盖当前数据

关闭文件读取器后,只需移动写入代码即可

更新代码如下:

public static void main(String []ars)throws IOException
    {
        FileReader fr=new FileReader("Month.txt");
        BufferedReader br=new BufferedReader(fr);


        String str;
        String newstr="";

        while((str=br.readLine())!=null)
        {
            StringTokenizer S=new StringTokenizer(str);
            while(S.hasMoreTokens()==true)
            {
                String month=S.nextToken();
                if(month.equals("February"))
                {
                    continue;
                }
                else
                    newstr=newstr+(month+" ");
            }
        }


        br.close();
        fr.close();

        FileWriter fw=new FileWriter("Month.txt");
        BufferedWriter bw=new BufferedWriter(fw);
        PrintWriter pw=new PrintWriter(bw);
        pw.print(newstr);

        pw.close();
        bw.close();
        fw.close();

    }

以下是一个更紧凑、外观更好的解决方案:

List<String> lines = Files.readAllLines(Paths.get("Month.txt")); //read every line
//filer out lines that contain february
lines = lines.stream().filer(line -> !line.contains("February")).collect(Collectors.toList());
Files.write(Paths.get("Month.txt"), lines, Charset.defaultCharset()); //write it back
List line=Files.readAllLines(path.get(“Month.txt”)//读每一行
//文件管理器输出包含二月的行
lines=lines.stream().filer(line->!line.contains(“二月”)).collect(Collectors.toList());
write(path.get(“Month.txt”)、line、Charset.defaultCharset()//写回

无需手动关闭文件读取流,无需使用while循环和类,如
StringTokenizer

我明白了。你能再澄清一下为什么文件会被覆盖吗?谢谢签出此问题