Verwenden Sie in Java7 oder höher, wenn keine besonderen Umstände vorliegen, die Funktionen der Standardbibliothek wie __java.nio.file.Files # copy (Path, Path, CopyOption) __.
Verwenden Sie für Java6 oder früher nach Möglichkeit die Funktionen von etablierten Bibliotheken wie Apache Commons und __FileUtils # copyFile (Datei, Datei) __, die in Commons-IO enthalten sind.
Ab 2017 sollte es nicht notwendig sein, es unabhängig zu implementieren, aber aus irgendeinem Grund ist es ein Fall, es unabhängig zu implementieren. Wenn Sie im Web suchen, finden Sie Code ähnlich dem folgenden.
Probe 1
public static void copyFile(File sf, File df) {
FileChannel sc = null, dc = null;
try {
sc = new FileInputStream(sf).getChannel();
dc = new FileOutputStream(df).getChannel();
dc.transferFrom(sc, 0, sc.size());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (dc != null) try { dc.close(); } catch (IOException e) {}
if (sc != null) try { sc.close(); } catch (IOException e) {}
}
}
Diese Methode funktioniert grundsätzlich einwandfrei, hängt jedoch vom statischen Syntaxanalysetool ab.
sc = new FileInputStream(sf).getChannel();
Wo ich diesen FileChannel in der Methodenkette bekomme, werde ich gewarnt, dass __ "FileInputStream möglicherweise nicht geschlossen wird" __ (dasselbe gilt für FileOutputStream)
Glücklicherweise heißt es in der Java 6 __java.io.FileInputStream # close () __ Dokumentation
Schließen Sie den Dateieingabestream und die freien Systemressourcen, die diesem Stream zugeordnet sind. Wenn diesem Stream ein Kanal zugeordnet ist, schließen Sie diesen Kanal ebenfalls.
Es gibt also, schließen wir FileInputStream (FileOutputStream). Ist es so etwas? (Es ist in Ordnung, auch FileChannel zu schließen. Das Aufrufen der FileInputStream- und FileChannel-Schließmethoden stürzt nicht ab, obwohl dies keinen Sinn ergibt.)
Probe 2
public static void copyFile(File sf, File df) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(sf);
fos = new FileOutputStream(df);
FileChannel sc = fis.getChannel();
FileChannel dc = fos.getChannel();
dc.transferFrom(sc, 0, sc.size());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) try { fos.close(); } catch (IOException e) {}
if (fis != null) try { fis.close(); } catch (IOException e) {}
}
}
Daher ist es weniger wahrscheinlich, dass Beispiel 2 gewarnt wird, wenn später ein statisches Syntaxanalysetool usw. eingeführt wird. Wenn Sie im Internet suchen und Sample 1 kopieren möchten, verwenden Sie Sample 2. ~~ Es wird für die Leute einfacher sein, später zu warten ~~
Wenn Sie Ihre eigenen in Java7 oder höher implementieren möchten, try-with-resources-Anweisung. Bitte benutzen Sie HTML). Es wird sehr einfach sein.
Recommended Posts