Bagaimana cara membuat file dan menulisnya di Jawa?

1383

Apa cara paling sederhana untuk membuat dan menulis ke file (teks) di Jawa?

Drew Johnson
sumber

Jawaban:

1735

Perhatikan bahwa masing-masing contoh kode di bawah ini dapat dibuang IOException. Coba / tangkap / akhirnya blok dihilangkan karena singkatnya. Lihat tutorial ini untuk informasi tentang penanganan pengecualian.

Perhatikan bahwa masing-masing contoh kode di bawah ini akan menimpa file jika sudah ada

Membuat file teks:

PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();

Membuat file biner:

byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();

Pengguna Java 7+ dapat menggunakan Fileskelas untuk menulis ke file:

Membuat file teks:

List<String> lines = Arrays.asList("The first line", "The second line");
Path file = Paths.get("the-file-name.txt");
Files.write(file, lines, StandardCharsets.UTF_8);
//Files.write(file, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);

Membuat file biner:

byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);
Michael
sumber
58
Layak dicatat PrintWriter akan memotong filesize ke nol jika file sudah ada
Covar
34
PrintWriter dapat (dan sering) digunakan, tetapi tidak (secara konseptual) kelas yang tepat untuk pekerjaan itu. Dari dokumen: "PrintWriter prints formatted representations of objects to a text-output stream. "jawaban Bozho lebih benar, meskipun terlihat rumit (Anda selalu dapat membungkusnya dengan beberapa metode utilitas).
leonbloy
14
Jadi di mana file teks akan dibuat setelah aplikasi dibuat dan digunakan di PC lain karena kita belum memberikan path?
Marlon Abeykoon
13
@ MarslonAbeykoon Pertanyaan bagus. Jawabannya adalah ia akan membuat file teks di direktori kerja . Direktori kerja adalah direktori apa pun tempat Anda menjalankan program Anda. Sebagai contoh, jika Anda menjalankan program Anda dari baris perintah, maka direktori kerja akan menjadi direktori apa pun yang Anda "masuk" pada saat itu (di Linux, ketik "pwd" untuk melihat direktori kerja saat ini). Atau, jika saya mengklik dua kali file JAR di desktop saya untuk menjalankannya, maka direktori yang berfungsi adalah desktop.
Michael
8
writer.close()harus di blok akhirnya
Thierry
416

Di Jawa 7 dan lebih tinggi:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(
              new FileOutputStream("filename.txt"), "utf-8"))) {
   writer.write("something");
}

Ada beberapa utilitas yang berguna untuk itu:

Perhatikan juga bahwa Anda dapat menggunakan FileWriter, tetapi menggunakan penyandian default, yang seringkali merupakan ide yang buruk - yang terbaik adalah menentukan penyandian secara eksplisit.

Di bawah ini adalah jawaban asli, sebelum Jawa 7


Writer writer = null;

try {
    writer = new BufferedWriter(new OutputStreamWriter(
          new FileOutputStream("filename.txt"), "utf-8"));
    writer.write("Something");
} catch (IOException ex) {
    // Report
} finally {
   try {writer.close();} catch (Exception ex) {/*ignore*/}
}

Lihat juga: Membaca, Menulis, dan Membuat File (termasuk NIO2).

Bozho
sumber
5
@leonbloy Saya tahu ini adalah komentar lama, tetapi jika ada yang melihat ini maukah Anda menjelaskan mengapa tidak "selalu bermanfaat"? Paling tidak di sini tertulis "paling efisien" docs.oracle.com/javase/1.5.0/docs/api/java/io/…
Juan
14
Sepertinya penulis tidak memiliki metode writeln (). Hanya ada write ()
YankeeWhiskey
10
Jika Anda mengubah jenis penulis ke BufferedWriter (yang sebenarnya), Anda dapat menggunakan writer.newLine ()
Niek
4
Tampaknya tidak benar untuk mencoba / menangkap di dalam akhirnya. Saya tahu alasannya, tetapi sepertinya kode bau.
ashes999
4
@ Trengot Tidak. Memanggil close()sembarang aliran yang melilit yang lain akan menutup semua aliran dalam juga.
Dana Gugatan Monica
132

Jika Anda sudah memiliki konten yang ingin Anda tulis ke file (dan tidak dihasilkan dengan cepat), java.nio.file.Filespenambahan di Java 7 sebagai bagian dari I / O asli menyediakan cara paling sederhana dan paling efisien untuk mencapai tujuan Anda.

Pada dasarnya membuat dan menulis ke file hanya satu baris, apalagi satu panggilan metode sederhana !

Contoh berikut membuat dan menulis ke 6 file berbeda untuk menunjukkan bagaimana itu dapat digunakan:

Charset utf8 = StandardCharsets.UTF_8;
List<String> lines = Arrays.asList("1st line", "2nd line");
byte[] data = {1, 2, 3, 4, 5};

try {
    Files.write(Paths.get("file1.bin"), data);
    Files.write(Paths.get("file2.bin"), data,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
    Files.write(Paths.get("file3.txt"), "content".getBytes());
    Files.write(Paths.get("file4.txt"), "content".getBytes(utf8));
    Files.write(Paths.get("file5.txt"), lines, utf8);
    Files.write(Paths.get("file6.txt"), lines, utf8,
            StandardOpenOption.CREATE, StandardOpenOption.APPEND);
} catch (IOException e) {
    e.printStackTrace();
}
icza
sumber
Bagus sekali. Saya suka contoh file5 dan file6. Untuk menguji file6 pastikan Anda menjalankan program dua kali, maka Anda akan melihatnya menambahkan baris lagi.
tazboy
76
public class Program {
    public static void main(String[] args) {
        String text = "Hello world";
        BufferedWriter output = null;
        try {
            File file = new File("example.txt");
            output = new BufferedWriter(new FileWriter(file));
            output.write(text);
        } catch ( IOException e ) {
            e.printStackTrace();
        } finally {
          if ( output != null ) {
            output.close();
          }
        }
    }
}
Eric Petroelje
sumber
18
Bukankah lebih baik untuk menempatkan output.close () di blok akhirnya?
qed
7
Kode hanya tidak dapat merupakan jawaban di sini. Anda harus menjelaskan.
Marquis of Lorne
7
sebenarnya ini tidak akan dikompilasi, output.close()melempar IOException
Bob Yoplait
43

Berikut adalah sedikit contoh program untuk membuat atau menimpa file. Ini versi yang panjang sehingga dapat dipahami dengan lebih mudah.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class writer {
    public void writing() {
        try {
            //Whatever the file path is.
            File statText = new File("E:/Java/Reference/bin/images/statsTest.txt");
            FileOutputStream is = new FileOutputStream(statText);
            OutputStreamWriter osw = new OutputStreamWriter(is);    
            Writer w = new BufferedWriter(osw);
            w.write("POTATO!!!");
            w.close();
        } catch (IOException e) {
            System.err.println("Problem writing to the file statsTest.txt");
        }
    }

    public static void main(String[]args) {
        writer write = new writer();
        write.writing();
    }
}
Draeven
sumber
39

Cara yang sangat sederhana untuk membuat dan menulis ke file di Java:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class CreateFiles {

    public static void main(String[] args) {
        try{
            // Create new file
            String content = "This is the content to write into create file";
            String path="D:\\a\\hi.txt";
            File file = new File(path);

            // If file doesn't exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);

            // Write in file
            bw.write(content);

            // Close connection
            bw.close();
        }
        catch(Exception e){
            System.out.println(e);
        }
    }
}
Anuj Dhiman
sumber
7
The File.exists()/createNewFile()kode di sini adalah baik sia-sia dan boros. Sistem operasi sudah harus melakukan hal yang persis sama ketika new FileWriter()dibuat. Anda memaksakan itu terjadi dua kali.
Marquis of Lorne
1
File.exists () / createNewFile () tidak ada gunanya dan boros. Saya sedang mencari cara untuk mengeksekusi kode yang berbeda berdasarkan apakah file tersebut sudah ada atau belum. Ini sangat membantu.
KirstieBallance
2
Saya menggunakan metode ini tetapi Anda harus tahu bahwa itu menimpa file setiap kali. Jika Anda ingin menambahkan jika file ada, Anda harus instantiate FileWritersebagai berikut:new FileWriter(file.getAbsoluteFile(),true)
Adelin
2
Hal ini baik sia-sia dan boros, karena alasan yang saya nyatakan. Anda menyebabkan dua tes keberadaan, dua kreasi, dan penghapusan: dan Anda tidak menjalankan kode yang berbeda di sini tergantung pada apakah file tersebut sudah ada atau belum.
Marquis of Lorne
34

Menggunakan:

try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8))) {
    writer.write("text to write");
} 
catch (IOException ex) {
    // Handle me
}  

Menggunakan try()akan menutup streaming secara otomatis. Versi ini pendek, cepat (buffered) dan memungkinkan memilih pengodean

Fitur ini diperkenalkan di Java 7.

icl7126
sumber
5
Perlu dicatat ini adalah fitur Java 7, jadi tidak akan berfungsi di versi Java sebelumnya.
Dan Temple
3
Orang dapat menggunakan "konstanta" StandardCharsets.UTF_8alih-alih String "utf-8" (Ini mencegah kesalahan kesalahan ketik) ...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...- java.nio.charset.StandardCharsetsdiperkenalkan di java 7
Ralph
20

Di sini kita memasukkan string ke file teks:

String content = "This is the content to write into a file";
File file = new File("filename.txt");
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close(); // Be sure to close BufferedWriter

Kita dapat dengan mudah membuat file baru dan menambahkan konten ke dalamnya.

iKing
sumber
Perhatikan bahwa menutup BufferedWriter sudah cukup karena juga menangani penutupan FileWriter.
rbaleksandar
17

Karena penulis tidak menentukan apakah mereka memerlukan solusi untuk versi Java yang telah EoL (oleh Sun dan IBM, dan ini secara teknis adalah JVM yang paling luas), dan karena kenyataan bahwa kebanyakan orang tampaknya telah menjawab pertanyaan penulis sebelum ditentukan bahwa itu adalah file teks (non-biner) , saya telah memutuskan untuk memberikan jawaban saya.


Pertama-tama, Java 6 secara umum telah mencapai akhir masa pakainya, dan karena penulis tidak menentukan ia membutuhkan kompatibilitas sebelumnya, saya kira itu secara otomatis berarti Java 7 atau lebih tinggi (Java 7 belum dimatikan oleh IBM). Jadi, kita dapat melihat langsung di file I / O tutorial: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html

Sebelum rilis Java SE 7, kelas java.io.File adalah mekanisme yang digunakan untuk file I / O, tetapi memiliki beberapa kelemahan.

  • Banyak metode yang tidak melempar pengecualian ketika gagal, jadi tidak mungkin mendapatkan pesan kesalahan yang berguna. Misalnya, jika penghapusan file gagal, program akan menerima "hapus gagal" tetapi tidak akan tahu apakah itu karena file tidak ada, pengguna tidak memiliki izin, atau ada masalah lain.
  • Metode ganti nama tidak bekerja secara konsisten di seluruh platform.
  • Tidak ada dukungan nyata untuk tautan simbolik.
  • Dibutuhkan lebih banyak dukungan untuk metadata, seperti izin file, pemilik file, dan atribut keamanan lainnya. Mengakses file metadata tidak efisien.
  • Banyak metode File tidak skala. Meminta daftar direktori besar melalui server dapat mengakibatkan hang. Direktori besar juga dapat menyebabkan masalah sumber daya memori, yang mengakibatkan penolakan layanan.
  • Itu tidak mungkin untuk menulis kode yang dapat diandalkan yang secara rekursif bisa berjalan pohon file dan merespons dengan tepat jika ada tautan simbolik melingkar.

Oh well, itu mengesampingkan java.io.File. Jika suatu file tidak dapat ditulis / ditambahkan, Anda mungkin tidak dapat mengetahui alasannya.


Kita dapat terus melihat tutorialnya: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common

Jika Anda memiliki semua baris yang akan Anda tulis (tambahkan) ke file teks sebelumnya , pendekatan yang disarankan adalah https://docs.oracle.com/javase/8/docs/api/java/nio/fio/files/Files.html# tulis-java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption ...-

Berikut ini contoh (disederhanakan):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, StandardCharsets.UTF_8);

Contoh lain (tambahkan):

Path file = ...;
List<String> linesInMemory = ...;
Files.write(file, linesInMemory, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE);

Jika Anda ingin menulis konten file saat berjalan : https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java .nio.charset.Charset-java.nio.file.OpenOption ...-

Contoh sederhana (Java 8 atau lebih tinggi):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file)) {
    writer.append("Zero header: ").append('0').write("\r\n");
    [...]
}

Contoh lain (tambahkan):

Path file = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) {
    writer.write("----------");
    [...]
}

Metode-metode ini membutuhkan usaha minimal dari pihak penulis dan harus disukai semua orang lain ketika menulis ke file [teks].

afk5min
sumber
'Jika suatu file tidak dapat ditulis / ditambahkan, Anda mungkin tidak dapat mengetahui mengapa' tidak benar. Anda akan tahu persis mengapa, dari teks FileNotFoundExceptionyang dilemparkan ketika operasi gagal.
Marquis of Lorne
"Banyak metode yang tidak melempar pengecualian ketika gagal, jadi tidak mungkin mendapatkan pesan kesalahan yang berguna. Misalnya, jika penghapusan file gagal, program akan menerima" hapus gagal "tetapi tidak akan tahu apakah itu karena file tidak ada, pengguna tidak memiliki izin, atau ada masalah lain. "
afk5min
Baca apa yang saya tulis. ' Jika suatu file tidak dapat ditulis / ditambahkan, Anda bahkan mungkin tidak dapat memperoleh pesan kesalahan yang berguna' salah, karena alasan yang saya nyatakan, dan tetap demikian. Anda mengubah topik pembicaraan. Subjek Anda sendiri.
Marquis of Lorne
Saya akan memeriksa implementasi built-in untuk sistem file tipikal (yang akan di OpenJDK, tapi saya tidak punya alasan untuk berpikir bagian ini akan berbeda dalam Oracle JDK berpemilik, atau secara signifikan berbeda dalam JDK milik IBM, antara lain) dan memperbarui jawaban saya berdasarkan temuan ini. Komentar Anda memang masuk akal - hanya karena 'banyak metode' mungkin memiliki masalah, penulis dengan jelas menyatakan bahwa hanya menulis / menambahkan untuk mengajukan operasi yang mereka pedulikan.
afk5min
Alasannya adalah karena tidak ada metode yang Anda panggil gagal untuk melemparkan pengecualian yang sesuai yang berisi pesan kesalahan yang sesuai. Jika Anda memiliki sampel tandingan yang mendukung pernyataan Anda, terserah Anda untuk menyediakannya.
Marquis of Lorne
16

Jika Anda ingin memiliki pengalaman yang relatif bebas rasa sakit, Anda juga dapat melihat paket Apache Commons IO , lebih khusus FileUtilskelasnya .

Jangan pernah lupa untuk memeriksa perpustakaan pihak ketiga. Joda-Time untuk manipulasi tanggal, Apache Commons LangStringUtils untuk operasi string umum dan semacamnya dapat membuat kode Anda lebih mudah dibaca.

Java adalah bahasa yang hebat, tetapi pustaka standar terkadang agak rendah. Tetap kuat, tapi level rendah.

ekstraneon
sumber
1
Metode penulisan file yang paling sederhana FileUtilsadalah static void write(File file, CharSequence data). Contoh penggunaan: import org.apache.commons.io.FileUtils; FileUtils.write(new File("example.txt"), "string with data");. FileUtilsjuga memiliki writeLines, yang mengambil Collectiongaris.
Rory O'Kane
12

Jika Anda karena alasan tertentu ingin memisahkan tindakan membuat dan menulis, setara Java touchadalah

try {
   //create a file named "testfile.txt" in the current working directory
   File myFile = new File("testfile.txt");
   if ( myFile.createNewFile() ) {
      System.out.println("Success!");
   } else {
      System.out.println("Failure!");
   }
} catch ( IOException ioe ) { ioe.printStackTrace(); }

createNewFile()melakukan pemeriksaan keberadaan dan file buat secara atom. Ini bisa bermanfaat jika Anda ingin memastikan bahwa Anda adalah pembuat file sebelum menulis, misalnya.

Mark Peters
sumber
1
[sentuh] juga memperbarui stempel waktu file sebagai efek samping (jika sudah ada). Apakah ini juga memiliki efek samping itu?
Kera-inago
@ Ape-inago: Pada sistem saya, tentu saja tidak (hanya mengembalikan false dan tidak berpengaruh pada file). Saya tidak bermaksud touchdalam arti umum tetapi lebih pada penggunaan sekunder umum untuk membuat file tanpa menulis data untuk itu. Tujuan sentuhan yang didokumentasikan adalah untuk memperbarui stempel waktu pada file. Membuat file jika tidak ada sebenarnya adalah efek samping, dan dapat dinonaktifkan dengan sakelar.
Mark Peters
Untuk beberapa alasan seperti apa? Ini exists()/createNewFile()urutan secara harfiah membuang-buang waktu dan ruang.
Marquis of Lorne
12

Berikut adalah beberapa cara yang memungkinkan untuk membuat dan menulis file di Java:

Menggunakan FileOutputStream

try {
  File fout = new File("myOutFile.txt");
  FileOutputStream fos = new FileOutputStream(fout);
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
  bw.write("Write somthing to the file ...");
  bw.newLine();
  bw.close();
} catch (FileNotFoundException e){
  // File was not found
  e.printStackTrace();
} catch (IOException e) {
  // Problem when writing to the file
  e.printStackTrace();
}

Menggunakan FileWriter

try {
  FileWriter fw = new FileWriter("myOutFile.txt");
  fw.write("Example of content");
  fw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

Menggunakan PrintWriter

try {
  PrintWriter pw = new PrintWriter("myOutFile.txt");
  pw.write("Example of content");
  pw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

Menggunakan OutputStreamWriter

try {
  File fout = new File("myOutFile.txt");
  FileOutputStream fos = new FileOutputStream(fout);
  OutputStreamWriter osw = new OutputStreamWriter(fos);
  osw.write("Soe content ...");
  osw.close();
} catch (FileNotFoundException e) {
  // File not found
  e.printStackTrace();
} catch (IOException e) {
  // Error when writing to the file
  e.printStackTrace();
}

Untuk lebih lanjut periksa tutorial ini tentang Cara membaca dan menulis file di Jawa .

Mehdi
sumber
Hanya ingin tahu ... bukankah seharusnya FileWriteratau OutputStreamWriterditutup pada akhirnya blok?
Wolfgang Schreurs
@ WolfgangSchreurs, Ya, bahkan lebih baik, saya harus memindahkan deklarasi variabel di luar blok coba untuk dapat melakukan itu.
Mehdi
Saya baru tahu bahwa menggunakan auto-closable jika lebih bersih, tidak perlu mendeklarasikan variabel di luar blok dan sumber daya akan ditutup secara otomatis bahkan jika pengecualian terjadi (perlu secara eksplisit menambahkan akhirnya blok). Lihat: docs.oracle.com/javase/tutorial/essential/exceptions/…
Wolfgang Schreurs
Saya akan menambahkan coba-dengan-sumber daya sebagai contoh terpisah (untuk memisahkan berbagai kemungkinan). Anda tahu SOF adalah situs web kolaboratif, silakan dan modifikasi jawaban jika Anda menginginkannya.
Mehdi
10

Menggunakan:

JFileChooser c = new JFileChooser();
c.showOpenDialog(c);
File writeFile = c.getSelectedFile();
String content = "Input the data here to be written to your file";

try {
    FileWriter fw = new FileWriter(writeFile);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.append(content);
    bw.append("hiiiii");
    bw.close();
    fw.close();
}
catch (Exception exc) {
   System.out.println(exc);
}
Rohit ZP
sumber
ini adalah cara termudah yang saya temukan ... semua masalah diselesaikan di sini dan hanya teks yang perlu dimasukkan
Rohit ZP
10

Cara terbaik adalah menggunakan Java7: Java 7 memperkenalkan cara baru untuk bekerja dengan filesystem, bersama dengan kelas utilitas baru - File. Menggunakan kelas Files, kita dapat membuat, memindahkan, menyalin, menghapus file dan direktori juga; itu juga dapat digunakan untuk membaca dan menulis ke file.

public void saveDataInFile(String data) throws IOException {
    Path path = Paths.get(fileName);
    byte[] strToBytes = data.getBytes();

    Files.write(path, strToBytes);
}

Menulis dengan FileChannel Jika Anda berurusan dengan file besar, FileChannel bisa lebih cepat daripada IO standar. Kode berikut menulis String ke file menggunakan FileChannel:

public void saveDataInFile(String data) 
  throws IOException {
    RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
    FileChannel channel = stream.getChannel();
    byte[] strBytes = data.getBytes();
    ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
    buffer.put(strBytes);
    buffer.flip();
    channel.write(buffer);
    stream.close();
    channel.close();
}

Menulis dengan DataOutputStream

public void saveDataInFile(String data) throws IOException {
    FileOutputStream fos = new FileOutputStream(fileName);
    DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
    outStream.writeUTF(data);
    outStream.close();
}

Menulis dengan FileOutputStream

Sekarang mari kita lihat bagaimana kita dapat menggunakan FileOutputStream untuk menulis data biner ke file. Kode berikut mengkonversi byte int String dan menulis byte ke file menggunakan FileOutputStream:

public void saveDataInFile(String data) throws IOException {
    FileOutputStream outputStream = new FileOutputStream(fileName);
    byte[] strToBytes = data.getBytes();
    outputStream.write(strToBytes);

    outputStream.close();
}

Menulis dengan PrintWriter kita dapat menggunakan PrintWriter untuk menulis teks berformat ke file:

public void saveDataInFile() throws IOException {
    FileWriter fileWriter = new FileWriter(fileName);
    PrintWriter printWriter = new PrintWriter(fileWriter);
    printWriter.print("Some String");
    printWriter.printf("Product name is %s and its price is %d $", "iPhone", 1000);
    printWriter.close();
}

Menulis dengan BufferedWriter: gunakan BufferedWriter untuk menulis sebuah String ke file baru:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
    writer.write(data);

    writer.close();
}

tambahkan sebuah String ke file yang ada:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
    writer.append(' ');
    writer.append(data);

    writer.close();
}
sajad abbasi
sumber
9

Saya pikir ini adalah cara terpendek:

FileWriter fr = new FileWriter("your_file_name.txt"); // After '.' write
// your file extention (".txt" in this case)
fr.write("Things you want to write into the file"); // Warning: this will REPLACE your old file content!
fr.close();
ben
sumber
8

Untuk membuat file tanpa menimpa file yang ada:

System.out.println("Choose folder to create file");
JFileChooser c = new JFileChooser();
c.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
c.showOpenDialog(c);
c.getSelectedFile();
f = c.getSelectedFile(); // File f - global variable
String newfile = f + "\\hi.doc";//.txt or .doc or .html
File file = new File(newfile);

try {
    //System.out.println(f);
    boolean flag = file.createNewFile();

    if(flag == true) {
        JOptionPane.showMessageDialog(rootPane, "File created successfully");
    }
    else {
        JOptionPane.showMessageDialog(rootPane, "File already exists");
    }
    /* Or use exists() function as follows:
        if(file.exists() == true) {
            JOptionPane.showMessageDialog(rootPane, "File already exists");
        }
        else {
            JOptionPane.showMessageDialog(rootPane, "File created successfully");
        }
    */
}
catch(Exception e) {
    // Any exception handling method of your choice
}
aashima
sumber
7
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample {
    public static void main(String [] args) {
        FileWriter fw= null;
        File file =null;
        try {
            file=new File("WriteFile.txt");
            if(!file.exists()) {
                file.createNewFile();
            }
            fw = new FileWriter(file);
            fw.write("This is an string written to a file");
            fw.flush();
            fw.close();
            System.out.println("File written Succesfully");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Anurag Goel
sumber
Ini exists()/createNewFile()urutan secara harfiah membuang-buang waktu dan ruang.
Marquis of Lorne
6
package fileoperations;
import java.io.File;
import java.io.IOException;

public class SimpleFile {
    public static void main(String[] args) throws IOException {
        File file =new File("text.txt");
        file.createNewFile();
        System.out.println("File is created");
        FileWriter writer = new FileWriter(file);

        // Writes the content to the file
        writer.write("Enter the text that you want to write"); 
        writer.flush();
        writer.close();
        System.out.println("Data is entered into file");
    }
}
Suthan Srinivasan
sumber
Ini exists()/createNewFile()urutan secara harfiah membuang-buang waktu dan ruang.
Marquis of Lorne
5

Hanya satu baris! pathdan lineStrings

import java.nio.file.Files;
import java.nio.file.Paths;

Files.write(Paths.get(path), lines.getBytes());
Ran Adler
sumber
Ahem, penulis secara spesifik menentukan file "teks". Dan file teks terdiri dari karakter. File biner terdiri dari byte. Selain itu, tidak jelas apa itu lines. Jika ya java.lang.String, maka panggilan getBytes()akan menghasilkan byte menggunakan platform default encoding, yang tidak terlalu baik dalam kasus umum.
afk5min
5

Cara paling sederhana yang bisa saya temukan:

Path sampleOutputPath = Paths.get("/tmp/testfile")
try (BufferedWriter writer = Files.newBufferedWriter(sampleOutputPath)) {
    writer.write("Hello, world!");
}

Mungkin hanya akan berfungsi untuk 1.7+.

qed
sumber
5

Layak dicoba untuk Java 7+:

 Files.write(Paths.get("./output.txt"), "Information string herer".getBytes());

Itu terlihat menjanjikan ...

Olu Smith
sumber
4

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.

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();
    }
}

Ada beberapa hal yang perlu diperhatikan:

  1. Itu selalu merupakan kebiasaan yang baik untuk menentukan pengkodean charset dan untuk itu kita memiliki konstanta di kelas StandardCharsets .
  2. Kode menggunakan try-with-resourcepernyataan 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 confidentialkita dapat menggunakan stream API di Jawa:

//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();
}
akhil_mittal
sumber
4

Membaca dan menulis file menggunakan input dan outputstream:

//Coded By Anurag Goel
//Reading And Writing Files
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class WriteAFile {
    public static void main(String args[]) {
        try {
            byte array [] = {'1','a','2','b','5'};
            OutputStream os = new FileOutputStream("test.txt");
            for(int x=0; x < array.length ; x++) {
                os.write( array[x] ); // Writes the bytes
            }
            os.close();

            InputStream is = new FileInputStream("test.txt");
            int size = is.available();

            for(int i=0; i< size; i++) {
                System.out.print((char)is.read() + " ");
            }
            is.close();
        } catch(IOException e) {
            System.out.print("Exception");
        }
    }
}
Anurag Goel
sumber
4

Cukup sertakan paket ini:

java.nio.file

Dan kemudian Anda dapat menggunakan kode ini untuk menulis file:

Path file = ...;
byte[] buf = ...;
Files.write(file, buf);
Peter Mortensen
sumber
4

Di Java 8 gunakan Files and Paths dan gunakan konstruksi try-with-resources.

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class WriteFile{
    public static void main(String[] args) throws IOException {
        String file = "text.txt";
        System.out.println("Writing to file: " + file);
        // Files.newBufferedWriter() uses UTF-8 encoding by default
        try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(file))) {
            writer.write("Java\n");
            writer.write("Python\n");
            writer.write("Clojure\n");
            writer.write("Scala\n");
            writer.write("JavaScript\n");
        } // the file will be automatically closed
    }
}
praveenraj4ever
sumber
3

Ada beberapa cara sederhana, seperti:

File file = new File("filename.txt");
PrintWriter pw = new PrintWriter(file);

pw.write("The world I'm coming");
pw.close();

String write = "Hello World!";

FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);

fw.write(write);

fw.close();
imvp
sumber
bwtidak digunakan.
Marquis of Lorne
Dan titik menimpa file dengan konten baru tidak disebutkan.
Marquis of Lorne
3

Anda bahkan dapat membuat file sementara menggunakan properti sistem , yang tidak tergantung pada OS yang Anda gunakan.

File file = new File(System.*getProperty*("java.io.tmpdir") +
                     System.*getProperty*("file.separator") +
                     "YourFileName.txt");
Muhammed Sayeed
sumber
2

Menggunakan perpustakaan Guava Google, kita dapat membuat dan menulis ke file dengan sangat mudah.

package com.zetcode.writetofileex;

import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;

public class WriteToFileEx {

    public static void main(String[] args) throws IOException {

        String fileName = "fruits.txt";
        File file = new File(fileName);

        String content = "banana, orange, lemon, apple, plum";

        Files.write(content.getBytes(), file);
    }
}

Contoh membuat fruits.txtfile baru di direktori root proyek.

Jan Bodnar
sumber
2

Membaca koleksi dengan pelanggan dan menyimpan ke file, dengan JFilechooser.

private void writeFile(){

    JFileChooser fileChooser = new JFileChooser(this.PATH);
    int retValue = fileChooser.showDialog(this, "Save File");

    if (retValue == JFileChooser.APPROVE_OPTION){

        try (Writer fileWrite = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileChooser.getSelectedFile())))){

            this.customers.forEach((c) ->{
                try{
                    fileWrite.append(c.toString()).append("\n");
                }
                catch (IOException ex){
                    ex.printStackTrace();
                }
            });
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}
hasskell
sumber
2

Setidaknya ada beberapa cara membuat file dan menulisnya:

File kecil (1.7)

Anda dapat menggunakan salah satu metode menulis untuk menulis byte, atau baris, ke file.

Path file = Paths.get("path-to-file");
byte[] buf = "text-to-write-to-file".;
Files.write(file, buf);

Metode ini menangani sebagian besar pekerjaan untuk Anda, seperti membuka dan menutup aliran, tetapi tidak dimaksudkan untuk menangani file besar.

Menulis File yang lebih besar dengan Menggunakan Buffered Stream I / O (1.7)

The java.nio.filepaket mendukung menyalurkan I / O, yang bergerak data dalam buffer, melewati beberapa lapisan yang dapat bottleneck streaming I / O.

String s = "much-larger-text-to-write-to-file";
try (BufferedWriter writer = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
    writer.write(s, 0, s.length());
}

Pendekatan ini lebih disukai karena kinerjanya yang efisien terutama ketika menyelesaikan sejumlah besar operasi penulisan. Operasi yang disangga memiliki efek ini karena mereka tidak diharuskan memanggil metode penulisan sistem operasi untuk setiap byte tunggal, mengurangi operasi I / O yang mahal.

Menggunakan NIO API untuk menyalin (dan membuat yang baru) file dengan Outputstream (1.7)

Path oldFile = Paths.get("existing-file-path");
Path newFile = Paths.get("new-file-path");
try (OutputStream os = new FileOutputStream(newFile.toFile())) {
    Files.copy(oldFile, os);
}

Ada juga metode tambahan yang memungkinkan untuk menyalin semua byte dari aliran input ke file.

Penulis File (teks) (<1.7)

Menulis langsung ke file (kinerja kurang) dan harus digunakan hanya ketika jumlah penulisan kurang. Digunakan untuk menulis data yang berorientasi karakter ke file.

String s= "some-text";
FileWriter fileWriter = new FileWriter("C:\\path\\to\\file\\file.txt");
fileWriter.write(fileContent);
fileWriter.close();

FileOutputStream (binary) (<1,7)

FileOutputStream dimaksudkan untuk menulis aliran byte mentah seperti data gambar.

byte data[] = "binary-to-write-to-file".getBytes();
FileOutputStream out = new FileOutputStream("file-name");
out.write(data);
out.close();

Dengan pendekatan ini orang harus mempertimbangkan untuk selalu menulis array byte daripada menulis satu byte pada suatu waktu. Speedup bisa sangat signifikan - hingga 10 x lebih tinggi atau lebih. Oleh karena itu, disarankan untuk menggunakan write(byte[])metode ini kapan pun memungkinkan.

Piotr Niewinski
sumber