Saya perlu menambahkan teks berulang kali ke file yang ada di Jawa. Bagaimana aku melakukan itu?
sumber
Saya perlu menambahkan teks berulang kali ke file yang ada di Jawa. Bagaimana aku melakukan itu?
Apakah Anda melakukan ini untuk tujuan logging? Jika demikian ada beberapa perpustakaan untuk ini . Dua yang paling populer adalah Log4j dan Logback .
Jika Anda hanya perlu melakukan ini satu kali saja, kelas Files membuatnya mudah:
try {
Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
Hati-hati : Pendekatan di atas akan melempar NoSuchFileException
jika file belum ada. Itu juga tidak menambahkan baris baru secara otomatis (yang sering Anda inginkan ketika menambahkan file teks). Jawaban Steve Chambers mencakup bagaimana Anda dapat melakukan ini dengan Files
kelas.
Namun, jika Anda akan menulis ke file yang sama berkali-kali, hal di atas harus membuka dan menutup file pada disk berkali-kali, yang merupakan operasi lambat. Dalam hal ini, penulis buffered lebih baik:
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
}
Catatan:
FileWriter
konstruktor akan memberitahu itu untuk menambahkan ke file, daripada menulis file baru. (Jika file tidak ada, itu akan dibuat.)BufferedWriter
dianjurkan untuk seorang penulis mahal (seperti FileWriter
).PrintWriter
memberi Anda akses ke println
sintaksis yang mungkin Anda gunakanSystem.out
.BufferedWriter
dan PrintWriter
tidak sepenuhnya diperlukan.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
}
Jika Anda membutuhkan penanganan pengecualian yang kuat untuk Java yang lebih lama, itu menjadi sangat verbose:
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(...)
melempar pengecualian; AkankahFileWriter
ditutup? Saya kira itu tidak akan ditutup, karenaclose()
metode (dalam kondisi normal) akan dipanggil padaout
objek, yang int kasus ini tidak akan diinisialisasi - jadi sebenarnyaclose()
metode tidak akan dipanggil -> file akan dibuka, tetapi tidak akan ditutup. Jadi IMHOtry
pernyataannya akan terlihat seperti initry(FileWriter fw = new FileWriter("myFile.txt")){ Print writer = new ....//code goes here }
Dan dia seharusnyaflush()
penulis sebelum keluar daritry
blok !!!StandardOpenOption.APPEND
tidak akan membuatnya - jenis seperti kegagalan diam karena tidak akan membuang pengecualian juga. (2) Menggunakan.getBytes()
akan berarti tidak ada karakter kembali sebelum atau setelah teks ditambahkan. Telah menambahkan jawaban alternatif untuk mengatasinya.Anda dapat menggunakan
fileWriter
dengan set bendera ketrue
, untuk menambahkan.sumber
close
harus ditempatkan difinally
blok seperti yang ditunjukkan pada jawaban @ etech dalam hal pengecualian akan dilemparkan antara pembuatan FileWriter dan memohon tutup.try(FileWriter fw = new FileWriter(filename,true)){ // Whatever }catch(IOException ex){ ex.printStackTrace(); }
Tidakkah seharusnya semua jawaban di sini dengan blok coba / tangkap memiliki potongan .close () yang ada pada blok akhirnya?
Contoh untuk jawaban yang ditandai:
Selain itu, pada Java 7, Anda dapat menggunakan pernyataan coba-dengan-sumber daya . Akhirnya tidak diperlukan blokir untuk menutup sumber daya yang dideklarasikan karena ditangani secara otomatis, dan juga kurang bertele-tele:
sumber
out
keluar dari ruang lingkup, secara otomatis ditutup ketika pengumpulan sampah, kan? Dalam contoh Anda denganfinally
blok, saya pikir Anda benar-benar perlu mencoba / menangkap bersarangout.close()
jika saya ingat dengan benar. Solusi Java 7 cukup apik! (Saya belum melakukan dev Java sejak Java 6, jadi saya tidak terbiasa dengan perubahan itu.)flush
metode ini?Edit - pada Apache Commons 2.1, cara yang benar untuk melakukannya adalah:
Saya mengadaptasi solusi @ Kip untuk menyertakan penutupan file dengan benar pada akhirnya:sumber
Untuk sedikit memperluas jawaban Kip , berikut adalah metode Java 7+ sederhana untuk menambahkan baris baru ke file, membuatnya jika belum ada :
Catatan: Di atas menggunakan
Files.write
kelebihan yang menulis baris teks ke file (yaitu mirip denganprintln
perintah). Untuk hanya menulis teks sampai akhir (yaitu mirip denganprint
perintah),Files.write
overload alternatif dapat digunakan, lewat dalam array byte (misalnya"mytext".getBytes(StandardCharsets.UTF_8)
).sumber
.CREATE
melakukan pekerjaan untuk Anda.Pastikan aliran ditutup dengan benar di semua skenario.
Agak mengkhawatirkan berapa banyak dari jawaban ini yang membiarkan file terbuka jika terjadi kesalahan. Jawabannya https://stackoverflow.com/a/15053443/2498188 ada pada uang tetapi hanya karena
BufferedWriter()
tidak bisa melempar. Jika bisa maka pengecualian akan membiarkanFileWriter
objek terbuka.Cara yang lebih umum untuk melakukan ini yang tidak peduli jika
BufferedWriter()
bisa melempar:Edit:
Pada Java 7, cara yang disarankan adalah menggunakan "coba dengan sumber daya" dan biarkan JVM menghadapinya:
sumber
PrintWriter.close()
tidak dinyatakan sepertithrows IOException
dalam dokumen . Melihat sumbernya ,close()
metodenya, memang, tidak bisa melemparIOException
, karena menangkapnya dari aliran yang mendasarinya, dan menetapkan sebuah bendera. Jadi jika Anda bekerja pada kode untuk Space Shuttle berikutnya atau sistem pengukuran dosis sinar-X, Anda harus menggunakannyaPrintWriter.checkError()
setelah mencobaout.close()
. Ini seharusnya sudah didokumentasikan.XX.close()
harus di coba / tangkap sendiri, kan? Misalnya,out.close()
bisa melempar pengecualian, dalam hal inibw.close()
danfw.close()
tidak akan pernah dipanggil, danfw
merupakan salah satu yang paling penting untuk ditutup.Di Java-7 juga bisa dilakukan seperti:
// ---------------------
sumber
java 7+
Menurut pendapat saya yang rendah hati karena saya penggemar java polos, saya akan menyarankan sesuatu yang merupakan kombinasi dari jawaban yang disebutkan di atas. Mungkin saya terlambat ke pesta. Ini kodenya:
Jika file tidak ada, itu membuatnya dan jika sudah ada itu menambahkan sampleText ke file yang ada. Dengan menggunakan ini, Anda tidak perlu menambahkan lib yang tidak perlu ke classpath Anda.
sumber
Ini dapat dilakukan dalam satu baris kode. Semoga ini membantu :)
sumber
Menggunakan java.nio. File bersama dengan java.nio.file. StandardOpenOption
Ini menciptakan
BufferedWriter
Files menggunakan, yang menerimaStandardOpenOption
parameter, dan auto-flushingPrintWriter
dari resultanBufferedWriter
.PrintWriter
'sprintln()
metode, kemudian dapat dipanggil untuk menulis ke file.The
StandardOpenOption
parameter yang digunakan dalam kode ini: membuka file untuk menulis, hanya menambahkan ke file, dan menciptakan file jika itu tidak ada.Paths.get("path here")
dapat diganti dengannew File("path here").toPath()
. DanCharset.forName("charset name")
dapat dimodifikasi untuk mengakomodasi yang diinginkanCharset
.sumber
Saya hanya menambahkan detail kecil:
Parameter 2.nd (true) adalah fitur (atau, antarmuka) yang disebut appendable ( http://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html ). Ini bertanggung jawab untuk dapat menambahkan beberapa konten ke akhir file / stream tertentu. Antarmuka ini diimplementasikan sejak Java 1.5. Setiap objek (yaitu BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer ) dengan antarmuka ini dapat digunakan untuk menambahkan konten
Dengan kata lain, Anda dapat menambahkan beberapa konten ke file gzipped Anda, atau beberapa proses http
sumber
Contoh, menggunakan Jambu Biji:
sumber
Coba dengan bufferFileWriter.append, ini berfungsi dengan saya.
sumber
ini akan melakukan apa yang Anda inginkan ..
sumber
Lebih baik menggunakan try-with-resources daripada semua yang pra-java 7 akhirnya bisnis
sumber
Jika kita menggunakan Java 7 dan di atasnya dan juga tahu konten yang akan ditambahkan (ditambahkan) ke file kita dapat menggunakan metode newBufferedWriter dalam paket NIO.
Ada beberapa hal yang perlu diperhatikan:
StandardCharsets
.try-with-resource
pernyataan di mana sumber daya secara otomatis ditutup setelah percobaan.Meskipun OP belum bertanya tetapi untuk berjaga-jaga jika kita ingin mencari baris yang memiliki beberapa kata kunci spesifik misalnya
confidential
kita dapat menggunakan stream API di Jawa:sumber
write(String string)
jika seseorang mengharapkan baris baru setelah setiap string ditulis,newLine()
harus dipanggilyang sebenarnya memungkinkan untuk menambahkan data dalam file yang ada. Jika kita akan menulis
Ini akan menimpa file yang ada. Jadi lakukan pendekatan pertama.
sumber
sumber
Kemudian tangkap IOException di suatu tempat di hulu.
sumber
Buat fungsi di mana saja di proyek Anda dan cukup panggil fungsi itu di mana pun Anda membutuhkannya.
Kalian harus ingat bahwa kalian memanggil utas aktif yang tidak kamu panggil secara tidak sinkron dan karena itu mungkin merupakan 5 sampai 10 halaman yang baik untuk menyelesaikannya dengan benar. Mengapa tidak menghabiskan lebih banyak waktu untuk proyek Anda dan lupakan menulis apa pun yang sudah ditulis. Tepat
tiga baris kode dua benar-benar sejak yang ketiga benar-benar menambahkan teks. : P
sumber
sumber
Anda juga dapat mencoba ini:
sumber
Saya mungkin menyarankan proyek apache commons . Proyek ini sudah menyediakan kerangka kerja untuk melakukan apa yang Anda butuhkan (yaitu penyaringan koleksi yang fleksibel).
sumber
Metode berikut memungkinkan Anda menambahkan teks ke beberapa file:
Atau menggunakan
FileUtils
:Ini tidak efisien tetapi berfungsi dengan baik. Jeda baris ditangani dengan benar dan file baru dibuat jika belum ada.
sumber
Kode ini akan memenuhi kebutuhan Anda:
sumber
Jika Anda ingin MENAMBAH BEBERAPA TEKS DALAM JARINGAN KHUSUS, Anda dapat membaca seluruh file terlebih dahulu, menambahkan teks di mana pun Anda inginkan dan kemudian menimpa semuanya seperti dalam kode di bawah ini:
sumber
Jawabanku:
sumber
sumber
Anda dapat menggunakan kode follong untuk menambahkan konten dalam file:
sumber
1.7 Pendekatan:
sumber