Мені потрібно кілька разів додавати текст до наявного файлу на 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
}
Обережно : Наведений вище підхід призведе до 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());
}
try(FileWriter fw = new FileWriter(filename,true)){ // Whatever }catch(IOException ex){ ex.printStackTrace(); }
Чи не повинні всі відповіді, що містяться у блоках try / catch, мають .close () фрагменти, що містяться в остаточному блоці?
Приклад для позначеної відповіді:
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(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, рекомендованим способом є використання "спробувати ресурси" та дозволити 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()
повинен бути власним спробувати / ловити, правда? Наприклад, 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
Зразок за допомогою Guava:
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();
}
це зробить те, що ви плануєте ..
Краще використовувати тест-ресурси, а потім все, що раніше, перш ніж ява 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********/
три рядки коду два насправді з третього фактично додає текст. : P
Бібліотека
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);
}*/
}