Dateien richtig auslesen

Lasnik

Mitglied
Ich habe folgenden (ziemlich uneleganten) Weg eine PDF von einer URL auszulesen:
Code:
private static void getPdf(String url) throws IOException {
    BufferedInputStream in = new BufferedInputStream(new URL(url).openStream());
    Files.copy(in, new File(bufferFile).toPath(), StandardCopyOption.REPLACE_EXISTING);
    in.close();
}

private static String[] readPdf() throws IOException {
    PDFTextStripper stripper = new PDFTextStripper();
    PDDocument document = new PDDocument();
    String[] textArray = stripper.getText(PDDocument.load(new File(bufferFile), "schule")).split(" ");
    document.close();
    return textArray;
 }

In der readPdf() Funktion nutze ich folgende Libary: https://pdfbox.apache.org/ .
Der Rest müsste selbsterklärend sein.

Hier meine beiden Fragen:
1. Gibt es einen eleganteren Weg, also dass ich direkt aus der von der URL kopierten Pdf ein String(array) bekomme?
2. Wie fixe ich folgenden Error, wenn ich beide Funktionen zweimal in einer anderen Funktion hintereinander laufen lasse?:
Code:
Exception in thread "main" java.nio.file.FileSystemException: C:\Users\Niklas\Desktop\Test1.pdf: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.

    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269)
    at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:108)
    at java.nio.file.Files.deleteIfExists(Files.java:1165)
    at java.nio.file.Files.copy(Files.java:3004)
    at projects.Statistics.getPdf(Statistics.java:30)
    at projects.Statistics.loop(Statistics.java:52)
    at projects.Statistics.main(Statistics.java:22)
Ich dachte eigentlich, dass meine Funktionen wieder alles geschlossen hätten aber das haben sie wohl nicht.

Danke schoneinmal!
 
Du erstellst ein PDFocument, welches du schließt und sonst nicht nutzt... PDDcument.load gibt eine Instanz zurück und diese solltest Du in eine Variable schreiben um diese dann auch schließen zu können ... ggf try with resources verwenden, damit das Schließen immer erfolgt.
 
Gibt es einen Weg den BufferedInputStream in einer File Variable zu speichern und diese dann diese direkt dem PDDocument zu überreichen, ohne es umständlich im System zu speichern?
 
PDDocument hat mehrere load Methoden. Statt mit einem File kannst du load auch mit einem InputStream aufrufen. Somit ist ein Speichern einer Datei nicht als Zwischenschritt notwendig.
 

Neue Themen


Zurück
Oben