Java I/O練習:ファイルコピー

18351 ワード

プログラムを使用してファイルコピーを実現する:ソースファイルとターゲットファイルのパスを初期化パラメータで受信するCopyFileプログラムクラスを確立します.解析:1)データコピーを実現するにはストリーム方式で実現する必要があり,ストリームには2種類あり,コピーする内容は必ずしも文字データではないため,バイトストリームを採用する.2)コピーを行う際には,まずファイル長の配列をプログラムで開き,すべてのデータを一度に改配列に読み出して出力保存し,次に読み書きで完了する.
まず、3つの機能を備えたファイルコピー処理を専門とするクラスを作成する.1)コピーされたソースファイルが存在するか否かを判断する2)ターゲットファイルの親パスが存在するか否かを判断し、存在しない場合は親ディレクトリを作成する3)ファイルコピー処理を行う
class CopyFileUtil {
    private CopyFileUtil() {
    }

    //             
    public static boolean fileIsExists(String path) {
        return new File(path).exists();
    }

    //                
    public static void createParentDir(String path) {
        File file = new File(path);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
    }

    //    
    public static boolean copyFile(String sourcePath, String destPath) {
        File inFile = new File(sourcePath);
        File outFile = new File(destPath);
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            fileInputStream = new FileInputStream(inFile);
            fileOutputStream = new FileOutputStream(outFile);
            //        
            copyFileHandle(fileInputStream, fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileInputStream.close();
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return true;
    }

    //    
    private static void copyFileHandle(InputStream inputStream, OutputStream outputStream) throws IOException {
        long start = System.currentTimeMillis();
        int temp = 0;
        while ((temp = inputStream.read()) != -1) {
            outputStream.write(temp);
        }
        long end = System.currentTimeMillis();
        System.out.println("          :" + (end - start));
    }
}

public class FileCopy {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("    ,   :java CopyFile             ");
            return;
        }
        String soucePath = args[0]; //       
        String destPath = args[1];  //      
        if (CopyFileUtil.fileIsExists(soucePath)) {
            CopyFileUtil.createParentDir(soucePath);    //    
            System.out.println(CopyFileUtil.copyFile(soucePath, destPath) ? "      " : "      ");
        } else {
            System.out.println("      ,      ");
        }
    }
}

上記のコードには、コピーの速度が特に遅いという問題があり、読み取りが遅いという問題を解決するには、複数バイトのコンテンツを一度に読み取る必要があります.上記のコードを最適化し、1つの配列を開いて複数のコンテンツを一度に読み込む必要があります.部分コードの最適化:
//    
    private static void copyFileHandle(InputStream inputStream, OutputStream outputStream) throws IOException {
        long start = System.currentTimeMillis();
//        int temp = 0;
//        while ((temp = inputStream.read()) != -1) {
//            outputStream.write(temp);
//        }
        byte[] data = new byte[1024];   //              
        int len = 0;
        //len=inputStream.read(data)!=-1             ,        
        while ((len = inputStream.read(data)) != -1) {
            outputStream.write(data, 0, len);     //                
        }
        long end = System.currentTimeMillis();
        System.out.println("          :" + (end - start));
    }