高分悬赏:Java语言怎么从一个txt文本文件的开始删除n行,具体的代码怎么写

高分悬赏:Java语言怎么从一个txt文本文件的开始删除n行,具体的代码怎么写

有文本文件的话,我可以帮你写一个

不一定是要删除n行,跳过也行。如果一定是删除的话,可以用list的remove();但是这样下标会改变,需要注意。

        File file = new File("");
        StringBuffer sb = new StringBuffer();
        try {
            List<String> lines = FileUtils.readLines(file);
            for (int i = 0; i < lines.size(); i++) {
                if (i < 10) { // 跳过前10行
                    continue;
                }
                sb.append(lines.get(i)); // 行内容
                sb.append(System.lineSeparator()); // 换行
            }
            FileUtils.write(new File(""), sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

这种方式可以跳过任何行,相当于删除,然后重新写入另一个文件里。

可以试试RandomAccessFile

 /**
     * @param file    文件
     * @param lineNum 删除行数
     * @throws IOException 文件操作异常
     */
    private static void removeFirstLines(File file, int lineNum) throws IOException {
        RandomAccessFile raf = null;
        raf = new RandomAccessFile(file, "rw");
        long writePosition = raf.getFilePointer();
        for (int i = 0; i < lineNum; i++) {
            String line = raf.readLine();
            if (line == null) {
               return;
            }
        }
        long readPosition = raf.getFilePointer();
        byte[] buff = new byte[1024];
        int n;
        while (-1 != (n = raf.read(buff))) {
            raf.seek(writePosition);
            raf.write(buff, 0, n);
            readPosition += n;
            writePosition += n;
            raf.seek(readPosition);
        }
        raf.setLength(writePosition);
    }

总体思路就是把文本读出来,跳过前N行,再删除文本,再新建文本,在把读出来的文本贴回去,不过这个操作过程中要注意字符编码

public static void delNline(String filePath,int n) throws IOException {
        File file = new File(filePath);
        ArrayList<String> arrayList = new ArrayList<>();
        InputStreamReader inputReader = new InputStreamReader(new FileInputStream(file),"GBK");
        BufferedReader bf = new BufferedReader(inputReader);
        String str;
        int line = 0;
        while ((str = bf.readLine()) != null) {
            if(line++<n){
                //前面n行都不要
                continue;
            }
            arrayList.add(str);
        }
        bf.close();
        inputReader.close();
        //删掉文本
        file.delete();
        //再创建文本
        file = new File(filePath);
        file.createNewFile();
        //再把读出去的数据写回去
        Writer writer = new BufferedWriter(
                new OutputStreamWriter(
                        new FileOutputStream(file,true), StandardCharsets.UTF_8));
        arrayList.forEach(sec-> {
            try {
                writer.write(sec+"\r\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        writer.flush();
        writer.close();
    }

最好不要把文件内容都都读出来,如果文件大的话,会占用太多的内存,跳过前N行,后面边读边写

几十G以下这种不算太大也不算太小的这种可以用第三方软件例如Emeditor大文本编辑器或者自己写一个IO流程序来处理,
文件太大可以考虑一些大数据平台的组件如使用kettle进行去除空行,或编写一些代码例如Spark/Flink/Mapreduce这一类的代码,效率会快一点.这一类的代码网上应该还是很好找的.