Visualizzazione dei risultati da 1 a 7 su 7

Discussione: creazione stringa

  1. #1

    creazione stringa

    Salve ho un problema con un programmino, in poche parole devo leggere un file .txt, che poi dopo una serie di calcoli dovrò restituire il risultato sempre in .txt.
    Il problema sta nel stampare in una stringa questo file txt in modo da lavorarci,ma poichè il file è molto lungo (10MB) appena compilo con Scite si imballa, nel senso che resta in esecuzione.
    Potete aiutarmi?

    Questo è il codice.

    import java.io.*;

    public class readingFile2
    {


    public static void main(String args[])
    {

    String stringa="";

    ConsoleReader myConsole = new ConsoleReader(); // ricordate cosa c'è dietro?
    System.out.println("digita nome file da leggere");
    String nomeFile=myConsole.readLine();

    System.out.println("contenuto file "+nomeFile);

    try
    {
    FileReader lettoreDelFile = new FileReader(nomeFile);

    int a=0;

    int indice1=0;
    int indice2=0;

    while ((a=lettoreDelFile.read())!=-1)
    {

    stringa+=(char)a;

    indice1=indice2;
    indice2=a;

    //Inseriamo una stringa("$$") per capire che c'è un carattere speciale del tipo \n
    if(indice1==13 && indice2==10)



    }
    System.out.println(stringa);
    stringa="";

    System.out.println();
    }
    catch(FileNotFoundException e)
    {
    System.out.println(e);
    }
    catch(IOException e)
    {
    System.out.println(e);
    System.exit(1);
    }
    }
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: creazione stringa

    Originariamente inviato da furiacecaj83
    codice:
    while ((a=lettoreDelFile.read())!=-1)
    {
        stringa+=(char)a;
    Ci sono 2 grossi problemi:
    a) Stai leggendo 1 carattere per volta.
    b) Usi la concatenazione delle stringhe per aggiungere 1 carattere.

    Tutto questo è pesantissimo. A dispetto della semplicità con cui si fa la concatenazione, sotto sotto è più complicato, viene istanziato un StringBuffer (o StringBuilder da Java 5), viene fatto l'append di 'stringa' e poi di 'a', quindi viene istanziato un nuovo String ottenuto dal toString() del buffer e il buffer sarà poi reso eleggibile per il g.c. perché non più usato.

    E tutto questo ad ogni ciclo e la cosa si appesantisce man mano che la dimensione della stringa aumenta!

    No, usa espressamente un StringBuffer/StringBuilder, leggi a "blocchi di char" (con un piccolo array char[] di buffer temporaneo) e poi appendi ogni blocco nel StringBuffer/StringBuilder.
    Alla fine puoi ottenere un String ma a seconda di cosa devi fare puoi farne a meno e usare direttamente lo StringBuffer/StringBuilder.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    capito, ok ora ci provo , grazie mille x ora... in caso riscontro problemi nel costruire il codice che mi hai consigliato ti ricontatto

  4. #4
    Qualcuno mi potrebbe dire come verrebbe il codice??
    ripeto: devo leggere un file .txt(molto grosso) e memorizzarlo in una stringa per poterci poi lavorare.

    Non riesco a scrivere un codice corretto!

    grazie

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da furiacecaj83
    Qualcuno mi potrebbe dire come verrebbe il codice??
    ripeto: devo leggere un file .txt(molto grosso) e memorizzarlo in una stringa per poterci poi lavorare.
    Molto molto abbozzato:

    codice:
    StringBuffer strBuf = new StringBuffer();
    
    FileReader fr = new FileReader(nomeFile);
    
    char[] tmpBuf = new char[1024];
    int len;
    
    while ((len = fr.read(tmpBuf)) != -1) {
        strBuf.append(tmpBuf, 0, len);
    }
    Il trattamento corretto delle eccezioni e del close() del reader devi farlo tu, io l'ho omesso per brevità. Alla fine hai un StringBuffer pieno, puoi ottenere un String con toString() ma a seconda di cosa devi fare o dove devi passarlo, potrebbe andare bene anche solo StringBuffer.

    Il consiglio è di fare un bel metodo in cui "incapsuli" tutto quanto, del tipo es.:

    public static StringBuffer leggiFile(String nomeFile) throws IOException { ....... }

    E nota, che fa "uscire" le eccezioni che gestirai altrove.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    ma potrei provare con BufferedReader x la lettura e per restituire l'output il PrintWriter? xkè ho visto che alcuni programmi lo leggevano così.
    Il problema principale è esaminare il tutto all'interno del file? Come fare?
    In questo file ci sono moltissimi dati (un dato per ogni riga) e devo confrontare solo alcune righe di questo file tra loro, per eliminare quelle che si ripetono.

    Grazie mille

  7. #7
    ok risolto grazie lo stesso

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.