Avatar billede gzus_dk Nybegynder
13. november 2002 - 11:43 Der 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 ?
Avatar billede carstenknudsen Nybegynder
13. november 2002 - 11:52 #1
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.
Avatar billede arne_v Ekspert
13. november 2002 - 11:55 #2
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
Avatar billede disky Nybegynder
13. november 2002 - 12:10 #3
garbage i read og da også rigeligt grund til at beskytte access til filen.
Avatar billede arne_v Ekspert
13. november 2002 - 12:12 #4
Fuldstændigt enig.

Men jeg kommenterede på det originale spørgsmål.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester