Don’t try to fake it

Hm. JAVA weirdness vandaag ontdekt. Men neme een bestand foobar.txt. Vervolgens beschouwen we even deze code:

File foo = new File('foobar.txt');
System.out.println(foo.getPath());
foo.renameTo(new File('barfoo.txt'));
System.out.println('foo.getPath());

Dat zou pretty straightforward moeten zijn: de code hernoemt het foobar.txt bestand naar barfoo.txt. Voor en na de operatie wordt via de getPath() operatie het pad en de naam van het bestand opgehaald en getoond.

De logica dicteert dat nadat de bestandsnaam van het foo object is gewijzigd, de getPath() methode de nieuwe bestandsnaam zou weergeven.

Helemaal niet dus.

De getPath() methode blijft de oude naam nog altijd tonen. Mogelijk alternatief om dat op te vangen is werken met een extra File object:

File foo = new File('foobar.txt');
System.out.println(foo.getPath());
File newFoo = new File('barfoo.txt');
foo.renameTo(newFoo);
System.out.println('newFoo.getPath());

Mijns insziens niet meteen het meest propere alternatief want het kost je geheugen, zeker als je met grote operaties bezig bent, maar het werkt wel. JAVA adepten onder ons, wat denken jullie ervan?

4 replies

  • Uit de javadoc: “Instances of the File class are immutable; that is, once created, the abstract pathname represented by a File object will never change.”

    Als het is om te zien of je rename operatie is gelukt, de method File.renameTo geeft een boolean waarde terug. Daaraan kan je zien of het gelukt is.

    Als je het pad met de nieuwe filename nodig hebt in verdere operatie, kan je natuurlijk je originele pad nemen minus de oude filename en er de nieuwe aanplakken…die ken je, want je hebt hem zelf gezet 🙂

    Verder is ook belangrijk om weten dat operaties met File inherently system-dependent zijn. Daarnaast het maken van een File object op zich is niet zo zwaar: het is niet hetzelfde als de file openen voor lezen of hem in het geheugen laden. File is niet meer dan een reference naar een file resource op het bestandsysteem geven.

  • das allemaal chinees voor mij :p

  • Matthias

    25 januari 2008 at 6:48 pm

    @Nicodemus: fijne uitleg 🙂 Merci
    @Eline: Mà alle sjinezen mor nie met den dezen. :p

  • Had dit nog nooit gemerkt. Weird indeed en thx @ Nicodemus voor de uitleg 🙂

Commentaar is gesloten