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

时间:2017-10-04 10:35:05

标签: android performance inputstream outputstream fileoutputstream

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

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.");
    }
}

2 个答案:

答案 0 :(得分:2)

终于做到了。当我使用BufferedOutputStream和BufferedInputStream时,处理时间是一半。与输入/输出流不同,它不会为每个字节读/写调用底层系统。相反,它会调用一次并缓冲这些流。

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.");
        }
    }

答案 1 :(得分:0)

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