用IO流删除文件中指定行数的内容

怎么用IO流删除指定行数的内容啊,真的很着急,麻烦彭于晏,吴彦祖回答一下



import java.io.*;

public class DeleteLineDemo {
    public static void deleteLines(String filePath, int[] lineNumbers) throws IOException {
        File oldFile = new File(filePath);
        File newFile = new File(filePath + ".tmp"); // 新建临时文件
        BufferedReader reader = new BufferedReader(new FileReader(oldFile));
        BufferedWriter writer = new BufferedWriter(new FileWriter(newFile));
        String line;
        int lineNumber = 0;
        while ((line = reader.readLine()) != null) {
            lineNumber++;
            if (!contains(lineNumbers, lineNumber)) { // 判断当前行是否需要保留
                writer.write(line);
                writer.newLine();
            }
        }
        reader.close();
        writer.close();
        oldFile.delete(); // 删除旧文件
        newFile.renameTo(oldFile); // 重命名临时文件为原文件名
    }

    private static boolean contains(int[] arr, int target) {
        for (int num : arr) {
            if (num == target) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) throws IOException {
        String filePath = "test.txt";
        int[] lineNumbers = {2, 4}; // 需要删除的行号
        deleteLines(filePath, lineNumbers);
    }
}

https://blog.csdn.net/weixin_74057851/article/details/129906824

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7498038
  • 这篇博客也不错, 你可以看下【大话设计模式】模式十一:装饰模式以及在IO体系中的应用
  • 除此之外, 这篇博客: IO流详解.中的 当文件内容不太大的时候,可以用下列方法一次读取完内容 【一定要会】 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • FileInputStream类的其他常用方法:
            int available()  : 返回流当中剩余的没有读到的字节数量
            long skip(long n) : 跳过几个字节不读 

    代码演示如下: 

    package com.bjpowernode.java.io;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class FileInputStreamTest04 {
        public static void main(String[] args) {
            // 创建FileInputStream对象
            FileInputStream fis =null;
            try {
                fis =new FileInputStream("chapter15/src/com/bjpowernode/java/io/UserFile");
                // 还没有读的时候文件中的总字节数量:
                // System.out.println("文件中的总字节数量:"+fis.available());   // 5
                // 读一个字节
                // int readData =fis.read();
                // 文件中还剩下可以读的字节数量是:     (文件中数据:abcde)
                // System.out.println("剩下多少字节没有读:"+fis.available());   // 4
    
                
                // int available() 这个方法可以怎么用呢?
                // : 当文件中的数据不太大的时候可以直接把总字节数量放入一个数组里面一次读取完(注意:当文件过大时不能直接放到数组当中:扩容问题影响效率)
                byte[] bytes =new byte[fis.available()];    // 直接把文件中的总字节数量放到数组里面
                // 不需要循环了
                // 直接一次读就行了
                int readData1 =fis.read(bytes);    // 读到数组里面 读到的是字节数量
                System.out.println(readData1);  // 5
                System.out.println(new String(bytes));  //abcde  直接把数组转换成字符串
    
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fis != null) {
                    // 关闭流
                    try {
                        fis.close();
                        System.out.println("流关闭成功~");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
  • 您还可以看一下 咕泡合作p5老师的一站式学习网络编程 课程中的 什么是IO流以及IO流的作用小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案:

    为了删除文件中的特定行,我们可以使用Java的IO流中的BufferedReader和BufferedWriter。

    首先,我们需要创建一个新文件,并将原始文件的内容按行读取到缓冲区中。在读取每行时,我们需要检查该行是否等于我们要删除的行。如果不是该行,则将其写入新文件中。

    以下是具体的步骤:

    1. 创建新文件,使用BufferedReader读取原始文件
    File inputFile = new File("originalFile.txt");
    File outputFile = new File("newFile.txt");
    
    BufferedReader reader = new BufferedReader(new FileReader(inputFile));
    BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));
    
    1. 读取每一行并检查是否需要删除行
    String line;
    int lineNumber = 1; // 初始化行数
    
    while ((line = reader.readLine()) != null) {
        if (!line.equals("line to delete")) { // 检查该行是否需要删除
            writer.write(line);
            writer.newLine();
        }
        lineNumber++; // 增加行数
    }
    
    1. 关闭IO流
    reader.close();
    writer.close();
    

    完整代码如下:

    import java.io.*;
    
    public class DeleteFileLine {
        public static void main(String[] args) throws IOException {
            File inputFile = new File("originalFile.txt");
            File outputFile = new File("newFile.txt");
    
            BufferedReader reader = new BufferedReader(new FileReader(inputFile));
            BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));
    
            String line;
            int lineNumber = 1;
    
            while ((line = reader.readLine()) != null) {
                if (lineNumber != 2) { // 删除第二行
                    writer.write(line);
                    writer.newLine();
                }
                lineNumber++;
            }
    
            reader.close();
            writer.close();
        }
    }
    

    上述代码会读取originalFile.txt文件内容并逐行写入到newFile.txt文件中。如果需要删除某些行,请根据需要调整代码。