Bir dizeyi Java kullanarak bir metin dosyasına nasıl kaydedebilirim?


699

Java, "metin" adlı bir String değişkeni bir metin alanından metin var.

"Metin" değişkeninin içeriğini bir dosyaya nasıl kaydedebilirim?

Yanıtlar:


727

Herhangi bir ikili veri yerine metin çıktısı alıyorsanız, aşağıdakiler işe yarar:

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

Ardından, herhangi bir çıktı akışında yaptığınız gibi Dizenizi ona yazın:

out.println(text);

Her zamanki gibi istisna işlemeye ihtiyacınız olacak. out.close()Yazmayı bitirdiğinizde aradığınızdan emin olun .

Java 7 veya üstünü kullanıyorsanız, işiniz bittiğinde (yani bloktan çıktığınızda) otomatik olarak kapanacak olan " kaynaklarla dene " ifadesini kullanabilirsiniz PrintStream:

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

Yine de java.io.FileNotFoundExceptiondaha önce olduğu gibi açıkça atmanız gerekir .


4
@ Justin, dosyayı istediğiniz yere kaydetmek için FileOutputStream yapıcısına mutlak bir yol da (ör. "/Tmp/filename.txt")
iletebilirsiniz

7
Btw, bu PrintStream 1.5'ten beri sahip olduğu kolaylık kurucuları kullanılarak basitleştirilebilir. Bu yeterli olacaktır: PrintStream out = new PrintStream ("dosyaadı.txt");
Jonik

10
Bu dosyayı bir noktada kapatmanız mı gerekiyor? codecodex.com/wiki/ASCII_file_save#Java
JStrahl

2
{} Catch () {} nihayet {} kullanmayı deneyin, burada nihayetinde {} boş değilse dosyayı kapatın.
Benas

23
Java8'de (PrintStream ps = yeni PrintStream ("dosyaadı")) {ps.println (out); } bu sizin için kapanış yapacak
Anton Chikin

245

Apache Commons IO bunu yapmak için bazı harika yöntemler içerir, özellikle FileUtils aşağıdaki yöntemi içerir:

static void writeStringToFile(File file, String data) 

bir yöntem çağrısında dosyaya metin yazmanıza olanak tanır:

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

Ayrıca, dosyanın kodlamasını da belirlemeyi düşünebilirsiniz.


10
Sadece küçük bir düzeltme, ikinci parça şöyle olmalıdır: FileUtils.writeStringToFile (yeni Dosya ("test.txt"), "Merhaba Dosya");
pm_labs

3
Guava'yı tercih edenler için bunu da yapabiliriz .
Jonik

10
İşlev artık kullanımdan kaldırıldı, varsayılan karakter kümesini eklemelisiniz ->FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8"));
Paul Fournel

97

Java Dosya API'sına bir göz atın

hızlı bir örnek:

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

@ XP1 Biliyorum, bu büyük bir gelişme. Lombok'u bunun için Java 6'da kullandım: sadece gidin @Cleanup new FileOutputStream(...)ve işiniz bitti.
Jorn

6
Out.flush () işlevini çağırmayı unutmayın. sonra out.close ();
Alex Byrth

@AlexByrth neden o?
Andrew Tobilko

1
Büyük dosyalar arka planda (başka bir iş parçacığı) kaydedilir ve kaydedilmesi zaman alır. Flush () işlevinin çağrılması, işlemin senkronize edilmesi için her şeyin bir sonraki satıra yazılmasını sağlar. Ancak bu isteğe bağlıdır , ancak büyük dosyaları günlük olarak işlerseniz iyi bir uygulamadır.
Alex Byrth

1
Out.close () öğesinin zaten akışı temizlediğine dikkat edin, bu da out.flush () öğesini çağırmanın gerekli olmadığı anlamına gelir.
hjk321

90

Java 7'de şunları yapabilirsiniz:

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

Burada daha fazla bilgi var: http://www.drdobbs.com/jvm/java-se-7-new-file-io/231600403


3
Daha sonra birinin merak etmesi durumunda kodlama platform standardı olacaktır.
Haakon Løtveit

5
content.getBytes(StandardCharsets.UTF_8)kodlamayı açıkça tanımlamak için kullanılabilir.
John29

1
StandardOpenOption.CREATE öğesinin varsayılan değer olmadığına dikkat edin. Varsayılanı kullanmak için üçüncü parametreyi kaldırmanız yeterlidir.
Tinus Tate

Lütfen Tinus Tate'in yorumuna bakın! Bu örneği düzenleme süreci nedir? Ben kaç kişi bu örneği-sadece daha kısa bir dize ile bir dosyanın üzerine yazarken beklenmedik sonuçları olduğunu bulmak için almış merak ediyorum. Tinus'un belirttiği gibi, TRUNCATE_EXISTING, tam olarak anlamadığınız ve daha kısa bir dizeyle üzerine yazarken mevcut dosyayı kısaltmak istememeniz için gerçek bir nedeniniz olmadıkça çok önemlidir.
jch

1
Java 11'de ikinci bir parametre olarak bir String koyabilirsiniz! Yaşasın!
Dennis Glot

78

Projemde benzer bir şey yaptım. Kullanım FileWriter işinizin parça basitleştirecek. Ve burada güzel bir öğretici bulabilirsiniz .

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
Tüm try / catch ve basitleştirmek kaldırılması Ben de sadece bir satırda yapabilirim: (new BufferedWriter (yeni FileWriter (dosya adı))). Write (str);
Artem Barger

6
Basit ve güzel çözümünüzü gösterin. Bunu nasıl daha iyi yapacağımı öğrenmekten memnuniyet duyarım.
Artem Barger

4
Trolleri görmezden gelin ... her zaman kendi çözümlerini sunmadan eleştiriyorlar. Beni kendi kodumu yazmaktan / ekstra kütüphaneyi indirmekten ve bağımlılığı tanıtmaktan kurtardığın için teşekkürler ...
nikib3ro

1
.close()Atmıyor gibi görünüyor (en azından Java 7?), Son deneme belki gereksiz mi?
Kos

16
Bunun gibi istisnalar yutmak, istisnalar gerçekten meydana geldiğinde hayatı zorlaştıracaktır. En azından onları yeniden düşünmelisin:throw new RuntimeException(e);
Roger Keays

65

Kullanım FileUtils.writeStringToFile()gelen Apache Commons IO . Bu tekerleği yeniden icat etmeye gerek yok.


20
Daha fazla anlaşamadım. Bu kütüphaneler oradadır, bu yüzden bu kadar basit bir çözümde ince hataları tanıtmayız.
skaffman

3
Hayır, tabii ki hayır. Sadece çözümünüzün yeni başlayan bir Java programcısı olan birine attığım ilk şey olmayacağına katılmıyorum. Hiç böyle bir şey yazmamanızı önermiyorsun, değil mi?
duffymo

8
Evet, ama bu ortakları bulmadan önce. Bunu bulduğumdan beri, böyle bir şeyi asla tek sınıf bir projede bile elle yazmadım. İlk günden itibaren bunu bilseydim, ilk günden kullanırdım.
skaffman

5
Kesinlikle, ama deneyimli bir geliştiricisin. Biyografiniz bir JBOSS / Bahar kullanıcısı olduğunu söylüyor, ancak kesinlikle ilk "Merhaba Dünya" çabanızda ikisinden biri olmayacaksınız. Kütüphanelerin doğru kullanımına katılmıyorum. Bir dili ilk kez deneyen insanların, daha sonra deneyimlendikleri ve daha iyi bildikleri zaman atacakları şeyler yapmak anlamına gelse bile, dilini en altından öğrenmeye çalışmaları gerektiğini söylüyorum.
duffymo

2
Bunu müşterek olmadan uyguladım ve daha az belirgin bir istisna aldım. Daha sonra bunu müşterekler kullanarak uyguladım ve bana tam olarak neyin yanlış olduğunu söyledi. Hikayenin ahlakı: gerekmiyorsa neden karanlık çağlarda yaşıyorsun?
14:42

22

Dosyanızı herhangi bir sınıf veya işlev metnin işlediği herhangi bir sınıftan yazmak için aşağıdaki kodu değiştirin. Biri dünyanın neden yeni bir metin editörüne ihtiyacı olduğunu merak ediyor ...

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
Bu bir istisna durumunda dosyayı kapatmaz.
Tom Hawtin - tackline

1
@JanusTroelsen: Reddedilirse, Kaynakları dene ifadesi .
trashgod

22

In Java 11java.nio.file.Files sınıf bir dosyaya bir dize yazmak için iki yeni yardımcı program yöntemleri ile uzatıldı. İlk yöntem ( buradaki JavaDoc'a bakın ) varsayılan olarak UTF-8 karakter kümesini kullanır :

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

Ve ikinci yöntem ( buradaki JavaDoc'a bakın ) ayrı bir karakter seti belirtmeye izin verir:

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

Her iki yöntem de (JavaDoc'u bkz seçenekleri ele dosyayı ayarı için isteğe bağlı varargs parametresine sahip burada ). Aşağıdaki örnek, var olmayan bir dosya oluşturur veya dizeyi var olan bir dosyaya ekler:

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

13

Bu tür bir işlem için mümkün olduğunda kütüphanelere güvenmeyi tercih ederim. Bu, yanlışlıkla önemli bir adımı atlamamı daha az olası hale getirir (yukarıda yapılan hatalar gibi). Yukarıda bazı kütüphaneler önerilmektedir, ancak bu tür şeyler için en sevdiğim Google Guava . Guava'nın bu görev için güzel çalışan Dosyalar adlı bir sınıfı var :

// 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
Guava kullanıyorsanız, orada da var Charsets.UTF-8.
flory

2
@florian: Charsets.UTF_8Aslında
Tim Büthe

Üst klasör mevcut olmalıdır. Örnek: destination.mkdirs ().
AlikElzin-kilaka

2
Files.write (CharSequence from, File to, Charset charset) guava 26.0'da kullanımdan kaldırılmıştır.
Donald Duck

Kullanımdan kaldırılmış Files.write yerine modern Guava alternatifi: Files.asCharSink(file, charset).write(text)
Vadzim

12

Apache Commons IO api kullanın. Basit

API'yı şu şekilde kullanın:

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

Maven Bağımlılığı

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

12

Tek bir dizeye dayalı olarak metin dosyası oluşturmanız gerekirse:

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 (yol, bayt []) UTF-8 kodlamasını kullanır. String.getBytes () varsayılan platform kodlamasını kullanır. Bu potansiyel bir konudur. String.getBytes (StandardCharsets.UTF_8) kullanın!
rmuller

11

Bunu kullanın, çok okunabilir:

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

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

Aynı zamanda mevcut bir cevabın kopyası. : c
james.garriss

2
üzgünüm ama java8 icat etmedi, ben bu hattı kullanan tek kişi değilim. ama aynı sorunun diğer cevaplarından geçmiş bir kopya değil
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

Bu yöntemi sınıflarınıza ekleyebilirsiniz. Bu yöntemi ana yöntemle bir sınıfta kullanıyorsanız, statik anahtar kelimesini ekleyerek bu sınıfı statik olarak değiştirin. Her iki durumda da java.io. * dosyasını içe aktarmanız gerekir, aksi takdirde File, FileWriter ve BufferedWriter tanınmaz.


10

Bunu yapabilirsin:

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

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

Bilge bir kelime - bu yoksa yeni bir dosya oluşturur, ancak mevcut dosyanın karakterlerinin üzerine yazar. Yeni veriler daha küçükse, bu muhtemelen bozuk bir dosya oluşturduğunuz anlamına gelir. Bana nasıl bildiğimi sor!
Chris Rae

Tamam, nerden biliyorsun?
ojblass

Sadece Files.write(targetPath, bytes);dosyanın üzerine yazmak için kullanın . Beklendiği gibi çalışacaktır.
BullyWiiPlaza

8

Org.apache.commons.io.FileUtils kullanma:

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

6

Yalnızca bir metin bloğunu dosyaya aktarmayı önemsiyorsanız, her seferinde metnin üzerine yazılacaktır.

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
        }
    }
}

Bu örnek, kullanıcının bir dosya seçici kullanarak bir dosya seçmesine izin verir.


@Eric Leschinski: Cevabımı daha profesyonel yaptığınız için teşekkür ederim (ayrıca OP'nin tam olarak istediği şey olduğunu varsaydım çünkü çoğu insanın istediği şey bu, sadece metni
döküp

2
Orijinal soru cevaplandıktan ve OP memnun kaldıktan ve çoktan kaybolduktan sonra, bunun gibi sayfalar yalnızca bir Google aramasından buraya gelen insanlar için yararlı bir eserdir. Bir dosyaya mini metin ekleyicisi oluşturmak için bu sayfaya indim. Bu nedenle, OP ilerledikten sonra OP yerine tüm izleyici kitlesi ile konuşmak iyidir.
Eric Leschinski

3

Bir şey olması durumunda, yazarı / çıktı akışını nihayet bir blokta kapatmak daha iyidir

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

1
daha da iyi: kaynakları
denemeyle

Evet, @ JanusTroelsen haklı, daha iyi kullanım Kaynaklarla deneme ifadesi 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
Bu kod snippet'i çözüm olsa da, bir açıklama da dahil olmak üzere mesajınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Johan

close () hiçbir zaman çağrılamaz. Lütfen, uygun hata durumu işleme özelliğini ekleyerek yanıtınızı geliştirin.
Boris Brodski

0

Bence en iyi yolu kullanıyor 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));

Bkz. Javadoc :

Bir dosyaya metin satırları yazın. Her satır bir karakter dizisidir ve sistem özelliği line.separator tarafından tanımlandığı şekilde platformun satır ayırıcısı tarafından sonlandırılan her satırla dosyaya sırayla yazılır. Karakterler, belirtilen karakter seti kullanılarak baytlara kodlanır.

Options parametresi dosyanın nasıl oluşturulacağını veya açılacağını belirtir. Hiçbir seçenek yoksa, bu yöntem CREATE, TRUNCATE_EXISTING ve WRITE seçenekleri varmış gibi çalışır. Başka bir deyişle, dosyayı yazmak, açmak durumunda oluşturmak veya başlangıçta varolan bir normal dosyayı 0 boyutuna kısaltmak için açar. Yöntem, tüm satırlar yazıldığında dosyanın kapatılmasını sağlar ( veya bir G / Ç hatası veya başka bir çalışma zamanı istisnası atılır). Bir G / Ç hatası oluşursa, dosya oluşturulduktan veya kesildikten veya dosyaya bazı baytlar yazıldıktan sonra bunu yapabilir.

Lütfen aklınızda bulundurun. İnsanların Java'nın yerleşik Files.writekodlarıyla zaten yanıt verdiğini görüyorum, ancak cevabımda kimsenin bahsetmediği özel olan şey, bir byte[]dizi yerine CharSequence (yani Dize) Yinelenebilir alan yöntemin aşırı yüklenmiş sürümüdür , bu nedenle text.getBytes()gerekli değildir Sanırım biraz daha temiz.


0

Satır başı karakterlerini dizeden bir dosyaya tutmak istiyorsanız, burada bir kod örneğidir:

    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

Yolum, tüm Android sürümlerinde ve URL / URI gibi fecthing kaynaklarının ihtiyaçları nedeniyle akışa dayanıyor, herhangi bir öneri kabul edilir.

İlgili olarak, akışlar (InputStream ve OutputStream), geliştirici bir akışa bir dize yazmaya gittiğinde, önce bayt'a dönüştürmeli veya başka bir deyişle onu kodlamalıdır.

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
Lütfen tüm açık kaynakları kapatmak ve istisnaları propogasyona almak için uygun hata durumu işleme ekleyin
Boris Brodski

Kod işleme durumlarını önerdiğiniz gibi paylaşır mısınız, teşekkür ederim.
牟家宏

-1

Örnek için TextArea öğesinin tüm içeriğini koymak için ArrayList'i kullanabilir ve yazar dize satırları yazdığı için save komutunu kullanarak parametre olarak gönderebilirsiniz. txt dosyasında TextArea içeriği olacağız. bir şey mantıklı değilse, üzgünüm google çevirmen ve ben İngilizce konuşmayan.

Windows Not Defteri'ni izleyin, her zaman satır atlamaz ve tümünü tek bir satırda gösterir, Wordpad'i kullanın.


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

Bir sürü kaynağı açık bırakabilirsiniz. Bu kötü bir uygulamadır, lütfen bunu yapma.
Boris Brodski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.