在我的应用程序中,我想用不同的名称保存某个文件的副本(这是我从用户那里得到的)
我真的需要打开文件的内容并将其写入另一个文件吗?
最好的方法是什么?
在我的应用程序中,我想用不同的名称保存某个文件的副本(这是我从用户那里得到的)
我真的需要打开文件的内容并将其写入另一个文件吗?
最好的方法是什么?
当前回答
现在使用Kotlin要简单得多:
File("originalFileDir", "originalFile.name")
.copyTo(File("newFileDir", "newFile.name"), true)
Trueorfalse用于覆盖目标文件
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/copy-to.html
其他回答
这在Android O (API 26)上很简单,如你所见:
@RequiresApi(api = Build.VERSION_CODES.O)
public static void copy(File origin, File dest) throws IOException {
Files.copy(origin.toPath(), dest.toPath());
}
下面是一个解决方案,如果在复制时发生错误,它实际上会关闭输入/输出流。这个解决方案利用apache Commons IO IOUtils方法来复制和处理流的关闭。
public void copyFile(File src, File dst) {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(src);
out = new FileOutputStream(dst);
IOUtils.copy(in, out);
} catch (IOException ioe) {
Log.e(LOGTAG, "IOException occurred.", ioe);
} finally {
IOUtils.closeQuietly(out);
IOUtils.closeQuietly(in);
}
}
在kotlin中,只需:
val fileSrc : File = File("srcPath")
val fileDest : File = File("destPath")
fileSrc.copyTo(fileDest)
Kotlin扩展它
fun File.copyTo(file: File) {
inputStream().use { input ->
file.outputStream().use { output ->
input.copyTo(output)
}
}
}
或者,您也可以使用FileChannel来复制文件。在复制大文件时,它可能比字节复制方法更快。如果你的文件大于2GB,你就不能使用它。
public void copy(File src, File dst) throws IOException {
FileInputStream inStream = new FileInputStream(src);
FileOutputStream outStream = new FileOutputStream(dst);
FileChannel inChannel = inStream.getChannel();
FileChannel outChannel = outStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inStream.close();
outStream.close();
}