Как уже отмечали другие, вам может быть лучше использовать временный файл, если есть малейший риск того, что ваша программа потерпит крах в середине пути:
public static void removeNthLine(String f, int toRemove) throws IOException {
File tmp = File.createTempFile("tmp", "");
BufferedReader br = new BufferedReader(new FileReader(f));
BufferedWriter bw = new BufferedWriter(new FileWriter(tmp));
for (int i = 0; i < toRemove; i++)
bw.write(String.format("%s%n", br.readLine()));
br.readLine();
String l;
while (null != (l = br.readLine()))
bw.write(String.format("%s%n", l));
br.close();
bw.close();
File oldFile = new File(f);
if (oldFile.delete())
tmp.renameTo(oldFile);
}
(Остерегайтесь небрежного обращения с кодировками, новыестроковые символы и обработка исключений.)
Однако я не люблю отвечать на вопросы с помощью ". Я не скажу вам, как, потому что вы все равно не должны этого делать. ».(В некоторых других ситуациях, например, вы можете работать с файлом, который больше, чем половина вашего жесткого диска!) Итак, вот что:
Вместо этого вам нужно использовать RandomAccessFile
.Используя этот класс, вы можете читать и записывать в файл, используя один и тот же объект:
public static void removeNthLine(String f, int toRemove) throws IOException {
RandomAccessFile raf = new RandomAccessFile(f, "rw");
// Leave the n first lines unchanged.
for (int i = 0; i < toRemove; i++)
raf.readLine();
// Shift remaining lines upwards.
long writePos = raf.getFilePointer();
raf.readLine();
long readPos = raf.getFilePointer();
byte[] buf = new byte[1024];
int n;
while (-1 != (n = raf.read(buf))) {
raf.seek(writePos);
raf.write(buf, 0, n);
readPos += n;
writePos += n;
raf.seek(readPos);
}
raf.setLength(writePos);
raf.close();
}