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:
privatestaticvoidcopyFileUsingStream(File source,File dest)throwsIOException{InputStream is =null;OutputStream os =null;try{
is =newFileInputStream(source);
os =newFileOutputStream(dest);byte[] buffer =newbyte[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.
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:
privatestaticvoidcopyFileUsingStream(File source,File dest)throwsIOException{try(InputStream is =newFileInputStream(source);OutputStream os =newFileOutputStream(dest)){byte[] buffer =newbyte[1024];int length;while((length = is.read(buffer))>0){
os.write(buffer,0, length);}}catch(IOException e){Log.info("copy process failed");}}
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.
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(NativeMethod)
at java.io.FileOutputStream.open(UnknownSource)
at java.io.FileOutputStream.<init>(UnknownSource)
at java.io.FileOutputStream.<init>(UnknownSource)
at myProject.copyFileUsingStream(myProject.java:353)
at myProject.main(myProject.java:296)
Verstehe absolut nicht warum nun der Zugriff verweigert ist...
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.
Heisst der Account/Ordner auch wirklich "user" oder ist das nur ein Platzhalter ? Stimmen die Zugriffsberechtigungen (Administrator, Standardnutzer,...) ?
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.