Вы пытаетесь читать и писать в один и тот же файл одновременно. Хотя может быть способ заставить это работать, это будет непросто.
Я предлагаю вам прочитать из файла A и записать в файл B - и если вы хотите эффективно заменить входной файл, то вы можете сделать это с помощью последовательности ходов и удалений в конце.
Несколько других предложений:
- У вас должны быть блоки try / finally, чтобы закрыть как вход, так и выход в конце.
- Вам не нужно использовать
DataInputStream
- вы ничего не используете от него. Просто оберните входной поток напрямую.
- Я предлагаю вам явно указать кодировку для ввода и вывода, а не доверять кодировке по умолчанию. (Я желаю
FileWriter
и FileReader
принятых кодировок в их конструкторах.)
- Более надежно использовать
OutputStreamWriter
(или что-то подобное), а не PrintWriter
- в настоящее время вы не обнаружите, если что-то идет не так, когда вы пишете.
Так что-то вроде этого:
// Ideally have this as a constant somewhere.
Charset utf8 = Charset.forName("UTF-8");
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(inputFile), utf8);
try {
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outputFile), utf8);
String line;
while ((line = reader.readLine()) != null) {
if (!line.contains(name)) {
writer.write(line);
writer.newLine();
}
}
} finally {
writer.close();
}
} finally {
reader.close();
}
// Now if you want to shift files around, do it here
Жаль, что Java делает это так с блоками try / finally. Ах, за using
заявления C # ...