Input/Output Files von A nach B kopieren

friednoodles

Aktives Mitglied
Hallo, ich habe in meinem Projekt einen Ordner der mehrere .htm Dateien enthält. Diese möchte ich in einen Ordner kopieren der in APPDATA liegt.
Bei fast allen meiner Versuche bekam ich eine NPE und bin mir nicht mehr sicher was ich noch probieren kann.

Beide Parameter die ich verwende sind vom Typ File, source zeigt direkt auf ein File innerhalb meines Projekts: projectFolder2\file.htm
dest zeigt auf den Ordner in dem ich das file haben möchte: C:\Users\user\AppData\Roaming\Microsoft\Htmfiles

Die Methode die ich verwende sieht wie folgt aus
Java:
    private static void copyFileUsingStream(File source, File dest) throws IOException {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(source);
            os = new FileOutputStream(dest);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
        } finally {
            is.close();
            os.close();
        }
    }

Beim debuggen sehe ich, dass die Zeile mit dem Byte Array nicht mehr ausgeführt wird und der Code direkt zu finally springt, wo dann bei os.close die NPE auftaucht.
 
Wie sieht denn die NPE aus?


BTW: Nutz try-with-resources und spricht irgendwas gegen Files.copy oder InputStream.transferTo?
 
Wie sieht denn die NPE aus?


BTW: Nutz try-with-resources und spricht irgendwas gegen Files.copy oder InputStream.transferTo?

Java:
Exception in thread "main" java.lang.NullPointerException
    at myProject.copyFileUsingStream(myProject.java:364)
    at myProject.main(myProject.java:295)

Zeile 295 ist einfach der Aufruf in der Main und Zeile 364 ist die Zeile os.close(); aus dem ersten Post.

Falls es hilft, so komme ich auf meine zwei Parameter:
Java:
String startFolder = System.getenv("APPDATA");
String dest_folder = "Htmfiles";
File dir_htm_dest= new File(startFolder + "\\Microsoft\\" + dest_folder);

File dir_htm_source = new File(htmFiles); //htmFiles enthält den Ordnernamen innerhalb meines Projekts
File[] htmFileArray = dir_htm_source.listFiles();
for (File htmFile: htmFileArray ) {
copyFileUsingStream(htmFile, dir_htm_dest);
}
 
Oh, was ich eigentlich fragen wollte: fliegt noch eine andere, zb eine IOException? Die NPE wirst du mit try-with-resources los.


So wie ich es zuvor probiert hatte flog nur die NPE, keine andere Exception.
Mit try-with-resources wird die NPE tatsächlich nicht mehr geworfen, aber die Zeilen ab dem Byte Array werden trotzdem nicht ausgeführt. Benutze ich den Block so richtig?

Java:
    private static void copyFileUsingStream(File source, File dest) throws IOException {

        try (InputStream is = new FileInputStream(source); OutputStream os = new FileOutputStream(dest)) {
            
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
        } catch (IOException e) {
            Log.info("copy process failed");
        }
    }
 
Ich nehme einmal an, dass du "copy process failed" audgegeben bekommst.

Wieso gibst du da nicht im catch die ganze Exception aus? Also e.getMessage() ausgeben und auch e.printStackTrace() einbauen.
 
Ja, richtig benutzt wird das.
Fliegt wirklich keine Exception?

os kann im Code vorher nur null sein, wenn new FileOutputStream fehl schlägt - dann sollte es aber eine Exception geben.

dest ist, wenn ichs grad richtig sehe, keine Datei , sondern ein Ordner? Schreiben kannst du natürlich nur in Dateien, solltest dort also eine Datei angeben.
 
Ich nehme einmal an, dass du "copy process failed" audgegeben bekommst.

Wieso gibst du da nicht im catch die ganze Exception aus? Also e.getMessage() ausgeben und auch e.printStackTrace() einbauen.

Ja hast recht, hab das eben mal eingefügt und der Stacktrace sieht wie folgt aus:
Java:
java.io.FileNotFoundException: C:\Users\user\AppData\Roaming\Microsoft\Htmfiles(Zugriff verweigert)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at myProject.copyFileUsingStream(myProject.java:353)
    at myProject.main(myProject.java:296)
Verstehe absolut nicht warum nun der Zugriff verweigert ist...
 
Also wenn Du kein Files.copy verwenden willst, dann könntest Du da noch etwas Code hinzufügen:

Prüfung, ob dest ein Verzeichnis ist. Ist dies der Fall, dann wird das Ziel zusammengesetzt mittels Paths.get(dest.getAbsolutePath(), source.getName()) - das gibt dir einen Path zurück, der aus dem Pfad von dest und dem Filenamen von source besteht. Daraus ein File machen und schon hast Du das neue, richtige Ziel.
 

Neue Themen


Zurück
Oben