Мне нужно добавить текст повторно в существующий файл в 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
, для добавления.
try
{
String filename= "MyFile.txt";
FileWriter fw = new FileWriter(filename,true); //the true will append the new data
fw.write("add a line\n");//appends the string to the file
fw.close();
}
catch(IOException ioe)
{
System.err.println("IOException: " + ioe.getMessage());
}
close
должен быть помещен в finally
блок, как показано в ответе @ etech, на случай, если между созданием FileWriter и вызовом close возникнет исключение.
try(FileWriter fw = new FileWriter(filename,true)){ // Whatever }catch(IOException ex){ ex.printStackTrace(); }
Разве все ответы здесь с блоками try / catch не должны содержать фрагменты .close (), содержащиеся в блоке finally?
Пример для помеченного ответа:
PrintWriter out = null;
try {
out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)));
out.println("the text");
} catch (IOException e) {
System.err.println(e);
} finally {
if (out != null) {
out.close();
}
}
Также, начиная с Java 7, вы можете использовать оператор try-with-resources . Блок finally не требуется для закрытия объявленных ресурсов, поскольку он обрабатывается автоматически и также менее подробен:
try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) {
out.println("the text");
} catch (IOException e) {
System.err.println(e);
}
out
выходит из области видимости, он автоматически закрывается при сборке мусора, верно? В вашем примере с finally
блоком, я думаю, что вам действительно нужна еще одна вложенная попытка / ловить, out.close()
если я правильно помню. Решение Java 7 довольно изящно! (Я не занимался разработкой Java с Java 6, поэтому я не был знаком с этим изменением.)
flush
?
Редактировать - как в Apache Commons 2.1, правильный способ сделать это:
FileUtils.writeStringToFile(file, "String to append", true);
Я адаптировал решение @ Kip для включения правильного закрытия файла наконец:
public static void appendToFile(String targetFile, String s) throws IOException {
appendToFile(new File(targetFile), s);
}
public static void appendToFile(File targetFile, String s) throws IOException {
PrintWriter out = null;
try {
out = new PrintWriter(new BufferedWriter(new FileWriter(targetFile, true)));
out.println(s);
} finally {
if (out != null) {
out.close();
}
}
}
Чтобы немного расширить ответ Кипа , вот простой метод Java 7+, позволяющий добавить новую строку в файл, создав его, если он еще не существует :
try {
final Path path = Paths.get("path/to/filename.txt");
Files.write(path, Arrays.asList("New line to append"), StandardCharsets.UTF_8,
Files.exists(path) ? StandardOpenOption.APPEND : StandardOpenOption.CREATE);
} catch (final IOException ioe) {
// Add your own exception handling...
}
Примечание . Выше используется Files.write
перегрузка, которая записывает строки текста в файл (т. Е. Аналогична println
команде). Чтобы просто записать текст до конца (то есть аналогично print
команде), Files.write
можно использовать альтернативную перегрузку, передавая байтовый массив (например "mytext".getBytes(StandardCharsets.UTF_8)
).
.CREATE
делает работу за вас.
Немного тревожит то, что многие из этих ответов оставляют дескриптор файла открытым в случае ошибки. Ответ https://stackoverflow.com/a/15053443/2498188 на деньги, но только потому, что BufferedWriter()
не может бросить. Если это возможно, то исключение оставит FileWriter
объект открытым.
Более общий способ сделать это, который не волнует, BufferedWriter()
может ли бросить:
PrintWriter out = null;
BufferedWriter bw = null;
FileWriter fw = null;
try{
fw = new FileWriter("outfilename", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
}
catch( IOException e ){
// File writing/opening failed at some stage.
}
finally{
try{
if( out != null ){
out.close(); // Will close bw and fw too
}
else if( bw != null ){
bw.close(); // Will close fw too
}
else if( fw != null ){
fw.close();
}
else{
// Oh boy did it fail hard! :3
}
}
catch( IOException e ){
// Closing the file writers failed for some obscure reason
}
}
Начиная с Java 7, рекомендуемый способ - использовать «try with resources» и позволить JVM справиться с этим:
try( FileWriter fw = new FileWriter("outfilename", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw)){
out.println("the text");
}
catch( IOException e ){
// File writing/opening failed at some stage.
}
PrintWriter.close()
не заявлено, как throws IOException
в документах . Глядя на его источник , close()
метод, действительно, не может выдать IOException
, потому что он перехватывает его из нижележащего потока и устанавливает флаг. Поэтому, если вы работаете над кодом для следующего космического челнока или системы дозирования рентгеновских лучей, вы должны использовать ее PrintWriter.checkError()
после попытки out.close()
. Это действительно должно быть задокументировано.
XX.close()
должен быть в своем собственном try / catch, верно? Например, out.close()
может выбросить исключение, в этом случае bw.close()
и fw.close()
никогда бы не дозвонились, и fw
это тот , который является наиболее важным для закрытия.
В Java-7 это также можно сделать таким:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
// ---------------------
Path filePath = Paths.get("someFile.txt");
if (!Files.exists(filePath)) {
Files.createFile(filePath);
}
Files.write(filePath, "Text to be added".getBytes(), StandardOpenOption.APPEND);
Java 7+
По моему скромному мнению, так как я фанат простой Java, я хотел бы предложить что-то, что это комбинация вышеупомянутых ответов. Может быть, я опаздываю на вечеринку. Вот код:
String sampleText = "test" + System.getProperty("line.separator");
Files.write(Paths.get(filePath), sampleText.getBytes(StandardCharsets.UTF_8),
StandardOpenOption.CREATE, StandardOpenOption.APPEND);
Если файл не существует, он создает его, и если он уже существует, он добавляет sampleText к существующему файлу. Использование этого избавит вас от добавления ненужных библиотек в ваш путь к классам.
Это можно сделать в одной строке кода. Надеюсь это поможет :)
Files.write(Paths.get(fileName), msg.getBytes(), StandardOpenOption.APPEND);
Использование java.nio. Файлы вместе с java.nio.file. StandardOpenOption
PrintWriter out = null;
BufferedWriter bufWriter;
try{
bufWriter =
Files.newBufferedWriter(
Paths.get("log.txt"),
Charset.forName("UTF8"),
StandardOpenOption.WRITE,
StandardOpenOption.APPEND,
StandardOpenOption.CREATE);
out = new PrintWriter(bufWriter, true);
}catch(IOException e){
//Oh, no! Failed to create PrintWriter
}
//After successful creation of PrintWriter
out.println("Text to be appended");
//After done writing, remember to close!
out.close();
Это создает BufferedWriter
использование файлов, которое принимает StandardOpenOption
параметры, и автоматическую очистку PrintWriter
от результирующего BufferedWriter
. PrintWriter
«S println()
метод, то можно назвать для записи в файл.
В StandardOpenOption
параметры , используемые в этом коде: открывает файл для записи, только добавляет к файлу, и создает файл , если он не существует.
Paths.get("path here")
можно заменить на new File("path here").toPath()
. И Charset.forName("charset name")
может быть изменен для размещения желаемого Charset
.
Я просто добавляю небольшую деталь:
new FileWriter("outfilename", true)
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 процесс
Пример с использованием гуавы:
File to = new File("C:/test/test.csv");
for (int i = 0; i < 42; i++) {
CharSequence from = "some string" + i + "\n";
Files.append(from, to, Charsets.UTF_8);
}
Попробуйте с bufferFileWriter.append, он работает со мной.
FileWriter fileWriter;
try {
fileWriter = new FileWriter(file,true);
BufferedWriter bufferFileWriter = new BufferedWriter(fileWriter);
bufferFileWriter.append(obj.toJSONString());
bufferFileWriter.newLine();
bufferFileWriter.close();
} catch (IOException ex) {
Logger.getLogger(JsonTest.class.getName()).log(Level.SEVERE, null, ex);
}
String str;
String path = "C:/Users/...the path..../iin.txt"; // you can input also..i created this way :P
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new FileWriter(path, true));
try
{
while(true)
{
System.out.println("Enter the text : ");
str = br.readLine();
if(str.equalsIgnoreCase("exit"))
break;
else
pw.println(str);
}
}
catch (Exception e)
{
//oh noes!
}
finally
{
pw.close();
}
это будет делать то, что вы собираетесь ..
Лучше использовать try-with-resources, чем все, что было до Java 7, наконец, бизнес
static void appendStringToFile(Path file, String s) throws IOException {
try (BufferedWriter out = Files.newBufferedWriter(file, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
out.append(s);
out.newLine();
}
}
Если мы используем Java 7 и выше, а также знаем, какое содержимое нужно добавить (добавить) в файл, мы можем использовать метод newBufferedWriter в пакете NIO.
public static void main(String[] args) {
Path FILE_PATH = Paths.get("C:/temp", "temp.txt");
String text = "\n Welcome to Java 8";
//Writing to the file temp.txt
try (BufferedWriter writer = Files.newBufferedWriter(FILE_PATH, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {
writer.write(text);
} catch (IOException e) {
e.printStackTrace();
}
}
Есть несколько моментов, на которые стоит обратить внимание:
StandardCharsets
.try-with-resource
оператор, в котором ресурсы автоматически закрываются после попытки.Хотя OP не спрашивал, но на всякий случай мы хотим искать строки, имеющие какое-то конкретное ключевое слово, например, confidential
мы можем использовать потоковые API в Java:
//Reading from the file the first line which contains word "confidential"
try {
Stream<String> lines = Files.lines(FILE_PATH);
Optional<String> containsJava = lines.filter(l->l.contains("confidential")).findFirst();
if(containsJava.isPresent()){
System.out.println(containsJava.get());
}
} catch (IOException e) {
e.printStackTrace();
}
write(String string)
если newLine()
нужно ожидать новую строку после каждой записанной строки, следует вызывать
FileOutputStream fos = new FileOutputStream("File_Name", true);
fos.write(data);
Значение true позволяет добавлять данные в существующий файл. Если мы напишем
FileOutputStream fos = new FileOutputStream("File_Name");
Это перезапишет существующий файл. Так что иди на первый подход.
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Writer {
public static void main(String args[]){
doWrite("output.txt","Content to be appended to file");
}
public static void doWrite(String filePath,String contentToBeAppended){
try(
FileWriter fw = new FileWriter(filePath, true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw)
)
{
out.println(contentToBeAppended);
}
catch( IOException e ){
// File writing/opening failed at some stage.
}
}
}
FileOutputStream stream = new FileOutputStream(path, true);
try {
stream.write(
string.getBytes("UTF-8") // Choose your encoding.
);
} finally {
stream.close();
}
Тогда поймайте IOException где-нибудь вверх по течению.
Создайте функцию в любом месте вашего проекта и просто вызывайте эту функцию там, где вам это нужно.
Ребята, вы должны помнить, что вы, ребята, вызываете активные потоки, которые вы не вызываете асинхронно, и, вероятно, было бы неплохо от 5 до 10 страниц, чтобы сделать это правильно. Почему бы не тратить больше времени на свой проект и забыть написать что-нибудь уже написанное. Должным образом
//Adding a static modifier would make this accessible anywhere in your app
public Logger getLogger()
{
return java.util.logging.Logger.getLogger("MyLogFileName");
}
//call the method anywhere and append what you want to log
//Logger class will take care of putting timestamps for you
//plus the are ansychronously done so more of the
//processing power will go into your application
//from inside a function body in the same class ...{...
getLogger().log(Level.INFO,"the text you want to append");
...}...
/*********log file resides in server root log files********/
три строки кода две действительно, так как третья фактически добавляет текст. :П
Библиотека
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
Код
public void append()
{
try
{
String path = "D:/sample.txt";
File file = new File(path);
FileWriter fileWriter = new FileWriter(file,true);
BufferedWriter bufferFileWriter = new BufferedWriter(fileWriter);
fileWriter.append("Sample text in the file to append");
bufferFileWriter.close();
System.out.println("User Registration Completed");
}catch(Exception ex)
{
System.out.println(ex);
}
}
Вы также можете попробовать это:
JFileChooser c= new JFileChooser();
c.showOpenDialog(c);
File write_file = c.getSelectedFile();
String Content = "Writing into file"; //what u would like to append to the file
try
{
RandomAccessFile raf = new RandomAccessFile(write_file, "rw");
long length = raf.length();
//System.out.println(length);
raf.setLength(length + 1); //+ (integer value) for spacing
raf.seek(raf.length());
raf.writeBytes(Content);
raf.close();
}
catch (Exception e) {
//any exception handling method of ur choice
}
Я мог бы предложить проект Apache Commons . Этот проект уже предоставляет основу для того, что вам нужно (например, гибкая фильтрация коллекций).
Следующий метод позволяет вам добавить текст в некоторый файл:
private void appendToFile(String filePath, String text)
{
PrintWriter fileWriter = null;
try
{
fileWriter = new PrintWriter(new BufferedWriter(new FileWriter(
filePath, true)));
fileWriter.println(text);
} catch (IOException ioException)
{
ioException.printStackTrace();
} finally
{
if (fileWriter != null)
{
fileWriter.close();
}
}
}
Альтернативно используя FileUtils
:
public static void appendToFile(String filePath, String text) throws IOException
{
File file = new File(filePath);
if(!file.exists())
{
file.createNewFile();
}
String fileContents = FileUtils.readFileToString(file);
if(file.length() != 0)
{
fileContents = fileContents.concat(System.lineSeparator());
}
fileContents = fileContents.concat(text);
FileUtils.writeStringToFile(file, fileContents);
}
Это не эффективно, но работает нормально. Разрывы строк обрабатываются правильно, и создается новый файл, если он еще не существует.
Этот код удовлетворит ваши потребности:
FileWriter fw=new FileWriter("C:\\file.json",true);
fw.write("ssssss");
fw.close();
Если вы хотите добавить НЕКОТОРЫЙ ТЕКСТ В КОНКРЕТНЫЕ ЛИНИИ, вы можете сначала прочитать весь файл, добавить текст куда угодно, а затем переписать все, как показано в коде ниже:
public static void addDatatoFile(String data1, String data2){
String fullPath = "/home/user/dir/file.csv";
File dir = new File(fullPath);
List<String> l = new LinkedList<String>();
try (BufferedReader br = new BufferedReader(new FileReader(dir))) {
String line;
int count = 0;
while ((line = br.readLine()) != null) {
if(count == 1){
//add data at the end of second line
line += data1;
}else if(count == 2){
//add other data at the end of third line
line += data2;
}
l.add(line);
count++;
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
createFileFromList(l, dir);
}
public static void createFileFromList(List<String> list, File f){
PrintWriter writer;
try {
writer = new PrintWriter(f, "UTF-8");
for (String d : list) {
writer.println(d.toString());
}
writer.close();
} catch (FileNotFoundException | UnsupportedEncodingException e) {
e.printStackTrace();
}
}
Мой ответ:
JFileChooser chooser= new JFileChooser();
chooser.showOpenDialog(chooser);
File file = chooser.getSelectedFile();
String Content = "What you want to append to file";
try
{
RandomAccessFile random = new RandomAccessFile(file, "rw");
long length = random.length();
random.setLength(length + 1);
random.seek(random.length());
random.writeBytes(Content);
random.close();
}
catch (Exception exception) {
//exception handling
}
/**********************************************************************
* it will write content to a specified file
*
* @param keyString
* @throws IOException
*********************************************************************/
public static void writeToFile(String keyString,String textFilePAth) throws IOException {
// For output to file
File a = new File(textFilePAth);
if (!a.exists()) {
a.createNewFile();
}
FileWriter fw = new FileWriter(a.getAbsoluteFile(), true);
BufferedWriter bw = new BufferedWriter(fw);
bw.append(keyString);
bw.newLine();
bw.close();
}// end of writeToFile()
Вы можете использовать следующий код для добавления содержимого в файл:
String fileName="/home/shriram/Desktop/Images/"+"test.txt";
FileWriter fw=new FileWriter(fileName,true);
fw.write("here will be you content to insert or append in file");
fw.close();
FileWriter fw1=new FileWriter(fileName,true);
fw1.write("another content will be here to be append in the same file");
fw1.close();
1.7 Подход:
void appendToFile(String filePath, String content) throws IOException{
Path path = Paths.get(filePath);
try (BufferedWriter writer =
Files.newBufferedWriter(path,
StandardOpenOption.APPEND)) {
writer.newLine();
writer.append(content);
}
/*
//Alternative:
try (BufferedWriter bWriter =
Files.newBufferedWriter(path,
StandardOpenOption.WRITE, StandardOpenOption.APPEND);
PrintWriter pWriter = new PrintWriter(bWriter)
) {
pWriter.println();//to have println() style instead of newLine();
pWriter.append(content);//Also, bWriter.append(content);
}*/
}