Creare e scrivere file con java

di il
18 risposte

Creare e scrivere file con java

Ecco la consegna:
Esercizio 8
Scrivere un programma che legge una frase e la scrive su file separando ciascuna parola su una diversa riga del file.

Il prof ci ha spiegato come fare, ma io non ho capito nulla, ho fatto questo esercizio guardando tutorial su YouTube, però ovviamente ci saranno un sacco di cose da migliorare e ho delle domande.
package vacanze_estive_8;

/**
 *
 * @author OOO
 */
import java.io.File;
import java.io.EOFException;
import java.io.PrintWriter;
import javax.swing.JOptionPane;

public class Vacanze_estive_8 {

    public static void main(String[] args) {

        File file = new File("file.txt");
        PrintWriter scrivi = new PrintWriter(file);
        if (!file.exists()) {
            file.createNewFile("file.txt");
        }
        String input = JOptionPane.showInputDialog("Inserisci una frase");
        String input2 = "";
        for (int i = 0; i < input.length(); i++) {
            if (input.charAt(i) != ' ') {
                input2 += input.charAt(i);
            } else {
                scrivi.println(input2);
                input2="";
            }
        }
        scrivi.close();

    }

}
Questo è quello che ho pensato: File file = new File("file.txt"); serve per creare un nuovo file?
Comunque ho fatto quello e poi nell'if volevo mettere se il file non esiste lo crea.


Poi che cosa succede se non inserisco scrivi.close() ?
Come mai se scrivi il percorso del file devi mettere due \\ e non una?
come mai il codice che ho scritto è sbagliato?

18 Risposte

  • Re: Creare e scrivere file con java

    lolol ha scritto:


    Questo è quello che ho pensato: File file = new File("file.txt"); serve per creare un nuovo file?
    No, crea solo un oggetto java.io.File che rappresenta solo un "pathname" astratto. Non fa ancora nulla materialmente con il file.

    lolol ha scritto:


    Comunque ho fatto quello e poi nell'if volevo mettere se il file non esiste lo crea.
    Generalmente non serve, nel senso che se "apri" in scrittura il file con es. FileOutputStream, FileWriter, ecc... (le classi di scrittura, insomma), se il file non esiste lo crea e se esiste già lo rimpiazza del tutto da zero.

    lolol ha scritto:


    Poi che cosa succede se non inserisco scrivi.close() ?
    Potrebbe non scrivere tutto completamente. Il close() va sempre fatto sulle classi di I/O.

    lolol ha scritto:


    Come mai se scrivi il percorso del file devi mettere due \\ e non una?
    Se il percorso è in stile Windows, il separatore è il carattere "\". Ma il carattere \ è "speciale" nelle stringhe literal (letterali nel sorgente) per cui va fatto un escape per avere davvero un \ come carattere nella stringa, appunto "\\".

    lolol ha scritto:


    come mai il codice che ho scritto è sbagliato?
    La logica di separazione non è comunque corretta. Tanto per dirne una, se dopo l'ultima parola non hai uno spazio, l'ultima parola te la perdi, perché appunto non c'è lo spazio che fa cambiare di stato e passare nel else.

    Consiglio: usa StringTokenizer e fai un ciclo "finché c'è un token" e dentro: prendi il token e scrivi la riga. Vedi metodi hasMoreTokens() / nextToken() di StringTokenizer.
  • Re: Creare e scrivere file con java

    Non so fare l'esercizioooooo
  • Re: Creare e scrivere file con java

    lolol ha scritto:


    Non so fare l'esercizioooooo
    Hai letto la documentazione di StringTokenizer ?
    C'è anche un esempio d'uso riportato all'inizio .....
  • Re: Creare e scrivere file con java

    La logica di separazione non è comunque corretta. Tanto per dirne una, se dopo l'ultima parola non hai uno spazio, l'ultima parola te la perdi, perché appunto non c'è lo spazio che fa cambiare di stato e passare nel else.

    Consiglio: usa StringTokenizer e fai un ciclo "finché c'è un token" e dentro: prendi il token e scrivi la riga. Vedi metodi hasMoreTokens() / nextToken() di StringTokenizer.
    Altri due metodi forse più sempici:

    1) fai un println() di ogni oggetto (String) ritornato da input.split(" ").

    consiglio : ti basta un ciclo for()


    2) trasformi "input" in un array di char ( String.toCharArray ), sostituisci ogni ' ' con un '\n' e poi stampi l'intero array


    PS: Per andbin, dal tuo link :
    StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.
  • Re: Creare e scrivere file con java

    ale99 ha scritto:


    PS: Per andbin, dal tuo link :
    StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.
    Sì, è vero che c'è questa frase che hai riportato. Ma ... StringTokenizer di per sé non ha nulla tecnicamente di marcato @Deprecated (come invece è accaduto es. a java.util.Date, che comunque è tuttora viva e vegeta!).

    StringTokenizer è ancora usatissima, anche all'interno del framework di Java SE! Tanto per dirne una: java.lang.Runtime usa StringTokenizer per uno dei suoi exec():

    http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#exec-java.lang.String-java.lang.String:A-java.io.File-

    e la documentazione lo dice anche: "More precisely, the command string is broken into tokens using a StringTokenizer created by the....."

    E anche usato in diverse classi di Log4j, di Apache PDFBox, di Quartz ecc....
    Insomma, se continua a fare il buon (sebbene minimo) lavoro per cui è stata fatta .... perché no?
  • Re: Creare e scrivere file con java

    ale99 ha scritto:


    2) trasformi "input" in un array di char ( String.toCharArray ), sostituisci ogni ' ' con un '\n' e poi stampi l'intero array

    E se uno mette più spazi va a capo più volte... (?)
  • Re: Creare e scrivere file con java

    Mi sa che mi metto a guardare un po' di tutorial su youtube, sembrano aiutare. Poi se mai ritorno a fare delle domande. Grazie fino ad ora
  • Re: Creare e scrivere file con java

    lolol ha scritto:


    E se uno mette più spazi va a capo più volte... (?)
    Sì, se uno fa solo appunto una banale sostituzione ' ' --> '\n'. Che comunque solo '\n' non è nemmeno correttissimo al 100% poiché la sequenza di newline dipende dal sistema operativo.

    Scusa ma StringTokenizer l'hai visto o no?
  • Re: Creare e scrivere file con java

    Che comunque solo '\n' non è nemmeno correttissimo al 100% poiché la sequenza di newline dipende dal sistema operativo.
    Sinceramente pensavo che '\n' fosse tradotto automaticamente da java/JVM/chennesò in run-time nella sequenza di newline della macchina su cui viene eseguita. Grazie

    Comunque questa dovrebbe essere una soluzione...
    String eol = System.getProperty( "line.separator" );     da Wikipedia
    ... ma il codice si complicherebbe troppo.... pessima soluzione.



    E se uno mette più spazi va a capo più volte... (?)
    Soluzione :
    for(String s : input.split(" "))
                if(!s.equals(""))   System.out.println(s);
    oppure, come ha suggerito più volte andbin, usi StringTokenizer
  • Re: Creare e scrivere file con java

    ale99 ha scritto:


    Sinceramente pensavo che '\n' fosse tradotto automaticamente da java/JVM/chennesò in run-time nella sequenza di newline della macchina su cui viene eseguita. Grazie

    Comunque questa dovrebbe essere una soluzione...
    String eol = System.getProperty( "line.separator" );     da Wikipedia
    Difatti questa system-property è proprio quella che viene usata, sotto sotto, dai vari:
    println() (PrintWriter / PrintStream)
    newLine() (BufferedWriter)
    "%n" (di format / printf da Java 5)

    Ma non c'è alcun trattamento particolare di \n (e nemmeno di \r ). "\n" è un line-feed, codice ASCII 10. Stop.
  • Re: Creare e scrivere file con java

    andbin ha scritto:


    Scusa ma StringTokenizer l'hai visto o no?
    Sto provando a guardare anche quello ma non capisco niente ...
  • Re: Creare e scrivere file con java

    Mi sa che devo proprio trovare qualcuno che mi fa l'esercizio perché non sto capendo proprio nulla ...
  • Re: Creare e scrivere file con java

    lolol ha scritto:


    Sto provando a guardare anche quello ma non capisco niente ...
    Nella documentazione javadoc che ho linkato ( StringTokenizer ), ci sono 4 (!) righe di codice, le prime che si vedono all'inizio.
    Davvero quelle non sono chiare?
  • Re: Creare e scrivere file con java

    La cosa che mi hai linkato non la capisco.
    Ho trovato qualcuno che mi ha fatto l'esercizio questo è quello che ha postato lui/lei
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.util.Scanner;
    import java.io.IOException;
    
    public class Test
    {
    public static void main(String[] args) throws IOException
    {
    System.out.print("Enter a line of text: ");
    Scanner input = new Scanner(System.in);
    String line = input.nextLine();
    BufferedWriter writer = new BufferedWriter(new FileWriter("test.txt"));
    String parts[] = line.split("\\s");
    for(int i=0;i<parts.length;i++)
    writer.write(parts[i]+"\r\n");
    writer.flush();
    writer.close();
    }
    } 

    l'ho modificato in modo che sia per me più comprensibile ed è venuto così e funziona comunque:
    package vacanze_estive_8;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import javax.swing.JOptionPane;
    
    public class Vacanze_estive_8 {
    
        public static void main(String[] args) throws IOException {
            
            String input= JOptionPane.showInputDialog("Inserisci bla bla");
            BufferedWriter writer = new BufferedWriter(new FileWriter("test.txt"));
            String parts[] = input.split("\\s");
            for (int i = 0; i < parts.length; i++) {
                writer.write(parts[i] + "\r\n");
            }
            writer.flush();
            writer.close();
        }
    }

    sembra funzionare ma non capisco come funziona, ancora non capisc che è BufferedWriter
    non capisco:
    String parts[] = input.split("\\s");
    \\s
    \r
    writer.flush();
    writer.close();
    throws IOException
Devi accedere o registrarti per scrivere nel forum
18 risposte