JAVA根据行号或者行内容删除txt文件中的指定行

闲来无事,看到java群里有个小伙伴问删除行的问题,了解了一下这方面的知识,顺手写一个例子留作纪念


import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class Test {


    /**
     * 根据行数删除某一指定行
     *
     * @param file             txt文件路径
     * @param lineNumber       要删除的行
     * @param retainRemoveLine 是否保留删除的行(保留:留下一个空白行,不保留:下面的行自动上移)
     */
    public static Map<String, Object> removeLineForLineNumber(String file, int lineNumber, boolean retainRemoveLine) {

        Map<String, Object> map = new HashMap<>(8);
        map.put("success", false);
        map.put("error", "");

        try {
            //获取原文件
            File oldFile = new File(file);
            if (!oldFile.isFile()) {
                map.put("error", "该文件未找到:" + file);
                return map;
            }
            
			// 判断一下文件的总行数,比较lineNumber是否合理
            if(lineNumber>Files.lines(Paths.get(file)).count()){
                map.put("error", "要删除的行超过文件总行数");
                return map;
            }

            //构造临时文件
            File newFile = new File(oldFile.getAbsolutePath() + ".tmp");
            BufferedReader br = new BufferedReader(new FileReader(file));
            PrintWriter pw = new PrintWriter(new FileWriter(newFile));
			
            String lineStr = null;//某一行的值
            int lineCount = 0;//行数
            while ((lineStr = br.readLine()) != null) {
                lineCount++;
                if (lineCount != lineNumber) {
                    pw.println(lineStr);
                    pw.flush();
                } else {
                    //保留删除行
                    if (retainRemoveLine) {
                        pw.println("");
                    }
                    pw.flush();
                }
            }

            pw.close();
            br.close();

            //删除原文件
            if (!oldFile.delete()) {
                map.put("error", "该文件删除失败:" + file);
                return map;
            }

            //重命名
            if (!newFile.renameTo(oldFile)) {
                map.put("error", "该文件重命名失败:" + file);
                return map;
            }

            map.put("success", true);
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
            map.put("error", ex.getMessage());
        } catch (IOException ex) {
            ex.printStackTrace();
            map.put("error", ex.getMessage());
        }
        return map;
    }


    /**
     * 根据行内容删除某一指定行
     *
     * @param file             txt文件路径
     * @param lineContent      要删除的行内容
     * @param retainRemoveLine 是否保留删除的行(保留:留下一个空白行,不保留:下面的行自动上移)
     */
    public static Map<String, Object> removeLineForLineContent(String file, String lineContent, boolean retainRemoveLine) {

        Map<String, Object> map = new HashMap<>(8);
        map.put("success", false);
        map.put("error", "");

        try {
            //获取原文件
            File oldFile = new File(file);
            if (!oldFile.isFile()) {
                map.put("error", "该文件未找到:" + file);
                return map;
            }

            //构造临时文件
            File newFile = new File(oldFile.getAbsolutePath() + ".tmp");
            BufferedReader br = new BufferedReader(new FileReader(file));
            PrintWriter pw = new PrintWriter(new FileWriter(newFile));

            String line = null;//某一行的值
            while ((line = br.readLine()) != null) {
                //这里我用了equals,可以根据自己的需要改成index或者其他的
                if (!line.trim().equals(lineContent)) {
                    pw.println(line);
                    pw.flush();
                } else {
                    //保留删除行
                    if (retainRemoveLine) {
                        pw.println("");
                    }
                    pw.flush();
                }
            }

            pw.close();
            br.close();

            //删除原文件
            if (!oldFile.delete()) {
                map.put("error", "该文件删除失败:" + file);
                return map;
            }

            //重命名
            if (!newFile.renameTo(oldFile)) {
                map.put("error", "该文件重命名失败:" + file);
                return map;
            }

            map.put("success", true);
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
            map.put("error", ex.getMessage());
        } catch (IOException ex) {
            ex.printStackTrace();
            map.put("error", ex.getMessage());
        }
        return map;
    }


    public static void main(String[] args) {
        System.out.println(Test.removeLineForLineNumber("d:/test.txt",3,false));
        System.out.println(Test.removeLineForLineContent("d:/test.txt", "a", true));
    }
}

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
删除文件指定的数据,可以使用Java的FileReader类和BufferedReader类。以下是一个示例代码: ```java import java.io.*; public class DeleteLineFromFile { public static void main(String[] args) { try { // 打开文件 FileInputStream fileInputStream = new FileInputStream("file.txt"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); // 创建临时文件 File tempFile = new File("temp.txt"); FileWriter fileWriter = new FileWriter(tempFile); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); // 读取文件删除指定 String lineToRemove = "这是要删除"; String line; while ((line = bufferedReader.readLine()) != null) { if (!line.trim().equals(lineToRemove)) { bufferedWriter.write(line); bufferedWriter.newLine(); } } // 关闭文件 bufferedReader.close(); bufferedWriter.close(); // 删除文件并重命名临时文件 File file = new File("file.txt"); if (file.delete()) { tempFile.renameTo(file); System.out.println("指定已从文件删除!"); } else { System.out.println("无法删除指定!"); } } catch(IOException e) { e.printStackTrace(); } } } ``` 在这个示例,我们使用了FileInputStream和BufferedReader类来读取文件的数据,并使用临时文件来保存要保留的数据。如果读取到要删除,则不写入新文件。最后,我们删除文件并重命名临时文件。请注意,这种方法只能删除一个指定。如果要删除多个,请使用列表或数组来存储要删除行号,并进相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值