Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Reset del BufferedReader in letture file cicliche

    Salve a tutti, devo manipolare file di grandi dimensioni (roba di Gb per intenderci) e ho bisogno di accedere in lettura più volte allo stesso file. Dato che creare e distruggere in continuazione gli stessi oggetti non è una buona pratica, pensavo di creare il buffer fuori dal ciclo e, ad ogni fine iterazione chiuderlo per poi re-istanziarne uno nuovo:

    Codice PHP:
    FileReader lettore = new FileReader(nomeListaB);
    BufferedReader buffer null;

    while(
    condizione) {
       
    buffer = new BufferedReader(lettoreB);
       
    String rigaFile buffer.readLine();

       
    //Istruzioni varie

       
    buffer.close();   

    Così facendo mi viene restituito l'errore: java.io.IOException: Stream closed (non gestisco le eccezioni ma semplicemente le rilancio). Qualcuno capisce cosa non va?

    La mia esigenza è quella di resettare il BufferedReader, sono a conoscenza dell'esistenza dei metodi mark/reset ma in mark andrebbe inserito un intero che rappresenta "Limit on the number of characters that may be read while still preserving the mark", io questo valore non lo conosco a priori e penso che non valga la pena mettersi a calcolarlo.

    Grazie per l'aiuto

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Ma non hai a che fare con dei file di testo?

    Allora calcolare la dimensione è decisamente semplice:

    codice:
    File f = new File( <tuo file> );
    long dimensione = f.length();
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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

    Re: Reset del BufferedReader in letture file cicliche

    Originariamente inviato da Zoimaru
    Salve a tutti, devo manipolare file di grandi dimensioni (roba di Gb per intenderci) e ho bisogno di accedere in lettura più volte allo stesso file. Dato che creare e distruggere in continuazione gli stessi oggetti non è una buona pratica
    Beh ma dipende .... nel senso che comunque dovresti fare delle valutazioni volta per volta.

    Esempio, in un codice del genere:
    codice:
    Integer val = 0;
    for (int i = 0; .....) {
        val += i;
    }
    è chiaro che è una pessima idea, in quanto ad ogni ciclo viene effettuato il "boxing" con restituzione di un altro Integer (sicuramente nuovo come identità di oggetto se si va oltre il range degli Integer "cachati" dal framework che è -128..+127).

    Ma nel tuo caso, beh, fai un piccolo ragionamento: il tuo file è di Gbytes .... istanziare un nuovo BufferedReader è una piccolezza ... una operazione infinitesima rispetto a leggere tutto il contenuto!!!! Quindi ..... che ti importa di "risparmiare" un oggetto che comunque "dura" sicuramente un sacco di tempo???


    Originariamente inviato da Zoimaru
    Così facendo mi viene restituito l'errore: java.io.IOException: Stream closed (non gestisco le eccezioni ma semplicemente le rilancio). Qualcuno capisce cosa non va?
    Che la istanziazione e la chiusura la fai ad ogni ciclo di lettura di 1 riga .... che non ha senso.

    Originariamente inviato da Zoimaru
    La mia esigenza è quella di resettare il BufferedReader, sono a conoscenza dell'esistenza dei metodi mark/reset ma in mark andrebbe inserito un intero che rappresenta "Limit on the number of characters that may be read while still preserving the mark", io questo valore non lo conosco a priori e penso che non valga la pena mettersi a calcolarlo.
    No, alt. A parte il fatto che il mark/reset può anche non essere supportato .... c'è un metodo apposito: markSupported() per stabilire se è supportato. E ovviamente il supporto dipende anche dallo stream che sta "sotto" (dentro, nel senso di incapsulamento) il BufferedReader.
    Comunque, quel limit lo imposti tu. E il limit indica solo che dopo quel tot il mark viene invalidato. Quindi cosa si potrebbe pensare? Di mettere il numero più alto possibile se non vuoi che invalidi nulla. Per un int: Integer.MAX_VALUE.

    Comunque ripeto quanto detto sopra: evita 'sti giri ... ricrea tutta la catena di stream/reader.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4

    Re: Re: Reset del BufferedReader in letture file cicliche

    Originariamente inviato da andbin
    Ma nel tuo caso, beh, fai un piccolo ragionamento: il tuo file è di Gbytes .... istanziare un nuovo BufferedReader è una piccolezza ... una operazione infinitesima rispetto a leggere tutto il contenuto!!!! Quindi ..... che ti importa di "risparmiare" un oggetto che comunque "dura" sicuramente un sacco di tempo???
    Capisco il tuo punto di vista, l'oggetto se vogliamo dura abbastanza, però il ciclo che vedi nel codice può dover essere eseguito parecchie volte (con parecchie proporzionale alla dimensione del file in input) e, se è possibile, un modo meno costoso per gestire il buffer mi farebbe comodo.

    Originariamente inviato da andbin
    Che la istanziazione e la chiusura la fai ad ogni ciclo di lettura di 1 riga .... che non ha senso.
    Scusa io ho un oggetto FileReader dichiarato fuori dal ciclo poi, per n volte, gli associo un buffer e infine lo chiudo; se lo facessi fuori dal while funzionerebbe, perché non posso iterare? (Abbi pazienza ma sono interessato a capire anche l'aspetto teorico della questione se possibile)

    Originariamente inviato da andbin
    No, alt. A parte il fatto che il mark/reset può anche non essere supportato .... c'è un metodo apposito: markSupported() per stabilire se è supportato. E ovviamente il supporto dipende anche dallo stream che sta "sotto" (dentro, nel senso di incapsulamento) il BufferedReader.
    Comunque, quel limit lo imposti tu. E il limit indica solo che dopo quel tot il mark viene invalidato. Quindi cosa si potrebbe pensare? Di mettere il numero più alto possibile se non vuoi che invalidi nulla. Per un int: Integer.MAX_VALUE.
    Si nel caso avessi scelto la soluzione mark/reset mi sarei certamente curato di verificarne anche il supporto... sinceramente questa soluzione l'ho scartata anche a causa della seguente minaccia:

    A limit value larger than the size of the input buffer will cause a new buffer to be allocated whose size is no smaller than limit. Therefore large values should be used with care.

    Dunque se metto un numero immane verrà allocato un buffer immane... in pratica mi muore la virtual machine (probabilmente anche mettendo la dimensione corretta, calcolata a partire dalla dimensione del file con la funzione suggerita da avendo a che fare con Gb la situazione non è tanto meglio)

    Se quello che avevo in mente non si può proprio realizzare mi sa che mi toccherà procedere come hai detto tu comunque.

  5. #5
    Perdonate l'up ma nessuno sa come fare per risolvere la faccenda del BufferedReader?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.