Come faccio a creare un file e scriverlo in Java?


1383

Qual è il modo più semplice per creare e scrivere su un file (di testo) in Java?

Risposte:


1735

Si noti che ciascuno dei seguenti esempi di codice può essere lanciato IOException. I blocchi try / catch / finally sono stati omessi per brevità. Vedi questo tutorial per informazioni sulla gestione delle eccezioni.

Si noti che ciascuno dei seguenti esempi di codice sovrascriverà il file se esiste già

Creazione di un file di testo:

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

Creazione di un file binario:

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

Gli utenti Java 7+ possono usare la Filesclasse per scrivere su file:

Creazione di un file di testo:

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

Creazione di un file binario:

byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);

58
Vale la pena notare che PrintWriter troncherà la dimensione del file a zero se il file esiste già
Covar

34
PrintWriter può essere (e spesso viene) utilizzato, ma non è (concettualmente) la classe giusta per il lavoro. Dai documenti: "PrintWriter prints formatted representations of objects to a text-output stream. "la risposta di Bozho è più corretta, anche se sembra ingombrante (puoi sempre avvolgerla in qualche metodo di utilità).
leonbloy,

14
Quindi, dove verrà creato il file di testo dopo che l'app è stata creata e utilizzata in un altro PC poiché non abbiamo fornito il percorso?
Marlon Abeykoon,

13
@MarlonAbeykoon Bella domanda. La risposta è che creerà il file di testo nella directory di lavoro . La directory di lavoro è la directory da cui si esegue il programma. Ad esempio, se esegui il tuo programma dalla riga di comando, la directory di lavoro sarà la directory in cui ti trovi in ​​quel momento (su Linux, digita "pwd" per vedere la directory di lavoro corrente). Oppure, se faccio doppio clic su un file JAR sul desktop per eseguirlo, la directory di lavoro sarà il desktop.
Michael,

8
writer.close()dovrebbe essere in un blocco finalmente
Thierry,

416

In Java 7 e versioni successive:

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

Ci sono utilità utili per questo però:

Si noti inoltre che è possibile utilizzare aFileWriter , ma usa la codifica predefinita, che è spesso una cattiva idea - è meglio specificare la codifica in modo esplicito.

Di seguito è la risposta originale, precedente a Java 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*/}
}

Vedi anche: Lettura, scrittura e creazione di file (include NIO2).


5
@leonbloy So che questo è un vecchio commento, ma se qualcuno lo vede ti dispiacerebbe spiegare perché non è "sempre vantaggioso"? Almeno qui si dice "massima efficienza" docs.oracle.com/javase/1.5.0/docs/api/java/io/…
Juan

14
Sembra che writer non abbia un metodo writeln (). Ha solo write ()
YankeeWhiskey l'

10
Se cambi il tipo di writer in BufferedWriter (che in realtà è), puoi usare writer.newLine ()
Niek il

4
Non sembra giusto provare / catturare dentro a finalmente. Conosco il motivo, ma sembra un odore di codice.
ashes999

4
@Trengot Lo fa. La chiamata close()a qualsiasi flusso racchiuso in un altro chiuderà anche tutti i flussi interni.
Finanzi la causa di Monica il

132

Se hai già il contenuto che vuoi scrivere nel file (e non generato al volo), l' java.nio.file.Filesaggiunta in Java 7 come parte dell'I / O nativo fornisce il modo più semplice ed efficiente per raggiungere i tuoi obiettivi.

Fondamentalmente la creazione e la scrittura in un file è solo una linea, inoltre una semplice chiamata di metodo !

L'esempio seguente crea e scrive in 6 file diversi per mostrare come può essere utilizzato:

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

Ben fatto. Mi piace l'esempio di file5 e file6. Per testare file6 assicurati di eseguire il programma due volte, quindi vedrai che accoda di nuovo le righe.
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();
          }
        }
    }
}

18
Non sarebbe meglio inserire output.close () in un blocco finally?
qed

7
Il semplice codice non può mai costituire una risposta qui. Devi spiegare
Marchese di Lorne,

7
in realtà questo non si compila, output.close()genera IOException
Bob Yoplait

43

Ecco un piccolo programma di esempio per creare o sovrascrivere un file. È la versione lunga, quindi può essere compresa più facilmente.

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

39

Un modo molto semplice per creare e scrivere su un file in 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);
        }
    }
}

7
Il File.exists()/createNewFile()codice qui è inutile e dispendioso. Il sistema operativo deve già fare esattamente la stessa cosa quando new FileWriter()viene creato. Stai forzando che tutto accada due volte.
Marchese di Lorne,

1
File.exists () / createNewFile () non è inutile e dispendioso. Stavo cercando un modo per eseguire codice diverso in base alla presenza o meno del file. Questo è stato molto utile.
KirstieBallance il

2
Ho usato questo metodo ma devi sapere che sovrascrive il file ogni volta. Se vuoi che venga aggiunto nel caso in cui il file esista, devi creare un'istanza FileWritercome segue:new FileWriter(file.getAbsoluteFile(),true)
Adelin,

2
E ' sia inutile e uno spreco, per la ragione ho detto. Si stanno causando due prove di esistenza, due creazioni, e una delezione: e si sta senza l'esecuzione di codice diverso qui a seconda se il file è già presente.
Marchese di Lorne,

34

Uso:

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

L'utilizzo try()chiuderà automaticamente il flusso. Questa versione è breve, veloce (con buffer) e consente di scegliere la codifica.

Questa funzione è stata introdotta in Java 7.


5
Va notato che questa è una funzionalità Java 7, quindi non funzionerà nelle versioni precedenti di Java.
Dan Temple

3
Si potrebbe usare la "costante" StandardCharsets.UTF_8invece della stringa "utf-8" (Questo impedisce errori di battitura) ...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...- java.nio.charset.StandardCharsetsè stato introdotto in java 7
Ralph

20

Qui stiamo inserendo una stringa in un file di testo:

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

Possiamo facilmente creare un nuovo file e aggiungere contenuto al suo interno.


Si noti che chiudere BufferedWriter è sufficiente poiché si occupa anche di chiudere FileWriter.
rbaleksandar,

17

Poiché l'autore non ha specificato se richiedono una soluzione per le versioni Java che sono state EoL'd (sia da Sun che da IBM, e queste sono tecnicamente le JVM più diffuse) e dal fatto che la maggior parte delle persone sembra aver risposto al domanda dell'autore prima che fosse specificato che si tratta di un file di testo (non binario) , ho deciso di fornire la mia risposta.


Prima di tutto, Java 6 ha generalmente raggiunto la fine della sua vita, e poiché l'autore non ha specificato che ha bisogno di compatibilità legacy, immagino significhi automaticamente Java 7 o versioni successive (Java 7 non è ancora EoL fatto da IBM). Quindi, possiamo dare un'occhiata al tutorial I / O sui file: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html

Prima della versione Java SE 7, la classe java.io.File era il meccanismo utilizzato per l'I / O dei file, ma presentava numerosi inconvenienti.

  • Molti metodi non generavano eccezioni quando fallivano, quindi era impossibile ottenere un utile messaggio di errore. Ad esempio, se la cancellazione di un file non è riuscita, il programma riceverà un "errore di eliminazione" ma non saprebbe se era perché il file non esisteva, l'utente non aveva le autorizzazioni o c'era qualche altro problema.
  • Il metodo di rinomina non ha funzionato in modo coerente su tutte le piattaforme.
  • Non c'era un vero supporto per i collegamenti simbolici.
  • È stato richiesto un maggiore supporto per i metadati, come autorizzazioni per i file, proprietario del file e altri attributi di sicurezza. L'accesso ai metadati dei file era inefficiente.
  • Molti dei metodi File non sono stati ridimensionati. La richiesta di un elenco di directory di grandi dimensioni su un server potrebbe provocare un blocco. Le directory di grandi dimensioni potrebbero anche causare problemi di risorse di memoria, con conseguente negazione del servizio.
  • Non è stato possibile scrivere un codice affidabile che potesse ricorrere in modo ricorsivo a un albero di file e rispondere in modo appropriato in presenza di collegamenti simbolici circolari.

Oh bene, questo esclude java.io.File. Se un file non può essere scritto / aggiunto, potresti non essere nemmeno in grado di sapere il perché.


Possiamo continuare a guardare il tutorial: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common

Se hai tutte le righe che dovresti scrivere (aggiungere) al file di testo in anticipo , l'approccio consigliato è https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html# write-java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption ...-

Ecco un esempio (semplificato):

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

Un altro esempio (append):

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

Se vuoi scrivere il contenuto del file mentre vai : 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 ...-

Esempio semplificato (Java 8 o versioni successive):

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

Un altro esempio (append):

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

Questi metodi richiedono uno sforzo minimo da parte dell'autore e dovrebbero essere preferiti a tutti gli altri quando si scrivono su file [di testo].


"Se un file non può essere scritto / aggiunto, potresti non essere nemmeno in grado di sapere perché" non è corretto. Saprai esattamente perché, dal testo di quello FileNotFoundExceptionche viene lanciato quando l'operazione fallisce.
Marchese di Lorne,

"Molti metodi non generavano eccezioni quando fallivano, quindi era impossibile ottenere un utile messaggio di errore. Ad esempio, se la cancellazione di un file falliva, il programma riceveva un" errore fallito "ma non sapeva se fosse perché il file non esisteva, l'utente non aveva i permessi o c'era qualche altro problema ".
afk5min

Leggi cosa ho scritto. " Se un file non può essere scritto / aggiunto, potresti non essere nemmeno in grado di ottenere un utile messaggio di errore" non è corretto, per il motivo che ho indicato, e rimane tale. Stai cambiando argomento. La tua materia.
Marchese di Lorne,

Esaminerò le implementazioni integrate per i filesystem tipici (che sarebbero in OpenJDK, ma non ho motivo di pensare che questa parte sarebbe diversa nell'Oracle JDK proprietario, o significativamente diversa nell'IBM JDK proprietario, tra gli altri) e aggiornerò la mia risposta basata su questi risultati. Il tuo commento ha un senso - solo perché 'molti metodi' possono avere problemi, l'autore ha chiaramente affermato che è solo l'operazione di scrittura / aggiunta al file che gli interessa.
afk5min

Il motivo è che nessuno dei metodi chiamati non genera eccezioni appropriate contenenti messaggi di errore appropriati. Se hai un controesempio che supporta la tua affermazione, spetta a te fornirla.
Marchese di Lorne,

16

Se desideri avere un'esperienza relativamente indolore, puoi anche dare un'occhiata al pacchetto IO di Apache Commons , più specificamente alla FileUtilsclasse .

Non dimenticare di controllare le librerie di terze parti. Joda-Time per la manipolazione della data, Apache Commons LangStringUtils per le operazioni di stringa comuni e simili possono rendere il tuo codice più leggibile.

Java è un ottimo linguaggio, ma la libreria standard a volte è un po 'di basso livello. Potente, ma di basso livello.


1
Il metodo di scrittura file più semplice FileUtilsè static void write(File file, CharSequence data). Esempio di utilizzo: import org.apache.commons.io.FileUtils; FileUtils.write(new File("example.txt"), "string with data");. FileUtilsha anche writeLines, che prende una Collectiondelle linee.
Rory O'Kane,

12

Se per qualche motivo vuoi separare l'atto di creare e scrivere, l'equivalente Java di touchè

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()esegue un controllo di esistenza e il file viene creato atomicamente. Questo può essere utile se vuoi assicurarti di essere il creatore del file prima di scriverlo, per esempio.


1
[tocco] aggiorna anche il timestamp del file come effetto collaterale (se esiste già). Anche questo ha questo effetto collaterale?
Ape-inago,

@Ape-inago: sul mio sistema non è certo così (restituisce solo false e non ha alcun effetto sul file). Non intendevo touchin senso generale, ma piuttosto nel suo uso secondario comune per creare un file senza scrivere dati su di esso. Lo scopo documentato del tocco è di aggiornare il timestamp sul file. La creazione del file se non esiste è davvero l'effetto collaterale e può essere disabilitata con un interruttore.
Mark Peters,

Per qualche motivo come cosa? Queste exists()/createNewFile()sequenze sono letteralmente una perdita di tempo e spazio.
Marchese di Lorne,

12

Ecco alcuni dei modi possibili per creare e scrivere un file in Java:

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

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

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

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

Per ulteriori controlli, consultare questo tutorial su Come leggere e scrivere file in Java .


Mi chiedo solo ... non dovrebbe FileWritero OutputStreamWriteressere chiuso in un blocco finalmente?
Wolfgang Schreurs,

@WolfgangSchreurs, Sì, è ancora meglio, devo spostare la dichiarazione della variabile al di fuori del blocco try per poterlo fare.
Mehdi,

Ho appena capito che facendo uso della chiusura automatica se anche più pulita, non è necessario dichiarare variabili al di fuori del blocco e le risorse verranno chiuse automaticamente anche se si verifica un'eccezione (è necessario aggiungere esplicitamente un blocco finalmente). Vedi: docs.oracle.com/javase/tutorial/essential/exceptions/…
Wolfgang Schreurs,

Vorrei aggiungere la prova con risorse come esempio separato (per separare diverse possibilità). Sai che SOF è un sito Web collaborativo, vai avanti e modifica la risposta se vuoi avere il diritto.
Mehdi,

10

Uso:

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

questo è il modo più semplice che ho trovato ... tutti i problemi sono risolti qui e solo il testo è necessario per essere inserito
Rohit ZP

10

il modo migliore è usare Java7: Java 7 introduce un nuovo modo di lavorare con il filesystem, insieme a una nuova classe di utilità - File. Utilizzando la classe Files, possiamo creare, spostare, copiare, eliminare anche file e directory; può anche essere usato per leggere e scrivere su un file.

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

    Files.write(path, strToBytes);
}

Scrivi con FileChannel Se hai a che fare con file di grandi dimensioni, FileChannel può essere più veloce di IO standard. Il codice seguente scrive String in un file utilizzando 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();
}

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

Scrivi con FileOutputStream

Vediamo ora come possiamo utilizzare FileOutputStream per scrivere dati binari in un file. Il codice seguente converte un byte int String e scrive i byte su file usando un FileOutputStream:

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

    outputStream.close();
}

Scrivi con PrintWriter possiamo usare un PrintWriter per scrivere un testo formattato in un 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();
}

Scrivi con BufferedWriter: usa BufferedWriter per scrivere una stringa in un nuovo file:

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

    writer.close();
}

aggiungere una stringa al file esistente:

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

    writer.close();
}

9

Penso che questo sia il modo più breve:

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

8

Per creare un file senza sovrascrivere il file esistente:

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
}

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

Queste exists()/createNewFile()sequenze sono letteralmente una perdita di tempo e spazio.
Marchese di 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");
    }
}

Queste exists()/createNewFile()sequenze sono letteralmente una perdita di tempo e spazio.
Marchese di Lorne,

5

Solo una riga! pathe linesono stringhe

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

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

Ahem, l'autore ha specificato esplicitamente i file "di testo". E i file di testo sono composti da caratteri. I file binari sono composti da byte. A parte questo, non è chiaro cosa sia lines. Se è un java.lang.String, allora la chiamata getBytes()produrrà byte usando la codifica predefinita della piattaforma , che non è molto buona nel caso generale.
afk5min

5

Il modo più semplice che posso trovare:

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

Probabilmente funzionerà solo per 1.7+.


5

Vale la pena provare per Java 7+:

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

Sembra promettente ...


4

Se stiamo utilizzando Java 7 e versioni successive e conosciamo anche il contenuto da aggiungere (aggiunto) al file, possiamo utilizzare il metodo newBufferedWriter nel pacchetto 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();
    }
}

Ci sono alcuni punti da notare:

  1. È sempre una buona abitudine specificare la codifica del set di caratteri e per questo abbiamo una costante in classe StandardCharsets.
  2. Il codice utilizza try-with-resourceun'istruzione in cui le risorse vengono automaticamente chiuse dopo il tentativo.

Sebbene OP non l'abbia chiesto, ma nel caso in cui desideriamo cercare righe con una parola chiave specifica, ad esempio confidentialpossiamo utilizzare API di flusso in Java:

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

4

Lettura e scrittura dei file mediante input e 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");
        }
    }
}

4

Includi solo questo pacchetto:

java.nio.file

E quindi puoi usare questo codice per scrivere il file:

Path file = ...;
byte[] buf = ...;
Files.write(file, buf);

4

In Java 8 usa File e Percorsi e usa il costrutto 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
    }
}

3

Ci sono alcuni modi semplici, come:

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

bwè inutilizzato.
Marchese di Lorne,

E il punto di sovrascrivere il file con nuovo contenuto non è dichiarato.
Marchese di Lorne,

3

È anche possibile creare un file temporaneo utilizzando una proprietà di sistema , che sarà indipendente dal sistema operativo in uso.

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

2

Utilizzando la libreria Guava di Google, possiamo creare e scrivere su un file molto facilmente.

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

L'esempio crea un nuovo fruits.txtfile nella directory principale del progetto.


2

Leggere la raccolta con i clienti e salvare su file, con 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();
        }
    }
}

2

Esistono almeno diversi modi per creare un file e scriverlo:

Piccoli file (1.7)

È possibile utilizzare uno dei metodi di scrittura per scrivere byte o righe in un file.

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

Questi metodi si occupano della maggior parte del lavoro per te, come l'apertura e la chiusura del flusso, ma non sono destinati alla gestione di file di grandi dimensioni.

Scrittura di file di dimensioni maggiori utilizzando Buffered Stream I / O (1.7)

Il java.nio.filepacchetto supporta l'I / O del canale, che sposta i dati nei buffer, bypassando alcuni dei livelli che possono bloccare l'I / O del flusso di bottiglia.

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

Questo approccio è preferenziale a causa delle sue prestazioni efficienti soprattutto quando si completano numerose operazioni di scrittura. Le operazioni con buffer hanno questo effetto in quanto non sono richieste per chiamare il metodo di scrittura del sistema operativo per ogni singolo byte, riducendo le costose operazioni di I / O.

Utilizzo dell'API NIO per copiare (e crearne uno nuovo) un file con un 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);
}

Esistono anche metodi aggiuntivi che consentono di copiare tutti i byte da un flusso di input a un file.

FileWriter (testo) (<1.7)

Scrive direttamente nel file (meno prestazioni) e dovrebbe essere usato solo quando il numero di scritture è inferiore. Utilizzato per scrivere dati orientati ai caratteri in un file.

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

FileOutputStream (binario) (<1.7)

FileOutputStream è pensato per scrivere flussi di byte grezzi come i dati di immagine.

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

Con questo approccio si dovrebbe considerare di scrivere sempre un array di byte anziché scrivere un byte alla volta. L'accelerazione può essere piuttosto significativa - fino a 10 volte superiore o superiore. Pertanto si consiglia di utilizzare i write(byte[])metodi ogni volta che è possibile.

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.