Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    16

    Lettura E Scrittura in memoria condivisa di un file.txt in java

    Salve ho un piccolo problema.
    ho diversi thread che accedono ad un monitor (class Descrittore) per leggere e scrivere su un file il loro stato.
    Nello specifico con la funzione begin scrivino il loro stato iniziale
    mentre con la primitiva prepare leggono tutto il file si fermano quando trovano la riga che gli interessa.
    A questo punto sorge il problema :
    io dovrei sovrascrivere lo stato di questi processi mentre con questo codice (che riporto sotto) lo stato del processo mi viene aggiunto alla fine del file (quindi ho due line per ogni processo)
    come faccio a far si che venga invece sovrascritta la linea?
    Riporto il codice e segnalo con N.B la parte interessata...
    Ringrazio chiunque saprà essermi di aiuto

    Codice due funzioni e del costruttore del monitor
    public Descrittore () throws IOException
    {

    free=true;
    sospesi=0;
    System.out.println("Creazione file Descrittore di azione");
    f = new File("Descrittore.txt");
    file = new FileOutputStream(f);
    output = new PrintStream(file);

    }
    //primitiva begin action
    public void begin(int id) throws InterruptedException, IOException {
    lock.lock ();
    try
    {

    while (!free)
    {
    sospesi++;
    System.out.println("Processo "+ id +" mi sospendo");
    processi.await();
    sospesi--;

    }

    scrivi=new String (""+id+" working");

    free=false;
    System.out.println(id+" : sto per modificare il descrittore");
    output.println(scrivi);

    System.out.println(id+ ": descrittore modificato");
    free=true;
    if(sospesi>0)
    processi.signal();


    }finally {lock.unlock();}
    }

    //primitiva Prepare
    public void prepare (int id)throws InterruptedException, IOException
    {

    String line;
    boolean esito=false;
    lock.lock();
    try
    {
    while (!free)
    {
    sospesi++;
    System.out.println("Processo "+ id +" mi sospendo");
    processi.await();
    sospesi--;
    }
    fr = new FileReader(f);
    input = new BufferedReader(fr);

    String check= new String (""+id);

    line=input.readLine();
    while ( !esito ) {

    if (line.startsWith(check))
    {

    esito=true;
    System.out.println(id+ "trovato");

    (N.B CREDO SI QUI IL PROBLEMA CON QUESTA ISTRUZIONE MI SCRIVE ALLA FINE DEL FILE MENTRE IO VOGLIO SOVRASCRIVERE LA LINEA)-->output.println(id+" ready");

    }
    else line = input.readLine();

    }

    fr.close();
    free=true;
    if(sospesi>0)
    processi.signal();

    }finally{lock.unlock();}



    }
    //distruzione descrittore di azione
    public void termina ()
    {

    // f.delete();


    }
    }

  2. #2
    guarda, risposta MOLTO alla buona perchè mettersi "contro" i thread richiede uno sforzo mentale pazzesco! hehe... ad ogni modo, se il file non è molto lungo, quando devi andare a scrivere puoi leggere prima tutto il file fino alla penultima riga, memorizzarlo dentro uno stringbuilder e poi riscriverlo con la riga nuova. altrimenti se puoi, devi usare i cursori del file. Quindi puoi provare con il metodo Seek, per andare con il cursore del file in un punto ben preciso, quindi sovrascrivere la riga. nota che se la riga che inserisci è più corta, ti rimangono i "resti" della riga precedente

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.