如何通过java从文件中删除数据?

如何通过java从文件中删除数据?,java,java-io,Java,Java Io,我想用java读一个文件。然后,我想在不重新写入文件的情况下删除该文件中的一行 我该怎么做 有人建议我在RandomAccessFile的帮助下读取/写入文件,而不必重新写入文件 具体来说,该文件包含行。一行包含三个字段-id、name和profession-用\t分隔。我想通过读取器、InputStream或任何其他方式读取该文件,然后搜索具有指定关键字(比如121)的行,然后想删除整行 此操作需要在不重新写入整个文件的情况下执行我认为在不写入文件系统(包括删除一行)的情况下,无法以任何方式更

我想用java读一个文件。然后,我想在不重新写入文件的情况下删除该文件中的一行

我该怎么做

有人建议我在RandomAccessFile的帮助下读取/写入文件,而不必重新写入文件

具体来说,该文件包含行。一行包含三个字段-id、name和profession-用\t分隔。我想通过读取器、InputStream或任何其他方式读取该文件,然后搜索具有指定关键字(比如121)的行,然后想删除整行


此操作需要在不重新写入整个文件的情况下执行

我认为在不写入文件系统(包括删除一行)的情况下,无法以任何方式更改文件系统上的文件

您的意思是希望在不改变文件元数据的情况下编写文件,就像上次修改时一样


根据您的最新问题:

我认为你不能做你在这里要求做的事。写入文件后,无法从文件中删除字节,请注意,中没有deleteByte或removeByte方法

我建议将文件内容移动到一个数据库中,这样就可以进行这种面向记录的操作


另一种选择是,您必须重写该文件。对不起

我认为在不写入文件系统的情况下,您无法以任何方式更改文件系统上的文件,包括删除一行

您的意思是希望在不改变文件元数据的情况下编写文件,就像上次修改时一样


根据您的最新问题:

我认为你不能做你在这里要求做的事。写入文件后,无法从文件中删除字节,请注意,中没有deleteByte或removeByte方法

我建议将文件内容移动到一个数据库中,这样就可以进行这种面向记录的操作

另一种选择是,您必须重写该文件。对不起

“行”是一个抽象概念——它们只是以“\n”结尾的任意字节序列
BufferedWriter
及其同类不支持以这种方式进行文本编辑,因此您必须重写整个文件

一般来说,您要做的是:

  • 打开阅读器
  • 将内容读入适当的数据结构
  • 关闭阅读器
  • 更改此数据结构中需要更改的数据/记录
  • 使用
    append==false打开
    FileWriter
  • 将数据结构的内容写入结果文件
  • 关闭
    FileWriter
    • “行”是一个抽象概念——它们只是以“\n”结尾的任意字节序列
      BufferedWriter
      及其同类不支持以这种方式进行文本编辑,因此您必须重写整个文件

      一般来说,您要做的是:

      • 打开阅读器
      • 将内容读入适当的数据结构
      • 关闭阅读器
      • 更改此数据结构中需要更改的数据/记录
      • 使用
        append==false打开
        FileWriter
      • 将数据结构的内容写入结果文件
      • 关闭
        FileWriter

      在行中添加一个标记,说明行是否被删除:这将使软件删除而不是硬件删除


      如果必须插入新行,则可以重用标记为已删除的行。

      在行中添加一个标记,说明行是否已删除:这将使软件删除而不是硬件删除


      如果必须插入新行,则可以重用标记为已删除的行。

      下面的代码搜索单个文本文件中的行或字段,逐行读取文件 然后,行或字段可以替换为“”或任何其他字符串。这里我们使用模式和匹配器类

      如果这不能解决你的问题,请告诉我

      导入java.io。; 导入java.util.regex。; 导入java.util.Properties; 公共类删除线 {

      公共静态void main(字符串[]args) { BufferedReader br=null; 尝试 { 字符串行=null; 文件f=新文件(“d:/xyz.txt”)

      ); br=新的BufferedReader(新的文件读取器(“d:/giri/scjp/”)

      } br=新的BufferedReader(新的文件读取器(“d:/xyz.txt”); 字符串行=null

      }

      }


      }下面的代码搜索单个文本文件中的一行或多行字段,逐行读取文件 然后,行或字段可以替换为“”或任何其他字符串

      如果这不能解决你的问题,请告诉我

      导入java.io。; 导入java.util.regex。; 导入java.util.Properties; 公共类删除线 {

      公共静态void main(字符串[]args) { BufferedReader br=null; 尝试 { 字符串行=null; 文件f=新文件(“d:/xyz.txt”)

      ); br=新的BufferedReader(新的文件读取器(“d:/giri/scjp/”)

      } br=新的BufferedReader(新的文件读取器(“d:/xyz.txt”); 字符串行=null

      }

      }


      <代码> < RealAccess文件> /Case>不允许在文件流中间插入字节;它只是重写字节。这就是为什么它不需要重写文件。如果要在文件中间插入或删除文件,则需要将其他所有东西移到空间中。如果删除第一行,则意味着YO。你正在有效地重写整个文件。还有,当你完成了你的转换时,在文件末尾不再需要的数据怎么办?好的问题。<代码> RealAccess文件不允许你在文件流中间插入字节;它只是重写字节。这就是为什么它不需要重写文件。ERT或删除文件中间的东西,你需要把其他东西移到房间里……如果你是删除了
      String replaceString=properties.getProperty("replaceAll.String");
      
                while ( (line = br.readLine()) != null )//BufferedReader contains readline method
        {
      
            Pattern p=Pattern.compile(searchString);/*here u an specify the line u want to delete */
            Matcher m=p.matcher(line);
            line=m.replaceAll(replaceString);/*here replace String u can " " so that it will be emptied */
            System.out.println(line);
          } 
            //System.out.println(line);
                 } 
      
            }
      
      catch (FileNotFoundException e)
      {
          System.out.println("File couldnt find");
      
        e.printStackTrace();
      }
      catch (IOException e)
      {
        e.printStackTrace();
      }