Come posso salvare una stringa in un file di testo usando Java?


699

In Java, ho testo da un campo di testo in una variabile String chiamata "testo".

Come posso salvare il contenuto della variabile "text" in un file?

Risposte:


727

Se stai semplicemente emettendo testo, anziché qualsiasi dato binario, funzionerà quanto segue:

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

Quindi, scrivi la tua stringa su di essa, proprio come faresti con qualsiasi flusso di output:

out.println(text);

Avrai bisogno di una gestione delle eccezioni, come sempre. Assicurati di chiamareout.close() quando hai finito di scrivere.

Se si utilizza Java 7 o versioni successive, è possibile utilizzare l' istruzione " prova con risorse " che chiuderà automaticamente il tuo PrintStreamquando hai finito (cioè esci dal blocco) in questo modo:

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

Avrai comunque bisogno di lanciare esplicitamente java.io.FileNotFoundExceptioncome prima.


4
@Justin, potresti anche passare un percorso assoluto (es. "/Tmp/filename.txt") al costruttore FileOutputStream, per salvare il file dove vuoi
Jonik,

7
A proposito, questo potrebbe essere semplificato usando i costruttori di convenienza che PrintStream ha avuto dall'1.5. Questo sarebbe sufficiente: PrintStream out = new PrintStream ("nomefile.txt");
Jonik,

10
Devi chiudere quel file anche se ad un certo punto ...? codecodex.com/wiki/ASCII_file_save#Java
JStrahl

2
Vuoi usare try {} catch () {} finally {}, dove in fine {} chiudi il file se non è null.
Benas,

23
In java8 puoi provare (PrintStream ps = new PrintStream ("nome file")) {ps.println (out); } questo sarà vicino a te
Anton Chikin,

245

Apache Commons IO contiene alcuni ottimi metodi per farlo, in particolare FileUtils contiene il seguente metodo:

static void writeStringToFile(File file, String data) 

che consente di scrivere testo in un file in una chiamata di metodo:

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

Potresti anche considerare di specificare la codifica per il file.


10
Solo una piccola correzione, il secondo frammento dovrebbe essere: FileUtils.writeStringToFile (nuovo file ("test.txt"), "Hello File");
pm_labs

3
Per quelli di noi che preferiscono la Guava, può farlo anche questo .
Jonik,

10
La funzione è ora obsoleta, è necessario aggiungere il set di caratteri predefinito ->FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8"));
Paul Fournel

97

Dai un'occhiata all'API dei file Java

un rapido esempio:

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

@ XP1 Lo so, è un grande miglioramento. Ho usato Lombok per questo in Java 6: basta andare @Cleanup new FileOutputStream(...)e il gioco è fatto.
Jorn,

6
Non dimenticare di chiamare out.flush (); quindi out.close ();
Alex Byrth,

@AlexByrth perché dovrebbe?
Andrew Tobilko,

1
I file di grandi dimensioni vengono registrati in background (un altro thread) e richiedono tempo per la registrazione. La chiamata a flush () assicura che tutto sia stato scritto sulla riga successiva, sincronizzando l'operazione. Ma questo è facoltativo , ma è buona norma se gestisci file di grandi dimensioni, come registri.
Alex Byrth,

1
Nota che out.close () scarica già lo stream, il che significa che non è necessario chiamare out.flush ().
hjk321,

90

In Java 7 puoi fare questo:

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

Maggiori informazioni qui: http://www.drdobbs.com/jvm/java-se-7-new-file-io/231600403


3
Nel caso qualcuno si chiedesse in seguito, la codifica sarebbe lo standard della piattaforma.
Haakon Løtveit,

5
content.getBytes(StandardCharsets.UTF_8)può essere usato per definire esplicitamente la codifica.
John29,

1
Si noti che StandardOpenOption.CREATE non è quello predefinito StandardOpenOption.CREATE e StandardOpenOption.TRUNCATE_EXISTING è il valore predefinito. Per utilizzare il valore predefinito basta rimuovere il terzo parametro.
Tinus Tate,

Si prega di vedere il commento di Tinus Tate! Qual è il processo per modificare questo esempio? Mi chiedo quante migliaia di persone abbiano preso questo esempio così com'è solo per scoprire di avere risultati inaspettati quando sovrascrivono un file con una stringa più corta. Come indica Tinus, TRUNCATE_EXISTING è cruciale a meno che non si capisca completamente e si abbia un motivo effettivo per non voler troncare il file esistente quando si sovrascrive con una stringa più corta.
jch

1
In java 11 puoi semplicemente mettere una stringa come secondo parametro! Evviva!
Dennis Glot,

78

Ho appena fatto qualcosa di simile nel mio progetto. Utilizzare FileWriter semplifica parte del tuo lavoro. E qui puoi trovare un bel tutorial .

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
Rimuovendo tutto try / catch e semplificandolo, sono anche in grado di farlo in una riga semplicemente facendo: (new BufferedWriter (new FileWriter (nomefile))). Write (str);
Artem Barger,

6
Quindi, mostra la tua soluzione semplice e piacevole. Sarei felice di imparare a farlo nel modo migliore.
Artem Barger,

4
Ignora i troll ... criticano sempre senza offrire la propria soluzione. Grazie per avermi salvato dalla scrittura del mio codice / dal download di ulteriori librerie e dall'introduzione della dipendenza ...
nikib3ro,

1
Sembra che .close()non getti (almeno in Java 7?), L'ultimo trycatch è forse ridondante?
Kos,

16
Ingoiare eccezioni del genere ti renderà la vita difficile quando si verificano davvero delle eccezioni. Per lo meno, dovresti ricodificarli:throw new RuntimeException(e);
Roger Keays, l'

65

Utilizzare FileUtils.writeStringToFile()da Apache Commons IO . Non è necessario reinventare questa ruota in particolare.


20
Non potrei essere più in disaccordo. Queste librerie sono lì, quindi non introduciamo bug sottili in una soluzione così semplice.
Skaffman,

3
No, ovviamente no. Sono solo in disaccordo sul fatto che la tua soluzione potrebbe non essere la prima cosa che darei a qualcuno che è un programmatore Java principiante. Non stai suggerendo di non aver mai scritto una cosa del genere, vero?
duffymo,

8
Sì, sì, ma è prima che trovassi commons-io. Da quando l'ho scoperto, non ho mai scritto questo genere di cose a mano, nemmeno in un progetto di classe. Se l'avessi saputo dal primo giorno, l'avrei usato dal primo giorno.
Skaffman,

5
Esatto, ma sei uno sviluppatore esperto. La tua biografia dice che sei un utente JBOSS / Spring, ma certamente non saresti stato all'altezza di nessuno dei due nel tuo primo tentativo "Hello, World". Non sono in disaccordo con l'uso corretto delle biblioteche. Sto dicendo che le persone che cercano una lingua per la prima volta dovrebbero provare a conoscerla in fondo, anche se ciò significa fare cose che in seguito scarteranno quando avranno esperienza e conosceranno meglio.
Duffymo,

2
Ho implementato questo senza beni comuni e ho ricevuto un'eccezione meno che ovvia. Ho quindi implementato questo usando i beni comuni e mi ha detto esattamente cosa non andava. Morale della storia: perché vivere nei secoli bui se non è necessario?
SilenziosoNon

22

Puoi usare il codice di modifica qui sotto per scrivere il tuo file da qualunque classe o funzione stia gestendo il testo. Ci si chiede però perché il mondo abbia bisogno di un nuovo editor di testo ...

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
Ciò non chiude il file in caso di un'eccezione.
Tom Hawtin - tackline il

1
@JanusTroelsen: se respinto, cita la dichiarazione di prova con risorse .
trashgod,

22

In Java 11 la java.nio.file.Filesclasse è stata estesa da due nuovi metodi di utilità per scrivere una stringa in un file. Il primo metodo (vedere JavaDoc qui ) utilizza il set di caratteri UTF-8 come predefinito:

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

E il secondo metodo (vedi JavaDoc qui ) consente di specificare un singolo set di caratteri:

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

Entrambi i metodi hanno un parametro Varargs opzionale per l'impostazione delle opzioni di gestione dei file (vedere JavaDoc qui ). L'esempio seguente creerebbe un file inesistente o aggiungerebbe la stringa a un file esistente:

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

13

Preferisco fare affidamento sulle librerie quando possibile per questo tipo di operazione. Questo mi rende meno propenso a omettere accidentalmente un passaggio importante (come l'errore di lupo fatto sopra). Alcune librerie sono suggerite sopra, ma la mia preferita per questo tipo di cose è Google Guava . Guava ha una classe chiamata Files che funziona bene per questa attività:

// 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
Se stai usando Guava, c'è anche Charsets.UTF-8.
Florian,

2
@Florian: In Charsets.UTF_8realtà è
Tim Büthe

La cartella principale deve esistere. Esempio: destination.mkdirs ().
AlikElzin-Kilaka,

2
Files.write (CharSequence da, File a, Charset charset) è obsoleto in guava 26.0.
Donald Duck,

Alternativa moderna di Guava a Files.write obsoleto: Files.asCharSink(file, charset).write(text)
Vadzim

12

Usa API Apache Commons IO. È semplice

Usa API come

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

Dipendenza di Maven

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

12

Nel caso in cui sia necessario creare un file di testo basato su una singola stringa:

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 []) utilizzerà la codifica UTF-8. String.getBytes () utilizza la codifica della piattaforma predefinita. Quindi questo è un potenziale problema. Usa string.getBytes (StandardCharsets.UTF_8)!
rmuller,

11

Usa questo, è molto leggibile:

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

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

È anche una copia di una risposta esistente. : c
james.garriss,

2
scusa ma non ho inventato java8, non sono l'unico che usa questa linea. ma non è una copia del passato di altre risposte alla stessa domanda
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

Puoi inserire questo metodo nelle tue classi. Se si utilizza questo metodo in una classe con un metodo principale, modificare questa classe in statica aggiungendo la parola chiave statica. In entrambi i casi dovrai importare java.io. * per farlo funzionare, altrimenti File, FileWriter e BufferedWriter non verranno riconosciuti.


10

Potresti farlo:

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

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

Una parola al saggio: questo creerà un nuovo file se non è lì, ma sovrascriverà i caratteri del file esistente se lo è. Se i nuovi dati sono più piccoli, ciò significa che probabilmente creerai un file danneggiato. Chiedimi come lo so!
Chris Rae,

Ok, come lo sai?
ojblass

Basta usare Files.write(targetPath, bytes);per sovrascrivere il file quindi. Funzionerà come previsto.
BullyWiiPlaza,

8

Utilizzando org.apache.commons.io.FileUtils:

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

6

Se ti interessa solo spingere un blocco di testo in un file, questo lo sovrascriverà ogni volta.

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

Questo esempio consente all'utente di selezionare un file utilizzando un selettore di file.


@Eric Leschinski: grazie per aver reso la mia risposta più professionale (ho anche pensato che fosse esattamente quello che voleva l'OP poiché questo è ciò che in realtà la maggior parte delle persone vuole, basta scaricare il testo e sostituirlo)
bhathiya-perera

2
Una volta che la domanda originale è stata risolta e l'OP è soddisfatto e scomparso da tempo, pagine come questa servono solo come artefatto utile per le persone che arrivano qui da una ricerca su Google. Sono arrivato su questa pagina per creare un mini appender di testo in un file. Quindi è bene parlare a tutto il pubblico piuttosto che all'OP dopo che l'OP è passato.
Eric Leschinski,

3

È meglio chiudere il writer / outputstream in un blocco finally, nel caso in cui succeda qualcosa

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

1
ancora meglio: usa try-with-resources
Janus Troelsen il

Sì, @JanusTroelsen ha ragione, meglio usare l'istruzione try-with-resources 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
Sebbene questo frammento di codice possa essere la soluzione, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che in futuro stai rispondendo alla domanda dei lettori e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
Johan,

close () non può mai essere chiamato. Per favore, migliora la tua risposta aggiungendo la corretta gestione dei casi di errore.
Boris Brodski,

0

Penso che il modo migliore sia usare 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));

Vedi javadoc :

Scrivi righe di testo in un file. Ogni riga è una sequenza di caratteri e viene scritta nel file in sequenza con ogni riga terminata dal separatore di riga della piattaforma, come definito dalla proprietà di sistema line.separator. I caratteri vengono codificati in byte utilizzando il set di caratteri specificato.

Il parametro options consente di specificare come viene creato o aperto il file. Se non sono presenti opzioni, questo metodo funziona come se fossero presenti le opzioni CREATE, TRUNCATE_EXISTING e WRITE. In altre parole, apre il file per la scrittura, creando il file se non esiste o inizialmente troncando un file normale esistente a una dimensione di 0. Il metodo assicura che il file venga chiuso quando tutte le righe sono state scritte ( oppure viene generato un errore I / O o un'altra eccezione di runtime). Se si verifica un errore I / O, è possibile che ciò avvenga dopo che il file è stato creato o troncato o dopo che alcuni byte sono stati scritti nel file.

Notare che. Vedo che le persone hanno già risposto con Java integrato Files.write, ma la cosa speciale nella mia risposta che nessuno sembra menzionare è la versione sovraccarica del metodo che accetta una Iterable di CharSequence (cioè String), invece di un byte[]array, quindi text.getBytes()non è richiesto , che è un po 'più pulito penso.


0

Se si desidera mantenere i caratteri di ritorno a capo dalla stringa in un file, ecco un esempio di codice:

    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

Il mio modo è basato sullo streaming a causa dell'esecuzione su tutte le versioni di Android e le esigenze di risorse di ricerca come URL / URI, qualsiasi suggerimento è il benvenuto.

Per quanto riguarda, gli stream (InputStream e OutputStream) trasferiscono i dati binari, quando lo sviluppatore va a scrivere una stringa in un flusso, devono prima convertirlo in byte o, in altre parole, codificarlo.

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
Aggiungi la corretta gestione dei casi di errore chiudendo tutte le risorse aperte e proponendo eccezioni
Boris Brodski il

Ti dispiacerebbe condividere i casi di gestione del codice come hai raccomandato, grazie.
牟家宏

-1

Puoi usare ArrayList per mettere tutto il contenuto di TextArea come esempio, e inviare come parametro chiamando il salvataggio, poiché lo scrittore ha appena scritto le righe di stringa, quindi usiamo il "per" riga per riga per scrivere la nostra ArrayList alla fine saremo contenti di TextArea in file txt. se qualcosa non ha senso, mi dispiace è traduttore Google e io che non parlo inglese.

Guarda il Blocco note di Windows, non salta sempre le linee e mostra tutto in una riga, usa 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);     
    }   
}

Puoi lasciare un mucchio di risorse aperte. Questa è una cattiva pratica, per favore, non farlo.
Boris Brodski,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.