13. november 2002 - 11:43Der er
3 kommentarer og 1 løsning
Læs og skriv i en RandomAccessFile
Simpelt og enkelt skal jeg lige være sikker på en ting. Er det muligt, hvis jeg med RandomAccessFile åbner en fil i flere instancer, men sikrer at jeg via Synchronize ikke både skriver og læser på samme tid, ikke at ødelægge data ?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Det er næppe nok at bruge synchronize idet du ikke er sikker på at der bliver flushet med det samme. Du kan gøre to ting, for det første kan du lave en FileLock der låser filer mens du skriver, dels kan du forcere at der skrives til disken. FileLock: File file = new File("filename"); FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); FileLock lock = channel.lock(); try { lock = channel.tryLock(); // her skriver du til filen } catch (OverlappingFileLockException e) { } lock.release(); channel.close(); Forcer skrivning til disken: FileOutputStream os = new FileOutputStream("filename"); FileDescriptor fd = os.getFD(); // skriv til filenos.write os.flush(); fd.sync(); Du skal så kombinere de to teknikker. Det er muligt at du i stedet vil bruge MemoryMappedBuffer klassen fra java.nio hvis mange processer skal bruge og opdatere filen. Med denne klasse laves en kopi af filen i memory og derfor bliver skrivningen meget hurtigere.
Lidt blandede kommentarer: * du kan aldrig ødelægge noget ved 1 write + X read, worst case er garbage i read, kun >1 write kan være farlig * hvis du kører i samme JVM ville jeg da tro, at det var mere hensigtsmæssigt at have en enkelt instans per fil (men du bør stadigvæk synkronisere ved multiple threads writing) * i hvertfald på nogle platforme burde RandomAccessFile kunne håndtere multiple writes uden synchronize
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.