Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    202

    [JAVA] RandomAccessFile

    Leggendo l'utilità di questa classe, ho impostato la scrittura sempre alla fine del file e fin qui ci sono arrivato, ora stò cercando su internet ma non trovo niente, la soluzione a questo problema:

    se devo scrivere sulla riga 3, e appendere in coda a quello che c'è già scritto, con random access file, come posso fare??

    e se devo leggere da una specifica riga, tipo riga 2, come sposto il puntatore con la funzione seek() su quella riga??

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    non è che lo fai con quella lib, quello è un suggerimento che ti può aiutare ad ottenere quello che vuoi. Se leggi le API non hai modo di andare dove ti interessa, hai modo di skippare una certa quantità di dati. In realtà difficilmente "a meno che non sei costretto" operi così sui file. E fidati, tu non sei costretto.
    Spesso carichi tutto in memoria, fai la tua modifica e riscrivi.
    Ti ho già detto che gente più esperta di te non si imbarca nella scrittura di questo algoritmo, perché non è di facile gestione ed è facile sbagliare e giungere a risultati inconsistenti. E' una situazione fattibile nel tuo caso perché hai un database piccolo. Se prevedi che il tuo file cresca in dimensione, devi obbligatoriamente usare altri meccanismi per immagazzinare informazioni.


    Nel tuo caso, in dettaglio, hai un file che sai essere di testo, ma sei sicuro di come arrivare alla riga 3? Non ci sono API che ti permettono di saltare righe, ci sono API che ti permettono di skippare un certo numero di byte, ma per la riscrittura non so fino a che punto ti convenga fare questo mestiere.

    Come ti ho detto ieri, una modifica falla in questo modo

    1. carica tutto il file
    2. modifica la riga
    3. scrivi tutto il file
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    202
    non devo solamente scrivere, devo anche leggere da una riga a casaccio....e garantire la mutua-esclusione....in caso di + thread che vogliano utilizzare la stessa riga.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    dubito che date le tue competenze ti dicano di agire a livello di riga...la mutua esclusione riguarda l'accesso al file, non al contenuto.
    Garantire la mutua esclusione significa garantire che alla risorsa condivisa si acceda uno per volta, il contenuto poi lo devi gestire tu (per mantenere la consistenza dei dati)

    Ti ripeto, devi garantire che un thread per volta scriva il file, ma andare a casaccio su una riga che vuoi (avendo il numero di riga) su file normali (di testo oltretutto) non viene in generale fatto.
    Quando si hanno queste necessità si agisce in mutua esclusione e si fa in modo che il file sia sempre consistente.

    Non puoi pretendere che un thread ora ti modifica solo la riga 10, lasciando intatto il contenuto del file (quindi cambi solo un carattere della riga) e nel contempo abbia il lock in scrittura thread 2 che cancella la riga 9!!!

    Deve accedere ai dati e completare uno per volta!!!!
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    202
    il file pdf di cui dubiti è una traccia d'esame....e chiedono specificatamente di scrivere e leggere da una riga compresa tra la riga 0 e la riga 5 ad esempio, in caso di scrittura su una riga dove già c'è scritto qualcosa deve essere messo in append alla fine della riga, in caso di scrittura su una riga dove già stà scrivendo qualcuno wait() di quel thread, finchè il thread che occupa la riga non invoca la notify().....

    significa quindi che dando il client una riga su cui voler scrivere, il server si posiziona su quella riga e scrive...!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    sia chiaro una volta per tutte: in scrittura sul file vai uno per volta.

    mettiamo che io e te siamo 2 thread, io accedo per prima e metto un lock sulla riga 4.
    L'accesso al file, secondo la tua logica, è libero, quindi tu accedi in scrittura alla riga 3. Lo puoi fare perché il lock è sulla 4, cancelli la riga 3.
    Nel frattempo io finisco la scrittura, ma ho consistenza dei dati? Sto scrivendo la riga corretta?

    Un lock per riga lo puoi fare se ad esempio ti carichi tutto all'avvio, ti metti tutto su una mappa, (chiave numero riga, valore riga) e allora si che puoi lockare sulle righe e mantenere consistenza dei dati.

    Ti ho fatto solo un esempio per farti capire che non è semplice gestire in primis l'accesso random al file, in secondo luogo non è facile gestirne la concorrenza (e quindi la consistenza).
    Questa cosa puoi iniziare a pensarla con file a record a lunghezza fissa, in cui sai a priori che i dati sono organizzati in record lungo ad esempio 80 caratteri, quindi andare alla riga 5 significa skyppare 5 * 80 byte (non oso pensare a codifiche multibyte).
    Ma i file a lunghezza fissa non sono un generico file txt
    RTFM Read That F*** Manual!!!

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    202
    Si realizzi un'applicazione client-server multi-thread per la gestione delle operazioni di lettura e
    scrittura di un file che si compone di R righe. La comunicazione tra applicazione client e server deve
    essere realizzata utilizzando le socket offerte dalla libreria java.net:
    • L’applicazione client genererà T thread, chiamati ClientThread, ognuno dei quali allo scadere di
    un tempo t deciderà di fare un'operazione di lettura o di scrittura. Successivamente, sceglierà in
    maniera casuale la riga r su cui fare l’operazione (lettura o scrittura), e contatterà il server
    chiedendo di realizzare alla riga r del file l'operazione richiesta;
    • L'applicazione server deve essere implementata con una politica multi-threading per consentire
    la gestione concorrente delle richieste. La risorsa gestita dal server, il file, viene acceduta
    mediante un wrapper, chiamato FileWrapper, in grado di eseguire le operazioni di lettura e
    scrittura sul file.

    Questa è parte della traccia....ho capito quello che dici tu, che sarebbe più facile così, ma permetti che all'esame devo rispettare quanto chiesto? :P

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e se fai come dico io lo rispetti.
    L'applicazione server deve essere implementata con una politica multi-threading per consentire
    la gestione concorrente delle richieste. La risorsa gestita dal server, il file, viene acceduta
    mediante un wrapper, chiamato FileWrapper, in grado di eseguire le operazioni di lettura e
    scrittura sul file.
    ti dice anche come fare.
    Hai FileWrapper che ti carica il file e mette il contenuto su una mappa, membro private e static.
    Sarà il server (quindi il wrapper) a decidere COME si accede alle singole righe.
    Alla fine salvi tutto

    Non vedo un punto in cui ti dica che devi avere accesso concorrenziale alla riga del file, proprio come pensavo, date le tue competenze non ti chiede esplicitamente accesso casuale ad una riga del file
    RTFM Read That F*** Manual!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    202
    no chiede che sia fatto questo:

    Quando il server riceve una richiesta, attiva un thread, chiamato Worker, fornendo la stringa
    della richiesta di operazione ricevuta dal ClientThread;
    5. Il Worker interpreta la stringa ricevuta e contatta FileWrapper per espletare la richiesta
    (scrittura o lettura);
    6. Il FileWrapper gestisce in parallelo le richieste per righe diverse del file, mentre gestisce in
    mutua esclusione operazioni sulla stessa riga.
    7. Quando il FileWrapper ha eseguito l'operazione, comunica al Worker l'esito: la riga letta oppure
    la riga scritta;
    8. Il Worker invia al ClientThread l'esito dell'operazione che ha ricevuto dal FileWrapper;

    quindi il worker riceve la stringa s1+s2+s3, che sono rispettivamente s1= w o r, s2= n°riga, s3= stringa da scrivere in caso di w.....il worker scompatta lastringa e tramite w o r, richiama il metodo di FileWrapper WriteOnFile oppure ReadToFile, ma è qui che devono essere gestite le operazioni di scrittura e lettura......!!!

    in lettura ho scoperto come fare, molto semplice.....

    codice:
    String lette = null;
    	String esito=null;
    	String rigatoRead=null;
    	int i=0;
    	while ((esito=raf.readLine())!=null){
    		lette=raf.readLine();
    		if (i==riga){ rigatoRead=lette;}
    		i++;
    	}
    		
    	return rigatoRead;
    In scrittura potrei usare lo stesso metodo...contare praticamente il numero di letture fatte, e quando i arriva al numero di riga che voglio, effettuare la scrittura dove se è =null, scrive normalmente, altrimenti scrive con l'append

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    202
    no aspè ragionandoci, il metodo in scrittura al 99% non dovrebbe andare....ora provo...x la lettura no problem, mi funziona!

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.