Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    4

    Leggere solo ultime righe di un file con InputStream

    Ciao, come da domanda mi ritrovo a dover leggere da file in memoria solo le ultime n righe.
    Mi sono avvicinata all'I/O da pochissimo, e capirci qualcosa non è stato semplice, quindi se il problema è sciocco abbiate pietà..
    Praticamente ho dei file salvati con tutti i movimenti di un conto corrente (un numero di righe diverse per ogni file a seconda di quanti movimenti il conto ha fatto dalla creazione), l'utente vuole vedere gli ultimi 10. Con un while so leggerle da inizio file e basta

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: Leggere solo ultime righe di un file con InputStream

    Originariamente inviato da ty-chan
    Ciao, come da domanda mi ritrovo a dover leggere da file in memoria solo le ultime n righe.
    Mi sono avvicinata all'I/O da pochissimo, e capirci qualcosa non è stato semplice, quindi se il problema è sciocco abbiate pietà..
    Praticamente ho dei file salvati con tutti i movimenti di un conto corrente (un numero di righe diverse per ogni file a seconda di quanti movimenti il conto ha fatto dalla creazione), l'utente vuole vedere gli ultimi 10. Con un while so leggerle da inizio file e basta
    Vedi l'InputStream come un flusso di byte di cui non conosci il significato.
    Quello che vuoi fare tu è invece fare una ricerca dentro il file (sapendo che ha un significato).
    Potresti farlo usando un RandomAccessFile, resta da conoscere sempre e comunque di quanto devi skippare (Il problema principale).

    domadna: perché non ti tieni sempre a portata di mano le ultime 10 operazioni e backuppate in luogo sicuro il resto? (tieni il delta insomma)
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    4
    Ah ecco mi sfuggiva il concetto in effetti
    Quindi in pratica tu mi stai consigliando di tenere in memoria due file per ogni conto: uno con gli ultimi 10 movimenti e un altro con l'elenco completo? Quindi ad ogni movimento effettuato aggiornerei entrambi... in ogni caso quindi non avrei mai la possibilità di sfruttare il secondo giusto? Poiché non posso fare interrogazioni come 'movimenti effettuati a giugno 2012' cose così.. mentre per quanto riguarda il primo file, dovrei fare un controllo se supera le 10 righe e in quel caso eliminare la prima prima di aggiungere l'ultima! Non ho mai provato la cancellazione, si può fare la cosa che ho detto?

    Altrimenti non sarebbe possibile avere un unico file, ed inserire l'ultimo movimento in testa anziché in coda? Così eventualmente potrei stampare gli ultimi 10 movimenti al contrario prendendo le prime 10 righe di questo file...

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    quando crei un delta, in genere parti da avere un file vuoto. Quando ne hai 10, fai un append al file di backup della differenza e ritorni al file vuoto.
    Puoi benissimo fare l'append 1 volta al gg (non cambia molto). Il vantaggio è che 99 volte su 100 accedi al file piccolo, solo quando vuoi ricerche esaustive vai al grande (quindi ottimizzi).

    La tua soluzione (append in testa) funziona a livello teorico, a livello pratico diventa un casotto, perché devi spostare in basso tutto il contenuto (cosa non banale), quindi tanto ne vale leggere tutto (e parsare).

    Un consiglio: non lavorare con InputStream imponendo un significato al flusso dei byte, tu hai solo una sequenza di byte, cosa in realtà rappresentano, per ragionare bene e risolvere il problema, non ti importa. Ti posso dire che ti è di intralcio (e non ti fa ragionare bene sul problema).

    Parli di un c/c, se io avessi che so un file di testo? un diario?

    Cancellare una voce (nel tuo caso non so quanto senso abbia perché significa cancellare un'operazione) significa lasciare invariato quello che c'è prima, cancellare, e spostare tutto quello che c'è dopo. Anche questa, operazione non banale.

    Se noti in tutto questo ragionamento io non ho mai parlato di entry di c/c, ma in generale (proprio per fari capire quanto devi distaccarti dal contenuto semantico del flusso di byte )
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    4
    Valia mi devi scusare ma io quando parli di delta non capisco in realtà a cosa ti riferisci Sono andata a cercare.. mi dice che sono piccoli file che contengono la differenza tra due file. Nel mio caso uno di questi due file sarebbe la lista movimenti completa, ma l'altro? Inoltre non so come si implementerebbe... dove posso trovare info?
    Invece per quanto riguarda il concetto generale di InputStream un po' penso di esserci grazie... cercando di interpretare il tuo delta mi è venuta in mente un'altra soluzione cmq, anche se non mi rendo conto di quanto sia dispendiosa in termini di risorse... ovvero, non potrei tenere in memoria due file, uno con la lista completa e uno con gli ultimi 10 movimenti così coinvolti: ad ogni avvio del programma carico in una linkedlist (mediante ObjectInputStream che mi permette di downcastare quello che leggo) il contenuto di questo file con gli ultimi 10 movimenti, poi ad ogni movimento che avviene nel programma lo appendo alla lista movimenti completa e contemporaneamente lo aggiungo in coda alla linkedlist eliminandone la testa (che sarebbe il più vecchio degli ultimi 10 movimenti xD) in modo che una stampa dei suoi elementi corrisponda alla richiesta degli ultimi 10 movimenti, e a fine programma la risalvo nel suo file corrisponde...
    Spero che quello che ho scritto sia comprensibile, cmq mi aggiornerò su questi delta files nel frattempo

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da ty-chan
    Valia mi devi scusare ma io quando parli di delta non capisco in realtà a cosa ti riferisci Sono andata a cercare.. mi dice che sono piccoli file che contengono la differenza tra due file. Nel mio caso uno di questi due file sarebbe la lista movimenti completa, ma l'altro? Inoltre non so come si implementerebbe... dove posso trovare info?
    il delta in realtà è un concetto matematico, indica per un elemento la differenza esistente tra due istanti differenti.
    Applicato all'informatica (e al tuo problema) indica che tu tieni la copia generale ben salvata su disco e in memoria ti tieni solamente il delta (cioè la differenza) tra lo stato attuale e quello memorizzato (in dettaglio quindi ti tieni solo la nuova operazione).
    Se tu hai le operazioni, ti tieni solo le operazioni effettuate in memoria (o in un file cmq piccolO) e ogni tot di tempo aggiorni quello grande. Tenere il delta vuole dire questo.
    Originariamente inviato da ty-chan
    Invece per quanto riguarda il concetto generale di InputStream un po' penso di esserci grazie... cercando di interpretare il tuo delta mi è venuta in mente un'altra soluzione cmq, anche se non mi rendo conto di quanto sia dispendiosa in termini di risorse... ovvero, non potrei tenere in memoria due file, uno con la lista completa e uno con gli ultimi 10 movimenti così coinvolti: ad ogni avvio del programma carico in una linkedlist (mediante ObjectInputStream che mi permette di downcastare quello che leggo) il contenuto di questo file con gli ultimi 10 movimenti, poi ad ogni movimento che avviene nel programma lo appendo alla lista movimenti completa e contemporaneamente lo aggiungo in coda alla linkedlist eliminandone la testa (che sarebbe il più vecchio degli ultimi 10 movimenti xD) in modo che una stampa dei suoi elementi corrisponda alla richiesta degli ultimi 10 movimenti, e a fine programma la risalvo nel suo file corrisponde...
    perché devi caricare il file all'avvio? Caricarlo non è strettamente necessario (specie all'avvio).
    Ad esempio, hai 20 utenti, ognuno ha un file di 20 M con tutti i movimenti, prenderti gli ultimi 10 di ognuno pesa in termini di risorse consumante.
    Scenario 1: non ti viene mai chiesto l'elenco delle ultime 10 operazioni, ma ne introduci un paio per un paio di utenti --> hai caricato inutilmente la lista.
    Scenario 2: fai un paio di operazioni di input per l'utente x e chiedi le ultime 10 per gli utenti y e z. Hai fatto solo 2 load (contro 20).

    Quando un utente ti aggiunge operazioni, te le salvi in un file (che cmq non supera qualche K e non hai spreco di risorse per leggerlo/scriverlo).

    Poi ogni 50/100 operazioni fai il backup (cioè apri in append il file di partenza e ci aggiungi le ultime opzioni fatte).

    Ma se non hai fatto operazioni di nessun tipo, non hai motivo per caricare in memoria e tenere risorse.
    RTFM Read That F*** Manual!!!

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.