How to make a copy of a file in android?
在我的应用程序中,我想用不同的名称(从用户那里获得)保存某个文件的副本。
我真的需要打开文件的内容并将其写入另一个文件吗?
最好的方法是什么?
要复制文件并将其保存到目标路径,可以使用下面的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public static void copy(File src, File dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { // Transfer bytes from in to out byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } finally { out.close(); } } finally { in.close(); } } |
在API 19 +上,可以使用Java自动资源管理:
1 2 3 4 5 6 7 8 9 10 11 12 | public static void copy(File src, File dst) throws IOException { try (InputStream in = new FileInputStream(src)) { try (OutputStream out = new FileOutputStream(dst)) { // Transfer bytes from in to out byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } } } |
或者,可以使用FileChannel复制文件。复制大文件时,它可能比字节复制方法快。但是,如果您的文件大于2GB,则不能使用它。
1 2 3 4 5 6 7 8 9 | 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(); } |
这些对我很有用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | public static void copyFileOrDirectory(String srcDir, String dstDir) { try { File src = new File(srcDir); File dst = new File(dstDir, src.getName()); if (src.isDirectory()) { String files[] = src.list(); int filesLength = files.length; for (int i = 0; i < filesLength; i++) { String src1 = (new File(src, files[i]).getPath()); String dst1 = dst.getPath(); copyFileOrDirectory(src1, dst1); } } else { copyFile(src, dst); } } catch (Exception e) { e.printStackTrace(); } } public static void copyFile(File sourceFile, File destFile) throws IOException { if (!destFile.getParentFile().exists()) destFile.getParentFile().mkdirs(); if (!destFile.exists()) { destFile.createNewFile(); } FileChannel source = null; FileChannel destination = null; try { source = new FileInputStream(sourceFile).getChannel(); destination = new FileOutputStream(destFile).getChannel(); destination.transferFrom(source, 0, source.size()); } finally { if (source != null) { source.close(); } if (destination != null) { destination.close(); } } } |
它的Kotlin扩展
1 2 3 4 5 6 7 |
答案可能太晚了,但最方便的方法是使用
这就是我所做的
`
1 2 3 4 5 6 7 8 9 10 |
`
这在Android O(API 26)上很简单,如您所见:
1 2 3 4 | @RequiresApi(api = Build.VERSION_CODES.O) public static void copy(File origin, File dest) throws IOException { Files.copy(origin.toPath(), dest.toPath()); } |
这里有一个解决方案,如果在复制时发生错误,它实际上会关闭输入/输出流。此解决方案利用ApacheCommonsIO ioutils方法来复制和处理流的关闭。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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更简单:
1 2 |
http://kotLang.org/api/最新/jvm /sdLIb/kOtLI.IO/Java.IO ./file /optoto.HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | FileInputStream fis=null; FileOutputStream fos=null; try { fis = new FileInputStream(from); fos=new FileOutputStream(to); byte[] by=new byte[fis.available()]; int len; while((len=fis.read(by))>0){ fos.write(by,0,len); } }catch (Throwable t){ Toast.makeText(context,t.toString(),Toast.LENGTH_LONG).show(); } finally { if(fis!=null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(context,e.toString(),Toast.LENGTH_LONG).show(); } } if(fos!=null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(context,e.toString(),Toast.LENGTH_LONG).show(); } } } |