我正在尝试用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)
无论换行格式如何,我希望我的解决方案能够正常工作并且易于阅读.有没有满足所有这些需求的解决方案?
我不是Java人员,但是没有办法(Java或其他方式)从文件开头删除内容而不重写剩余内容(除非你可以访问底层文件系统来移动文件的起始块,会打败你的"易读"要求).
我在这里感觉过早优化,除非文件非常大.