无论newline类型如何,都可以删除Java中文件的第一行,而无需调用exec或逐行迭代

use*_*384 2 java io newline

我正在尝试用Java编写一个删除文件第一行的方法.

第一个想法(拒绝,因为调用.exec不是一个好习惯)

public void removeHeader(String fileName) throws IOException, InterruptedException {
    if (StringUtils.isBlank(fileName)) {
        throw new IllegalArgumentException("fileName was empty");
    }

    Process p = Runtime.getRuntime().exec("sed -i 1d " + fileName);

    if (p.waitFor() != 0) {
        throw new IOException("Failed to remove the header from " + fileName);
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个想法(在CR中被拒绝,因为迭代每一行并将其写入新文件是缓慢而不时尚的).

public void removeHeader(String fileName) throws IOException, InterruptedException {
    if (StringUtils.isBlank(fileName)) {
        throw new IllegalArgumentException("fileName was empty");
    }

    File inFile = new File(fileName);
    File tempFile = new File(inFile.getAbsolutePath() + ".tmp");

    BufferedReader br = null;
    PrintWriter pw = null;

    try {
        br = new BufferedReader(new FileReader(fileName));
        pw = new PrintWriter(new FileWriter(tempFile));

        String line = null;
        boolean first = true;
        while ((line = br.readLine()) != null) {
            if (!first) {
                pw.println(line);
                pw.flush();
            }

            first = false;
        } 
    }
    finally {
        pw.close();
        br.close();
    }

    if (inFile.exists() && tempFile.exists()) {
        inFile.delete();
        tempFile.renameTo(inFile);
    }
}
Run Code Online (Sandbox Code Playgroud)

无论换行格式如何,我希望我的解决方案能够正常工作并且易于阅读.有没有满足所有这些需求的解决方案?

Ken*_*ite 9

我不是Java人员,但是没有办法(Java或其他方式)从文件开头删除内容而不重写剩余内容(除非你可以访问底层文件系统来移动文件的起始块,会打败你的"易读"要求).

我在这里感觉过早优化,除非文件非常大.

  • +1:避免过早优化总是很好的建议. (3认同)