字符流和字节流复制文件

字符流和字节流复制文件的9种方法及测试效率

一、字符流字节流区别:
操作的单位不一样,一个是字节[byte-8bit],一个是字符[变长字节]
操作中文的时候使用字符流更方便 字节流更广泛:文本,视频,音频,图片…
使用缓冲Buffer以后:效率明显提高

二、9种方法


public class java_IO {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		
		long start=System.currentTimeMillis();//系统当前时间
		long end=System.currentTimeMillis(); 
		System.out.println("所用时间:"+(end-start)+"ms"); 
	}
	
	//1.1字符流读写复制文件,每次复制一个字符:-------所用时间:21360ms
	public static void copyFileChar(){
		System.out.println("请输入你需要拷贝的文件路径:");
		String oldPath = sc.next();
		System.out.println("请输入你拷贝到的文件路径:");
		String newPath = sc.next();
		FileReader fileReader = null;
        FileWriter fileWriter = null;
        try{
            fileReader = new FileReader(oldPath);
            fileWriter = new FileWriter(newPath);
            int red;
            while((red = fileReader.read()) != -1){//读取单个字符,-1代表已达到流的末尾
                fileWriter.write(red);//写入单个字符
            }
        	System.out.println(oldPath+"文件拷贝完毕!");
            fileWriter.flush();
 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(null != fileReader){
                try{
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(null != fileWriter){
                try{
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
	
	
	//2.2字符流读写复制文件,每次复制一个字符数组:----所用时间:10534ms
	public static void copyFileReaderArray(){
		System.out.println("请输入你需要拷贝的文件路径:");
		String oldPath = sc.next();
		System.out.println("请输入你拷贝到的文件路径:");
		String newPath = sc.next();
		FileReader Reader = null;
        FileWriter Writer = null;
        try{
            Reader = new FileReader(oldPath);
            Writer = new FileWriter(newPath);
            char[] charArray = new char[1024];//缓冲数组
            int readLength;//每次读取的长度
            
            while((readLength = Reader.read(charArray)) != -1){
                Writer.write(charArray,0,readLength);//写入读取的字符数组.
            }
            Writer.flush();
 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(null != Reader){
                try{
                    Reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(null != Writer){
                try{
                    Writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

	//3.3缓冲字符流读写复制文件,每次复制复制一个字符:---所用时间:22119ms
	 public static void copyFileBufferedReaderChar(){
	        System.out.println("请输入你需要拷贝的文件路径:");
	        String oldpath=sc.next();	
	        System.out.println("请输入你拷贝到的文件路径:");
	        String newpath=sc.next();
		    FileReader Reader = null;
	        FileWriter Writer = null;
	        BufferedReader bufferedReader = null;
	        BufferedWriter bufferedWriter = null;
	        try{
	            Reader = new FileReader(oldpath);
	            Writer = new FileWriter(newpath);
	            bufferedReader = new BufferedReader(Reader);
	            bufferedWriter = new BufferedWriter(Writer);
	            int b;//保存每次循环读取的字符
	            while ((b = bufferedReader.read()) != -1){//读取一个字符,-1代表读到流末尾
	                bufferedWriter.write(b);//写入读到的字符
	            }
	            bufferedWriter.flush();
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        } finally {
	            if(null != Reader){
	                try{
	                    Reader.close();
	                }catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedReader){
	                try{
	                    bufferedReader.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != Writer){
	                try{
	                    Writer.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedWriter){
	                try{
	                    bufferedWriter.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	        }
	    }

	
	 //4.4缓冲字符流读写复制文件,每次复制一个字符数组:---所用时间:17971ms
	 public static void copyFileBufferedReaderArray(){
		    System.out.println("请输入你需要拷贝的文件路径:");
	        String oldpath=sc.next();	
	        System.out.println("请输入你拷贝到的文件路径:");
	        String newpath=sc.next();
	        FileReader fileReader = null;
	        FileWriter fileWriter = null;
	        BufferedReader bufferedReader = null;
	        BufferedWriter bufferedWriter = null;
	        try{
	            fileReader = new FileReader(oldpath);
	            fileWriter = new FileWriter(newpath);
	            bufferedReader = new BufferedReader(fileReader);
	            bufferedWriter = new BufferedWriter(fileWriter);
	            char[] Array = new char[1024];
	            int b;//保存每次循环读取的字符
	            while ((b = bufferedReader.read(Array)) != -1){//读取一个字符,-1代表读到流末尾
	                bufferedWriter.write(Array,0,b);//写入读到的字符
	            }
	            bufferedWriter.flush();
	        } catch (FileNotFoundException e) {
	        	System.err.println("没有找到文件");
	           
	           
	        } catch (IOException e) {
	        	 System.err.println("创建文件或写入文件失败");
	        } finally {
	            if(null != fileReader){
	                try{
	                    fileReader.close();
	                }catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedReader){
	                try{
	                    bufferedReader.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != fileWriter){
	                try{
	                    fileWriter.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedWriter){
	                try{
	                    bufferedWriter.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	        }
	    }

	 
	 //1.5缓冲字符流读写复制文件,每次复制一行:-----所用时间:14664ms
	 public static void copyFileBufferedReaderString(){
		    System.out.println("请输入你需要拷贝的文件路径:");
	        String oldpath=sc.next();	
	        System.out.println("请输入你拷贝到的文件路径:");
	        String newpath=sc.next(); 
		    FileReader fileReader = null;
	        FileWriter fileWriter = null;
	        BufferedReader bufferedReader = null;
	        BufferedWriter bufferedWriter = null;
	        try{
	            fileReader = new FileReader(oldpath);
	            fileWriter = new FileWriter(newpath);
	            bufferedReader = new BufferedReader(fileReader);
	            bufferedWriter = new BufferedWriter(fileWriter);
	            String b;
	            while ((b = bufferedReader.readLine()) != null){//读取一行,null代表已经读到流末尾
	                bufferedWriter.write(b);
	                bufferedWriter.newLine();
	                bufferedWriter.flush();
	            }
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        } finally {
	            if(null != fileReader){
	                try{
	                    fileReader.close();
	                }catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedReader){
	                try{
	                    bufferedReader.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != fileWriter){
	                try{
	                    fileWriter.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedWriter){
	                try{
	                    bufferedWriter.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	        }
	    }
	
	 
	 
	 //2.1.字节流读写复制文件,每次复制一个字节:----所用时间:29236ms
	 public static void copyFileInputStreamChar(){
		    System.out.println("请输入你需要拷贝的文件路径:");
	        String oldpath=sc.next();	
	        System.out.println("请输入你拷贝到的文件路径:");
	        String newpath=sc.next();
	        FileInputStream fileInputStream = null;
	        FileOutputStream fileOutputStream = null;
	        try{
	            fileInputStream = new FileInputStream(oldpath);
	            fileOutputStream = new FileOutputStream(newpath);
	            int b;//每次读取的长度
	            while((b = fileInputStream.read()) != -1){//读取单个字节,-1代表已达到流的末尾
	                fileOutputStream.write(b);//写入单个字节
	            }
	            fileOutputStream.flush();
	 
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        } finally {
	            if(null != fileInputStream){
	                try{
	                    fileInputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != fileOutputStream){
	                try{
	                    fileOutputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	        }
	    }
	
	 
	 
	 //2.2.字节流读写复制文件,每次复制一个字节数组:所用时间:8088ms

	 public static void copyFileInputStreamArray(){
		    System.out.println("请输入你需要拷贝的文件路径:");
	        String oldpath=sc.next();	
	        System.out.println("请输入你拷贝到的文件路径:");
	        String newpath=sc.next();
		 
	        FileInputStream fileInputStream = null;
	        FileOutputStream fileOutputStream = null;
	        try{
	            fileInputStream = new FileInputStream(oldpath);
	            fileOutputStream = new FileOutputStream(newpath);
	            byte[] byteArray = new byte[1024];
	            int b;//每次读取的长度
	            
	            while((b = fileInputStream.read(byteArray)) != -1){
	                fileOutputStream.write(byteArray,0,b);//写入读取的字节数组.
	            }
	            fileOutputStream.flush();
	 
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        } finally {
	            if(null != fileInputStream){
	                try{
	                    fileInputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != fileOutputStream){
	                try{
	                    fileOutputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	        }
	    }

	 
	 //2.3.缓冲字节流读写复制文件,每次复制一个字节:-----所用时间:22387ms
	 
	 public static void copyFileBufferedInputStreamChar(){
		    System.out.println("请输入你需要拷贝的文件路径:");
	        String oldpath=sc.next();	
	        System.out.println("请输入你拷贝到的文件路径:");
	        String newpath=sc.next();
		 
		    FileInputStream fileInputStream = null;
	        FileOutputStream fileOutputStream = null;
	        BufferedInputStream bufferedInputStream = null;
	        BufferedOutputStream bufferedOutputStream = null;
	        try{
	            fileInputStream = new FileInputStream(oldpath);
	            fileOutputStream = new FileOutputStream(newpath);
	            bufferedInputStream = new BufferedInputStream(fileInputStream);
	            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
	            int b;//每次读取的长度
	            while((b = bufferedInputStream.read()) != -1){//读取单个字节,-1代表已达到流的末尾
	                bufferedOutputStream.write(b);//写入单个字节
	            }
	            bufferedOutputStream.flush();
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        } finally {
	            if(null != fileInputStream){
	                try{
	                    fileInputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != fileOutputStream){
	                try{
	                    fileOutputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedInputStream){
	                try{
	                    bufferedInputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedOutputStream){
	                try{
	                    bufferedOutputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	        }
	    }
	 
	 
	 
	 //2.4.缓冲字节流读写复制文件,每次复制一个字节数组:-----所用时间:11967ms
	 public static void copyFileBufferedInputStreamArray(){
		 System.out.println("请输入你需要拷贝的文件路径:");
	        String oldpath=sc.next();	
	        System.out.println("请输入你拷贝到的文件路径:");
	        String newpath=sc.next();
		 
		    FileInputStream fileInputStream = null;
	        FileOutputStream fileOutputStream = null;
	        BufferedInputStream bufferedInputStream = null;
	        BufferedOutputStream bufferedOutputStream = null;
	        try{
	            fileInputStream = new FileInputStream(oldpath);
	            fileOutputStream = new FileOutputStream(newpath);
	            bufferedInputStream = new BufferedInputStream(fileInputStream);
	            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
	 
	            byte[] byteArray = new byte[1024];
	            int b;//每次读取的长度
	            //
	           
	            while((b = bufferedInputStream.read(byteArray)) != -1){
	                bufferedOutputStream.write(byteArray,0,b);//写入读取的字节数组.
	            }
	            bufferedOutputStream.flush();
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            e.printStackTrace();
	        } finally {
	            if(null != fileInputStream){
	                try{
	                    fileInputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != fileOutputStream){
	                try{
	                    fileOutputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedInputStream){
	                try{
	                    bufferedInputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != bufferedOutputStream){
	                try{
	                    bufferedOutputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	        }
	    }
	
	 
	}

三、字节流和字符流转换
任何数据的持久化和网络传输都是以字节形式进行的,所以字节流和字符流之间必然存在转换问题。字符转字节是编码过程,字节转字符是解码过程。io包中提供了InputStreamReader和OutputStreamWriter用于字符和字节的转换。
在选择流步骤时:
//设置编码
InputStreamReader isr = new InputStreamReader(
new FileInputStream(“D:/test.txt”)
, “GBK”);

参考:
https://www.cnblogs.com/pony1223/p/8030200.html

1.System.currentTimeMillis()的用法参照
2.java Io的字符流和字节流的区别请参照

发布了4 篇原创文章 · 获赞 0 · 访问量 36

猜你喜欢

转载自blog.csdn.net/qq_43640120/article/details/105395440