IO流的文件复制

Posted zhangmenghui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流的文件复制相关的知识,希望对你有一定的参考价值。

1、 IO流的分类
 
1.根据处理数据类型的不同分为:
   字符流:1)Reader  读取字符流的抽象类   
      常用方法: read() 读取单个字符
                   read(char[] cbuf) 将字符读入数组。
            read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
            close() 关闭该流并释放与之关联的所有资源。
      2)Writer  写入字符流的抽象类 
      常用方法:write(int c) 写入单个字符。  
           write(String str) 写入字符串
           write(String str, int off, int len) 写入字符串的某一部分。
           write(char[] cbuf) 写入字符数组。
           write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
           flush() 刷新该流的缓冲。
           close() 关闭此流,但要先刷新它。
   字节流:
      1)InputStream    此抽象类是表示字节输入流的所有类的超类
       常用方法:read() 从输入流中读取数据的下一个字节。
            read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
            read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。
            close() 关闭此输入流并释放与该流关联的所有系统资源。
      2) OutputStream   此抽象类是表示字节输出流的所有类的超类
       常用方法:write(int b) 将指定的字节写入此输出流。
            write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
            write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 
            flush() 刷新此输出流并强制写出所有缓冲的输出字节。
            close() 关闭此输出流并释放与此流有关的所有系统资源。
2.根据数据流向不同分为:输入流和输出流
3.字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
4.字节流和字符流的区别:
 (1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
 (2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
 (3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。
5.结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
6.输入流和输出流
   对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

2、IO流的结构图

技术图片

3、字节流复制文件

 1 package FileInputStream;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 
 7 // 字节流复制文件
 8 public class Copy字节流复制文件 {
 9     public static void main(String[] args) {
10         // 复制文件的起始时间
11         long s = System.currentTimeMillis();
12         // 定义输入\\输出流为mull
13         FileInputStream fis = null;
14         FileOutputStream fos = null;
15         // 手动抛出异常
16         try {
17             // 读取文件
18             fis = new FileInputStream("d:\\\\digui.mp4");
19             // 读取完毕复制的文件
20             fos = new FileOutputStream("d:\\\\dd.mp4");
21             // 定义一个字节数组  存到数组b中
22             byte[] b = new byte[1024 * 10];
23             // 起始长度为0
24             int len = 0;
25             // while(){} 循环   一边读取 ,一边写入(复制)文件
26             while ((len = fis.read(b)) != -1) {
27                 fos.write(b, 0, len);
28                 fos.flush();  //  文件刷新
29             }
30         } catch (Exception e) {
31             System.out.println(e);
32             throw new RuntimeException("文件复制失败");  // 手动抛除异常
33             // 最终执行语句
34         } finally {
35             // 复制的文件不为空时  关闭释放资源
36             if (fos != null) {
37                 try {
38                     fos.close();
39                 } catch (IOException e) {
40                     e.printStackTrace();
41                 } finally {
42                     if (fis != null) {
43                         try {
44                             fis.close();
45                         } catch (IOException e) {
46                             System.out.println(e);
47                             throw new RuntimeException("文件复制失败");
48                         }
49                     }
50                 }
51             }
52         }
53         // 复制文件的结束时间   单位:ms 毫秒
54         long e = System.currentTimeMillis();
55         System.out.println(e-s);
56     }
57 }

4、字符流复制文件

 1 package Demo;
 2 
 3 import java.io.FileReader;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 //字符流复制文件     FileReader   read读取
 7 //                   FileWriter   write写入
 8 public class Copy字符流复制文件 {
 9     public static void main(String[] args) {
10         long s = System.currentTimeMillis();
11         FileReader fr = null;   // 字符输入流
12         FileWriter fw = null;   // 字符输出流
13         try {
14             fr = new FileReader("d:\\\\b.txt");
15             fw = new FileWriter("d:\\\\b22.txt");
16             char[] c = new char[1024];  //  字符类char
17             int len = 0;
18             while((len=fr.read(c))!=-1){
19                 fw.write(c,0,len);
20                 fw.flush();
21             }
22         } catch (Exception e) {
23             e.printStackTrace();
24         }finally{
25             if(fw!=null){
26                 try {
27                     fw.close();
28                 } catch (IOException e) {
29                     e.printStackTrace();
30                 }finally{
31                     if(fr!=null){
32                         try {
33                             fr.close();
34                         } catch (IOException e) {
35                             e.printStackTrace();
36                         }
37                     }
38                 }
39             }
40         }
41         long e = System.currentTimeMillis();
42         System.out.println(e-s);
43     }
44 }

 

以上是关于IO流的文件复制的主要内容,如果未能解决你的问题,请参考以下文章

IO流的练习2 ——— 复制单级文件夹中的文件

IO流的练习3 复制多级文件夹下的指定文件并改名

输入输出流的应用

Java IO流--使用缓冲流实现非文本文件和文本文件的复制

IO流,字节流复制文件,字符流+缓冲复制文件

IO流 - 复制文件(字节缓冲流+字节流)