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?

Justin White
sumber

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.

Jeremy Smyth
sumber
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.

Jon
sumber
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);
}
Jorn
sumber
@ 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

Daniil Shevelev
sumber
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)
    {
    }
}
Artem Barger
sumber
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.

skaffman
sumber
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();
        }
    }
}
Adam Wagner
sumber
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);
Marcel
sumber
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
}
Spina
sumber
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>
Anirban Chakrabarti
sumber
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();
        }
    }
}
Pavel_H
sumber
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);
Ran Adler
sumber
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.

Sean H. Worthington
sumber
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 ;
    }
};
Mostafa Rezaei
sumber
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);
}
BullyWiiPlaza
sumber
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());
GoYun.Info
sumber
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.

bhathiya-perera
sumber
@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();
     }
   }
}

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

}

Jobin Mathew
sumber
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.

alb-i986
sumber
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);
        }

    });
Spesialis QA
sumber
-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;
}
牟家宏
sumber
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);     
    }   
}
Paulo Brito
sumber
Anda dapat membiarkan banyak sumber daya terbuka. Tolong, ini praktik yang buruk, jangan lakukan ini.
Boris Brodski