Мне нужно добавить текст повторно в существующий файл в Java. Как я могу это сделать?
источник
Мне нужно добавить текст повторно в существующий файл в Java. Как я могу это сделать?
Вы делаете это для целей регистрации? Если так, то для этого есть несколько библиотек . Двумя самыми популярными являются Log4j и Logback .
Если вам просто нужно сделать это один раз, класс Files делает это легко:
try {
Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
Осторожно : вышеприведенный подход выдает a, NoSuchFileException
если файл еще не существует. Он также не добавляет новую строку автоматически (что часто требуется при добавлении в текстовый файл). Ответ Стива Чамберса охватывает, как вы могли бы сделать это с Files
классом.
Однако, если вы будете записывать в один и тот же файл много раз, описанное выше должно многократно открывать и закрывать файл на диске, что является медленной операцией. В этом случае буферный писатель лучше:
try(FileWriter fw = new FileWriter("myfile.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Ноты:
FileWriter
конструктора скажет ему добавить файл, а не записывать новый файл. (Если файл не существует, он будет создан.)BufferedWriter
рекомендуется для дорогого автора (например,FileWriter
).PrintWriter
дает вам доступ к println
синтаксису, к которому вы, вероятно, привыкли System.out
.BufferedWriter
и PrintWriter
обертки не являются строго необходимыми.try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Если вам нужна надежная обработка исключений для более старой Java, она становится очень многословной:
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(fw != null)
fw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
new BufferedWriter(...)
это исключение; БудетFileWriter
ли закрыто? Я предполагаю, что он не будет закрыт, потому чтоclose()
метод (в нормальных условиях) будет вызываться дляout
объекта, который в этом случае не будет инициализирован - так что на самом делеclose()
метод не будет вызываться -> файл будет открыт, но не будет закрыт. Так что ИМХОtry
утверждение должно выглядеть такtry(FileWriter fw = new FileWriter("myFile.txt")){ Print writer = new ....//code goes here }
И он долженflush()
писателю перед выходом изtry
блока !!!StandardOpenOption.APPEND
он не будет создан - что-то вроде тихого сбоя, поскольку он также не вызовет исключения. (2) Использование.getBytes()
будет означать, что до или после добавленного текста нет возвращаемого символа. Добавили альтернативный ответ для решения этих.Вы можете использовать
fileWriter
с установленным флагомtrue
, для добавления.источник
close
должен быть помещен вfinally
блок, как показано в ответе @ etech, на случай, если между созданием FileWriter и вызовом close возникнет исключение.try(FileWriter fw = new FileWriter(filename,true)){ // Whatever }catch(IOException ex){ ex.printStackTrace(); }
Разве все ответы здесь с блоками try / catch не должны содержать фрагменты .close (), содержащиеся в блоке finally?
Пример для помеченного ответа:
Также, начиная с Java 7, вы можете использовать оператор try-with-resources . Блок finally не требуется для закрытия объявленных ресурсов, поскольку он обрабатывается автоматически и также менее подробен:
источник
out
выходит из области видимости, он автоматически закрывается при сборке мусора, верно? В вашем примере сfinally
блоком, я думаю, что вам действительно нужна еще одна вложенная попытка / ловить,out.close()
если я правильно помню. Решение Java 7 довольно изящно! (Я не занимался разработкой Java с Java 6, поэтому я не был знаком с этим изменением.)flush
?Редактировать - как в Apache Commons 2.1, правильный способ сделать это:
Я адаптировал решение @ Kip для включения правильного закрытия файла наконец:источник
Чтобы немного расширить ответ Кипа , вот простой метод Java 7+, позволяющий добавить новую строку в файл, создав его, если он еще не существует :
Примечание . Выше используется
Files.write
перегрузка, которая записывает строки текста в файл (т. Е. Аналогичнаprintln
команде). Чтобы просто записать текст до конца (то есть аналогичноprint
команде),Files.write
можно использовать альтернативную перегрузку, передавая байтовый массив (например"mytext".getBytes(StandardCharsets.UTF_8)
).источник
.CREATE
делает работу за вас.Убедитесь, что поток правильно закрыт во всех сценариях.
Немного тревожит то, что многие из этих ответов оставляют дескриптор файла открытым в случае ошибки. Ответ https://stackoverflow.com/a/15053443/2498188 на деньги, но только потому, что
BufferedWriter()
не может бросить. Если это возможно, то исключение оставитFileWriter
объект открытым.Более общий способ сделать это, который не волнует,
BufferedWriter()
может ли бросить:Редактировать:
Начиная с Java 7, рекомендуемый способ - использовать «try with resources» и позволить JVM справиться с этим:
источник
PrintWriter.close()
не заявлено, какthrows IOException
в документах . Глядя на его источник ,close()
метод, действительно, не может выдатьIOException
, потому что он перехватывает его из нижележащего потока и устанавливает флаг. Поэтому, если вы работаете над кодом для следующего космического челнока или системы дозирования рентгеновских лучей, вы должны использовать ееPrintWriter.checkError()
после попыткиout.close()
. Это действительно должно быть задокументировано.XX.close()
должен быть в своем собственном try / catch, верно? Например,out.close()
может выбросить исключение, в этом случаеbw.close()
иfw.close()
никогда бы не дозвонились, иfw
это тот , который является наиболее важным для закрытия.В Java-7 это также можно сделать таким:
// ---------------------
источник
Java 7+
По моему скромному мнению, так как я фанат простой Java, я хотел бы предложить что-то, что это комбинация вышеупомянутых ответов. Может быть, я опаздываю на вечеринку. Вот код:
Если файл не существует, он создает его, и если он уже существует, он добавляет sampleText к существующему файлу. Использование этого избавит вас от добавления ненужных библиотек в ваш путь к классам.
источник
Это можно сделать в одной строке кода. Надеюсь это поможет :)
источник
Использование java.nio. Файлы вместе с java.nio.file. StandardOpenOption
Это создает
BufferedWriter
использование файлов, которое принимаетStandardOpenOption
параметры, и автоматическую очисткуPrintWriter
от результирующегоBufferedWriter
.PrintWriter
«Sprintln()
метод, то можно назвать для записи в файл.В
StandardOpenOption
параметры , используемые в этом коде: открывает файл для записи, только добавляет к файлу, и создает файл , если он не существует.Paths.get("path here")
можно заменить наnew File("path here").toPath()
. ИCharset.forName("charset name")
может быть изменен для размещения желаемогоCharset
.источник
Я просто добавляю небольшую деталь:
2.nd параметр (true) - это функция (или интерфейс), называемая добавляемой ( http://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html ). Он отвечает за возможность добавлять некоторый контент в конец определенного файла / потока. Этот интерфейс реализован начиная с Java 1.5. Каждый объект (т. Е. BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer ) с этим интерфейсом можно использовать для добавления содержимого
Другими словами, вы можете добавить некоторый контент в ваш gzipped файл или какой-то http процесс
источник
Пример с использованием гуавы:
источник
Попробуйте с bufferFileWriter.append, он работает со мной.
источник
это будет делать то, что вы собираетесь ..
источник
Лучше использовать try-with-resources, чем все, что было до Java 7, наконец, бизнес
источник
Если мы используем Java 7 и выше, а также знаем, какое содержимое нужно добавить (добавить) в файл, мы можем использовать метод newBufferedWriter в пакете NIO.
Есть несколько моментов, на которые стоит обратить внимание:
StandardCharsets
.try-with-resource
оператор, в котором ресурсы автоматически закрываются после попытки.Хотя OP не спрашивал, но на всякий случай мы хотим искать строки, имеющие какое-то конкретное ключевое слово, например,
confidential
мы можем использовать потоковые API в Java:источник
write(String string)
еслиnewLine()
нужно ожидать новую строку после каждой записанной строки, следует вызыватьЗначение true позволяет добавлять данные в существующий файл. Если мы напишем
Это перезапишет существующий файл. Так что иди на первый подход.
источник
источник
Тогда поймайте IOException где-нибудь вверх по течению.
источник
Создайте функцию в любом месте вашего проекта и просто вызывайте эту функцию там, где вам это нужно.
Ребята, вы должны помнить, что вы, ребята, вызываете активные потоки, которые вы не вызываете асинхронно, и, вероятно, было бы неплохо от 5 до 10 страниц, чтобы сделать это правильно. Почему бы не тратить больше времени на свой проект и забыть написать что-нибудь уже написанное. Должным образом
три строки кода две действительно, так как третья фактически добавляет текст. :П
источник
источник
Вы также можете попробовать это:
источник
Я мог бы предложить проект Apache Commons . Этот проект уже предоставляет основу для того, что вам нужно (например, гибкая фильтрация коллекций).
источник
Следующий метод позволяет вам добавить текст в некоторый файл:
Альтернативно используя
FileUtils
:Это не эффективно, но работает нормально. Разрывы строк обрабатываются правильно, и создается новый файл, если он еще не существует.
источник
Этот код удовлетворит ваши потребности:
источник
Если вы хотите добавить НЕКОТОРЫЙ ТЕКСТ В КОНКРЕТНЫЕ ЛИНИИ, вы можете сначала прочитать весь файл, добавить текст куда угодно, а затем переписать все, как показано в коде ниже:
источник
Мой ответ:
источник
источник
Вы можете использовать следующий код для добавления содержимого в файл:
источник
1.7 Подход:
источник