Bagaimana cara menyimpan String ke file teks menggunakan Java?


699

Di Jawa, saya memiliki teks dari bidang teks dalam variabel String yang disebut "teks".

Bagaimana saya bisa menyimpan konten variabel "teks" ke file?

Jawaban:


727

Jika Anda hanya menghasilkan teks, daripada data biner apa pun, yang berikut ini akan berfungsi:

PrintWriter out = new PrintWriter("filename.txt");

Kemudian, tulis String Anda ke sana, sama seperti yang Anda lakukan pada aliran output apa pun:

out.println(text);

Anda akan memerlukan penanganan pengecualian, seperti biasa. Pastikan untuk menelepon out.close()saat Anda selesai menulis.

Jika Anda menggunakan Java 7 atau lebih baru, Anda dapat menggunakan "pernyataan try-with-resources " yang akan secara otomatis menutup Anda PrintStreamketika Anda selesai menggunakannya (mis. Keluar dari blok) seperti:

try (PrintWriter out = new PrintWriter("filename.txt")) {
    out.println(text);
}

Anda masih harus melempar secara eksplisit java.io.FileNotFoundExceptionseperti sebelumnya.


4
@Justin, Anda juga bisa melewati jalur absolut (mis. "/Tmp/filename.txt") ke konstruktor FileOutputStream, untuk menyimpan file di mana pun Anda inginkan
Jonik

7
Btw, ini bisa disederhanakan menggunakan kenyamanan konstruktor yang sudah dimiliki PrintStream sejak 1.5. Ini sudah cukup: PrintStream out = PrintStream baru ("filename.txt");
Jonik

10
Perlu menutup file itu di beberapa titik ...? codecodex.com/wiki/ASCII_file_save#Java
JStrahl

2
Anda ingin menggunakan coba {} catch () {} akhirnya {}, di mana pada akhirnya {} Anda menutup file jika bukan nol.
Benas

23
Di java8 Anda dapat mencoba (PrintStream ps = new PrintStream ("nama file")) {ps.println (out); } ini akan menangani dekat untuk Anda
Anton Chikin

245

Apache Commons IO berisi beberapa metode hebat untuk melakukan ini, khususnya FileUtils berisi metode berikut:

static void writeStringToFile(File file, String data) 

yang memungkinkan Anda untuk menulis teks ke file dalam satu panggilan metode:

FileUtils.writeStringToFile(new File("test.txt"), "Hello File");

Anda mungkin juga ingin mempertimbangkan untuk menentukan penyandian file.


10
Hanya koreksi kecil, fragmen kedua seharusnya berbunyi: FileUtils.writeStringToFile (File baru ("test.txt"), "Hello File");
pm_labs

3
Bagi kita yang lebih suka jambu biji, itu bisa melakukan ini juga .
Jonik

10
Fungsi ini sekarang sudah tidak digunakan lagi, Anda harus menambahkan charset default ->FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8"));
Paul Fournel

97

Lihatlah Java File API

contoh cepat:

try (PrintStream out = new PrintStream(new FileOutputStream("filename.txt"))) {
    out.print(text);
}

@ XP1 Saya tahu, itu peningkatan yang bagus. Saya telah menggunakan Lombok untuk ini di Jawa 6: langsung saja @Cleanup new FileOutputStream(...)dan Anda sudah selesai.
Jorn

6
Jangan lupa menelepon. Flush (); lalu out.close ();
Alex Byrth

@AlexByrth kenapa harus dia?
Andrew Tobilko

1
File besar direkam di latar belakang (utas lainnya) dan luangkan waktu untuk merekam. Call flush () memastikan bahwa semuanya telah ditulis pada baris berikutnya, menyinkronkan operasi. Tapi ini opsional , tetapi praktik yang baik jika Anda menangani file besar, sebagai log.
Alex Byrth

1
Perhatikan bahwa out.close () sudah mengguyur aliran, yang berarti tidak perlu memanggil out.flush ().
hjk321

90

Di Java 7 Anda dapat melakukan ini:

String content = "Hello File!";
String path = "C:/a.txt";
Files.write( Paths.get(path), content.getBytes());

Ada info lebih lanjut di sini: http://www.drdobbs.com/jvm/java-se-7-new-file-io/231600403


3
Jika seseorang kemudian bertanya-tanya, pengkodean akan menjadi standar platform.
Haakon Løtveit

5
content.getBytes(StandardCharsets.UTF_8)dapat digunakan untuk secara eksplisit mendefinisikan pengkodean.
John29

1
Perhatikan bahwa StandardOpenOption.CREATE bukan yang standar, StandardOpenOption.CREATE dan StandardOpenOption.TRUNCATE_EXISTING adalah default. Untuk menggunakan default, hapus saja parameter ketiga.
Tinus Tate

Silakan lihat komentar Tinus Tate! Bagaimana proses untuk mengedit contoh ini? Saya bertanya-tanya berapa ribu orang yang telah mengambil contoh ini apa adanya - hanya untuk menemukan bahwa mereka memiliki hasil yang tidak terduga ketika mereka menimpa file dengan string yang lebih pendek. Seperti yang ditunjukkan oleh Tinus, TRUNCATE_EXISTING sangat penting kecuali jika Anda benar-benar memahami dan memiliki alasan sebenarnya karena tidak ingin memotong file yang ada saat menimpa dengan string yang lebih pendek.
jch

1
Di java 11 Anda cukup meletakkan String sebagai parameter kedua! Hore!
Dennis Glot

78

Baru saja melakukan hal serupa di proyek saya. Gunakan FileWriter akan menyederhanakan bagian dari pekerjaan Anda. Dan di sini Anda dapat menemukan tutorial yang bagus .

BufferedWriter writer = null;
try
{
    writer = new BufferedWriter( new FileWriter( yourfilename));
    writer.write( yourstring);

}
catch ( IOException e)
{
}
finally
{
    try
    {
        if ( writer != null)
        writer.close( );
    }
    catch ( IOException e)
    {
    }
}

4
Menghapus semua coba / tangkap dan sederhanakan saya juga dapat melakukannya dalam satu baris hanya dengan melakukan: (BufferedWriter baru (FileWriter baru (nama file)))). Write (str);
Artem Barger

6
Jadi, tunjukkan solusi sederhana dan menyenangkan Anda. Saya akan senang belajar bagaimana melakukannya dengan cara yang lebih baik.
Artem Barger

4
Abaikan para troll ... mereka selalu mengkritik tanpa menawarkan solusi mereka sendiri. Terima kasih telah menyelamatkan saya dari menulis kode saya sendiri / mengunduh perpustakaan tambahan & memperkenalkan ketergantungan ...
nikib3ro

1
Tampaknya .close()tidak melempar (setidaknya di Java 7?), Apakah trycatch terakhir mungkin berlebihan?
Kos

16
Menelan pengecualian seperti itu akan membuat hidupmu sulit ketika pengecualian benar-benar terjadi. Paling tidak Anda harus memikirkan kembali mereka:throw new RuntimeException(e);
Roger Keays

65

Gunakan FileUtils.writeStringToFile()dari Apache Commons IO . Tidak perlu menemukan kembali roda khusus ini.


20
Saya tidak bisa tidak setuju lagi. Perpustakaan ini ada di sana sehingga kami tidak memperkenalkan bug halus dalam solusi yang begitu sederhana.
skaffman

3
Tidak, jelas tidak. Saya hanya tidak setuju bahwa solusi Anda mungkin bukan hal pertama yang saya lemparkan pada seseorang yang merupakan programmer Java pemula. Anda tidak menyarankan bahwa Anda belum pernah menulis hal seperti itu, bukan?
duffymo

8
Sudah, ya, tapi itu sebelum saya menemukan commons-io. Sejak menemukan itu, saya tidak pernah menulis hal semacam itu dengan tangan, bahkan dalam proyek satu kelas. Jika saya mengetahuinya sejak hari pertama, saya akan menggunakannya sejak hari pertama.
skaffman

5
Tepat, tetapi Anda adalah pengembang yang berpengalaman. Biografi Anda mengatakan bahwa Anda adalah pengguna JBOSS / Spring, tetapi tentu saja Anda tidak akan mencapai yang terbaik dalam upaya "Halo, Dunia" pertama Anda. Saya tidak setuju dengan penggunaan perpustakaan yang tepat. Saya mengatakan bahwa orang yang mencoba bahasa untuk pertama kalinya harus mencoba mengetahuinya di bagian bawah, bahkan jika itu berarti melakukan hal-hal yang akan mereka buang nanti ketika mereka berpengalaman dan tahu lebih baik.
duffymo

2
Saya menerapkan ini tanpa commons dan mendapat pengecualian yang jelas. Saya kemudian menerapkan ini menggunakan commons dan itu memberi tahu saya apa yang salah. Moral dari kisah ini: mengapa hidup di zaman kegelapan jika Anda tidak harus melakukannya?
SilentNot

22

Anda dapat menggunakan modifikasi kode di bawah ini untuk menulis file Anda dari kelas atau fungsi apa pun yang menangani teks. Orang bertanya-tanya mengapa dunia membutuhkan editor teks baru ...

import java.io.*;

public class Main {

    public static void main(String[] args) {

        try {
            String str = "SomeMoreTextIsHere";
            File newTextFile = new File("C:/thetextfile.txt");

            FileWriter fw = new FileWriter(newTextFile);
            fw.write(str);
            fw.close();

        } catch (IOException iox) {
            //do stuff with exception
            iox.printStackTrace();
        }
    }
}

2
Itu tidak menutup file jika ada pengecualian.
Tom Hawtin - tackline

1
@JanusTroelsen: Jika ditolak, kutip Pernyataan coba-dengan-sumber daya .
trashgod

22

Dalam Java 11 yang java.nio.file.Fileskelas diperpanjang dengan dua metode utilitas baru untuk menulis string ke dalam file. Metode pertama (lihat JavaDoc di sini ) menggunakan charset UTF-8 sebagai default:

Files.writeString(Path.of("my", "path"), "My String");

Dan metode kedua (lihat JavaDoc di sini ) memungkinkan untuk menentukan charset individual:

Files.writeString(Path.of("my", "path"), "My String", StandardCharset.ISO_8859_1);

Kedua metode memiliki parameter Varargs opsional untuk mengatur opsi penanganan file (lihat JavaDoc di sini ). Contoh berikut akan membuat file yang tidak ada atau menambahkan string ke yang sudah ada:

Files.writeString(Path.of("my", "path"), "String to append", StandardOpenOption.CREATE, StandardOpenOption.APPEND);

13

Saya lebih suka mengandalkan perpustakaan bila memungkinkan untuk operasi semacam ini. Ini membuat saya cenderung tidak sengaja menghilangkan langkah penting (seperti kesalahan yang dilakukan oleh wolfsnipes di atas). Beberapa perpustakaan disarankan di atas, tetapi favorit saya untuk hal semacam ini adalah Google Guava . Guava memiliki kelas yang disebut File yang berfungsi dengan baik untuk tugas ini:

// This is where the file goes.
File destination = new File("file.txt");
// This line isn't needed, but is really useful 
// if you're a beginner and don't know where your file is going to end up.
System.out.println(destination.getAbsolutePath());
try {
    Files.write(text, destination, Charset.forName("UTF-8"));
} catch (IOException e) {
    // Useful error handling here
}

2
Jika Anda menggunakan Jambu Biji, ada juga Charsets.UTF-8.
florian

2
@ florian: Charsets.UTF_8Sebenarnya
Tim Büthe

Folder induk harus ada. Contoh: destination.mkdirs ().
AlikElzin-kilaka

2
Files.write (CharSequence from, File to, Charset charset) tidak digunakan lagi dalam jambu 26.0.
Donald Duck

Alternatif Guava modern untuk Files.write yang sudah tidak digunakan lagi: Files.asCharSink(file, charset).write(text)
Vadzim

12

Gunakan api Apache Commons IO. Itu mudah

Gunakan API sebagai

 FileUtils.writeStringToFile(new File("FileNameToWrite.txt"), "stringToWrite");

Ketergantungan Maven

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

12

Jika Anda perlu membuat file teks berdasarkan satu string tunggal:

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

public class StringWriteSample {
    public static void main(String[] args) {
        String text = "This is text to be saved in file";

        try {
            Files.write(Paths.get("my-file.txt"), text.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Files.write (path, byte []) akan menggunakan pengkodean UTF-8. String.getBytes () menggunakan pengkodean platform default. Jadi ini adalah masalah potensial. Gunakan string.getBytes (StandardCharsets.UTF_8)!
rmuller

11

Gunakan ini, sangat mudah dibaca:

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

Files.write(Paths.get(path), lines.getBytes(), StandardOpenOption.WRITE);

Ini juga merupakan salinan dari jawaban yang ada. : c
james.garriss

2
maaf tapi saya tidak menciptakan java8, saya bukan satu-satunya yang menggunakan baris ini. tetapi ini bukan salinan dari jawaban lain untuk pertanyaan yang sama
Ran Adler

10
import java.io.*;

private void stringToFile( String text, String fileName )
 {
 try
 {
    File file = new File( fileName );

    // if file doesnt exists, then create it 
    if ( ! file.exists( ) )
    {
        file.createNewFile( );
    }

    FileWriter fw = new FileWriter( file.getAbsoluteFile( ) );
    BufferedWriter bw = new BufferedWriter( fw );
    bw.write( text );
    bw.close( );
    //System.out.println("Done writing to " + fileName); //For testing 
 }
 catch( IOException e )
 {
 System.out.println("Error: " + e);
 e.printStackTrace( );
 }
} //End method stringToFile

Anda dapat memasukkan metode ini ke dalam kelas Anda. Jika Anda menggunakan metode ini di kelas dengan metode utama, ubah kelas ini menjadi statis dengan menambahkan kata kunci statis. Apa pun caranya, Anda perlu mengimpor java.io. * untuk membuatnya berfungsi jika tidak, File, FileWriter dan BufferedWriter tidak akan dikenali.


10

Anda bisa melakukan ini:

import java.io.*;
import java.util.*;

class WriteText
{
    public static void main(String[] args)
    {   
        try {
            String text = "Your sample content to save in a text file.";
            BufferedWriter out = new BufferedWriter(new FileWriter("sample.txt"));
            out.write(text);
            out.close();
        }
        catch (IOException e)
        {
            System.out.println("Exception ");       
        }

        return ;
    }
};

10

Menggunakan Java 7:

public static void writeToFile(String text, String targetFilePath) throws IOException
{
    Path targetPath = Paths.get(targetFilePath);
    byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
    Files.write(targetPath, bytes, StandardOpenOption.CREATE);
}

Sebuah kata bijak - ini akan membuat file baru jika tidak ada, tetapi akan menimpa karakter dari file yang ada jika ada. Jika data baru lebih kecil, itu berarti Anda mungkin membuat file yang rusak. Tanya saya bagaimana saya tahu!
Chris Rae

Ok, bagaimana kamu tahu?
ojblass

Cukup gunakan Files.write(targetPath, bytes);untuk menimpa file itu. Ini akan berfungsi seperti yang diharapkan.
BullyWiiPlaza

8

Menggunakan org.apache.commons.io.FileUtils:

FileUtils.writeStringToFile(new File("log.txt"), "my string", Charset.defaultCharset());

6

Jika Anda hanya ingin mendorong satu blok teks ke file, ini akan menimpa setiap kali.

JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
    FileOutputStream stream = null;
    PrintStream out = null;
    try {
        File file = chooser.getSelectedFile();
        stream = new FileOutputStream(file); 
        String text = "Your String goes here";
        out = new PrintStream(stream);
        out.print(text);                  //This will overwrite existing contents

    } catch (Exception ex) {
        //do something
    } finally {
        try {
            if(stream!=null) stream.close();
            if(out!=null) out.close();
        } catch (Exception ex) {
            //do something
        }
    }
}

Contoh ini memungkinkan pengguna untuk memilih file menggunakan pemilih file.


@Eric Leschinski: terima kasih telah membuat jawaban saya lebih profesional (saya juga berasumsi ini adalah persis apa yang diinginkan OP karena ini adalah apa yang sebenarnya diinginkan kebanyakan orang, hanya membuang teks dan menggantinya)
bhathiya-perera

2
Setelah pertanyaan asli dijawab dan OP puas dan sudah lama hilang, halaman seperti ini hanya berfungsi sebagai artefak yang berguna bagi orang-orang yang mendarat di sini dari pencarian Google. Saya mendarat di halaman ini untuk membuat append teks mini ke file. Jadi bagus untuk berbicara kepada seluruh audiens daripada OP setelah OP pindah.
Eric Leschinski

3

Lebih baik untuk menutup penulis / keluaran di blok akhirnya, kalau-kalau terjadi sesuatu

finally{
   if(writer != null){
     try{
        writer.flush();
        writer.close();
     }
     catch(IOException ioe){
         ioe.printStackTrace();
     }
   }
}

1
bahkan lebih baik: gunakan coba-dengan-sumber daya
Janus Troelsen

Ya, @JanusTroelsen benar, lebih baik gunakan Pernyataan pernyataan coba-dengan sumber daya docs.oracle.com/javase/tutorial/essential/exceptions/…

2
private static void generateFile(String stringToWrite, String outputFile) {
try {       
    FileWriter writer = new FileWriter(outputFile);
    writer.append(stringToWrite);
    writer.flush();
    writer.close();
    log.debug("New File is generated ==>"+outputFile);
} catch (Exception exp) {
    log.error("Exception in generateFile ", exp);
}

}


1
Sementara cuplikan kode ini mungkin solusinya, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
Johan

close () mungkin tidak pernah dipanggil. Harap perbaiki jawaban Anda dengan menambahkan penanganan kasus kesalahan yang tepat.
Boris Brodski

0

Saya pikir cara terbaik menggunakan Files.write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options):

String text = "content";
Path path = Paths.get("path", "to", "file");
Files.write(path, Arrays.asList(text));

Lihat javadoc :

Tulis baris teks ke file. Setiap baris adalah urutan char dan ditulis ke file secara berurutan dengan setiap baris diakhiri oleh pemisah baris platform, seperti yang didefinisikan oleh line.separator properti sistem. Karakter dikodekan ke dalam byte menggunakan charset yang ditentukan.

Parameter opsi menentukan bagaimana file dibuat atau dibuka. Jika tidak ada opsi, maka metode ini berfungsi seolah-olah opsi CREATE, TRUNCATE_EXISTING, dan WRITE hadir. Dengan kata lain, itu membuka file untuk menulis, membuat file jika tidak ada, atau awalnya memotong file biasa yang ada ke ukuran 0. Metode ini memastikan bahwa file ditutup ketika semua baris telah ditulis ( atau kesalahan I / O atau pengecualian runtime lainnya dilemparkan). Jika kesalahan I / O terjadi maka ia dapat melakukannya setelah file dibuat atau terpotong, atau setelah beberapa byte ditulis ke file.

Tolong dicatat. Saya melihat orang-orang sudah menjawab dengan built-in Java Files.write, tetapi apa yang istimewa dalam jawaban saya yang tampaknya tidak ada yang menyebutkan adalah versi overload dari metode yang mengambil Iterable dari CharSequence (yaitu String), bukan byte[]array, sehingga text.getBytes()tidak diperlukan , yang agak bersih menurut saya.


0

Jika Anda ingin menjaga karakter carriage return dari string ke dalam file di sini adalah contoh kode:

    jLabel1 = new JLabel("Enter SQL Statements or SQL Commands:");
    orderButton = new JButton("Execute");
    textArea = new JTextArea();
    ...


    // String captured from JTextArea()
    orderButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            // When Execute button is pressed
            String tempQuery = textArea.getText();
            tempQuery = tempQuery.replaceAll("\n", "\r\n");
            try (PrintStream out = new PrintStream(new FileOutputStream("C:/Temp/tempQuery.sql"))) {
                out.print(tempQuery);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(tempQuery);
        }

    });

-1

Cara saya didasarkan pada streaming karena berjalan di semua versi Android dan kebutuhan sumber daya fecthing seperti URL / URI, ada saran dipersilahkan.

Sejauh yang terkait, stream (InputStream dan OutputStream) mentransfer data biner, ketika pengembang menulis string ke stream, pertama-tama harus mengubahnya menjadi byte, atau dengan kata lain menyandikannya.

public boolean writeStringToFile(File file, String string, Charset charset) {
    if (file == null) return false;
    if (string == null) return false;
    return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
}

public boolean writeBytesToFile(File file, byte[] data) {
    if (file == null) return false;
    if (data == null) return false;
    FileOutputStream fos;
    BufferedOutputStream bos;
    try {
        fos = new FileOutputStream(file);
        bos = new BufferedOutputStream(fos);
        bos.write(data, 0, data.length);
        bos.flush();
        bos.close();
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
        Logger.e("!!! IOException");
        return false;
    }
    return true;
}

1
Harap tambahkan penanganan kasus kesalahan yang tepat dengan menutup semua sumber daya terbuka dan memberikan pengecualian
Boris Brodski

Maukah Anda berbagi kasus penanganan kode seperti yang Anda rekomendasikan, terima kasih.
牟家宏

-1

Anda dapat menggunakan ArrayList untuk meletakkan semua isi TextArea sebagai contoh, dan mengirim sebagai parameter dengan memanggil save, karena penulis hanya menulis baris string, maka kita menggunakan baris "untuk" baris demi baris untuk menulis ArrayList pada akhirnya kami akan konten TextArea dalam file txt. jika ada yang tidak masuk akal, saya minta maaf adalah penerjemah google dan saya yang tidak bisa berbahasa inggris.

Tonton Notepad Windows, itu tidak selalu lompat garis, dan menunjukkan semua dalam satu baris, gunakan Wordpad ok.


private void SaveActionPerformed(java.awt.event.ActionEvent evt) {

    String NameFile = Name.getText();
    ArrayList< String > Text = new ArrayList< String >();

    Text.add(TextArea.getText());

    SaveFile(NameFile, Text);
}

public void SaveFile(String name, ArrayList< String> message) {

    path = "C:\\Users\\Paulo Brito\\Desktop\\" + name + ".txt";

    File file1 = new File(path);

    try {

        if (!file1.exists()) {

            file1.createNewFile();
        }


        File[] files = file1.listFiles();


        FileWriter fw = new FileWriter(file1, true);

        BufferedWriter bw = new BufferedWriter(fw);

        for (int i = 0; i < message.size(); i++) {

            bw.write(message.get(i));
            bw.newLine();
        }

        bw.close();
        fw.close();

        FileReader fr = new FileReader(file1);

        BufferedReader br = new BufferedReader(fr);

        fw = new FileWriter(file1, true);

        bw = new BufferedWriter(fw);

        while (br.ready()) {

            String line = br.readLine();

            System.out.println(line);

            bw.write(line);
            bw.newLine();

        }
        br.close();
        fr.close();

    } catch (IOException ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(null, "Error in" + ex);     
    }   
}

Anda dapat membiarkan banyak sumber daya terbuka. Tolong, ini praktik yang buruk, jangan lakukan ini.
Boris Brodski
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.