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();
}
}

Rispondi quotando