1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Objekte freigeben

Discussion in 'Programmieren' started by kroenefl, Sep 3, 2011.

Thread Status:
Not open for further replies.
  1. kroenefl

    kroenefl Kbyte

    Hallo alle zusammen,
    Ich programmiere zur Zeit mit einer Bibliothek, die anscheinend keine Methode besitzt, um die von ihr erstellten Objekte wieder freizugeben.
    Da ich aber die Objekte wieder komplett freigeben will, muss ich mir überlegen, wie ich alle Objekte "zwangsfreigeben" kann.
    Fällt euch dazu etwas ein? Vielleicht das ganze mit dem Thread Manager stoppen oder interrupten? Oder kann der GarbageCollector vielleicht die Ressourcen wieder freigeben?
    Vielen Dank im Voraus
     
  2. kazhar

    kazhar Viertel Gigabyte

    wenn man alle informationen, die du lieferst, auf einen haufen wirft, ist die beste lösung deines problems der reset knopf :rolleyes:
     
  3. kroenefl

    kroenefl Kbyte

    Tut mir leid, ich liefer mal den Code nach:
    Code:
    public static Image loadPdf(String file, int pagenumber) throws IOException{
            /**
            * Loads a PDF document and returns desired pages as images.
            */
            
            RandomAccessFile raf = new RandomAccessFile(file, "r"); //Load a pdf from a byte buffer
            FileChannel channel = raf.getChannel();
            ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
            pdffile = new PDFFile(buf);
    
            
            PDFPage page = pdffile.getPage(pagenumber); // Show the desired page
            shape1.setRect (20., 20., (double)page.getWidth(), (double)page.getHeight());
            image = page.getImage((int)page.getWidth(),(int)page.getHeight(), shape1, null, true, true);
            channel.close();
            raf.close();
            return image;
       }
    
    Also ich rendere eine Seite von einem PDF zu einem Bild, gebe das Bild dann an ein JFrame, wo es dann dargestellt wird.
    Wenn ich nun das PDF aber mit meinem Programm verschieben will, dann geht es nicht, weil das PDF irgendwie noch von meiner loadPdf Funktion gesperrt ist, lasse ich loadPdf nämlich weg, so funktioniert der Verschiebevorgang. Führe ist loadPdf aus und will dann Verschieben, so funktioniert der Kopierteil des Verschiebevorgangs zwar, allerdings wird die Ursprungsdatei nicht gelöscht.
    Wenn ich nur die loadPdf Funktion ausführe, das Image aber nicht im JFrame anzeige, so habe ich denselben Fehler, die Ursprungsdatei kann nicht gelöscht werden, es muss also an loadPdf liegen.
    Wäre nett wenn mir jemand helfen könnte.
     
    Last edited: Sep 3, 2011
  4. kazhar

    kazhar Viertel Gigabyte

    sieht nach java aus ;)
    java hat einen garbage collector, der automatisch oder auf anforderung nicht mehr benutzte objekte entfernt.

    du könntest mal probieren, ob ein einfaches System.gc(); nach der .close() serie ausreicht.
    eventuell hat auch der buffer noch referenzen auf die datei?
     
  5. kroenefl

    kroenefl Kbyte

    Vielen Dank erstmal für die Hilfe :)
    Manchmal vergisst man vor lauter Details die wichtigen Dinge, ja, es handelt sich hier um Java-Code.
    Ein System.gc(); hat nach dem letzten .close(); hat leider nicht geholfen.
    Der Bytebuffer verfügt leider über keine close-Funktion...
     
  6. kazhar

    kazhar Viertel Gigabyte

    kannst du die objekte eventuell (nach dem close und vor dem gc) nullen?
    also

    raf = null;
    channel = null;
    buf = null;
    pdffile = null;
     
  7. kroenefl

    kroenefl Kbyte

    Vielen Dank, das hat geklappt! :)
    Da hätte ich ja fast auch drauf kommen können eigentlich, ist ja nicht so dass ich "null" nicht kennen würde... :)
    Vielen Dank nochmal!
     
Thread Status:
Not open for further replies.

Share This Page