Android:最佳实践? ,将多个文件从一个文件夹复制到另一个文件夹时,需要很多时间,

Android: best practice ? , when copying multiple files from one folder to another , it takes much time ,

我正在使用下面的代码将多个文件从一个文件夹复制到另一个文件夹,但这需要太多时间,要求他们实施任何最佳实践以提高速度。我将不胜感激。(注意:我不是移动文件)

void copyFile(File sourceLocation, File targtLocation) throws IOException {

    if (sourceLocation.exists()) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(sourceLocation);
            new File(String.valueOf(targtLocation)).delete();
            out = new FileOutputStream(targtLocation);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // Copy the bits from instream to outstream
        byte[] buf = new byte[1024];
        int len;

        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();

        sourceLocation.delete();
        Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        scanIntent.setData(Uri.fromFile(sourceLocation));
        sendBroadcast(scanIntent);
        Log.e("debug", "Copy file successful.");

    } else {
        Log.v("debug", "Copy file failed. Source file missing.");
    }
}

使用destination.transferFrom()方法进行快速文件传输

  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();
        }
    }
}

或者你也可以使用FileUtils.copyFile()方法

 String sourcePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/TongueTwister/tt_temp.3gp";
        File source = new File(sourcePath);

        String destinationPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/TongueTwister/tt_1A.3gp";
        File destination = new File(destinationPath);
        try 
        {
            FileUtils.copyFile(source, destination);
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }

终于做到了。当我使用 BufferedOutputStream 和 BufferedInputStream 时,处理时间减半。不像input/outputstream,它不会为每个字节调用底层系统read/write。相反,它调用一次并缓冲这些流。

void copyFileFast1(File sourceLocation, File targtLocation) throws IOException {

        if (sourceLocation.exists()) {
            FileInputStream fin = null;
            FileOutputStream fout = null;
            Log.i("debug","source "+sourceLocation);
            Log.i("debug","des "+targtLocation);
            try {
                fin = new FileInputStream(sourceLocation);
                new File(String.valueOf(targtLocation)).delete();
                fout = new FileOutputStream(targtLocation);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            // Copy the bits from instream to outstream
            byte[] buf = new byte[2048];
            int len;
            BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fout);
            BufferedInputStream bufferedInputStream=new BufferedInputStream(fin);
            while ((len = bufferedInputStream.read(buf)) > 0) {
                bufferedOutputStream.write(buf, 0, len);
            }
            fin.close();
            bufferedOutputStream.close();
            fout.close();

            sourceLocation.delete();
            Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            scanIntent.setData(Uri.fromFile(sourceLocation));
            sendBroadcast(scanIntent);
            Log.e("debug", "Copy file successful.");

        } else {
            Log.v("debug", "Copy file failed. Source file missing.");
        }
    }