Java中的I/O流及利用I/O流实现文件复制功能

来源:互联网 发布:mac任务栏图标太多 编辑:程序博客网 时间:2024/05/18 09:19

Java中的I/O流及利用I/O流实现文件复制功能
一、I/O流的概念

       1、 什么是I/O?

硬件层面:I/O(input/output),即输入/输出。每个设备都会有一个专用的I/O地址,用来处理自己设备的输入输出信息。比如电脑设备输入端口为键盘和鼠标,输出端口为显示屏。

软件层面:I/O即不同存储机制上的数据的读入写出。比如内存读写硬盘中的数据或者U盘中的数据。

2、什么是I/O流?

流是指一定的介质按照一定的方向流动的行为,在软件开发中指的是存储的数据的流动过程,这个数据源可以是硬盘中的文件、内存或者是网络中的某个URL

I/O流专门用于软件开发层面的理解,把数据从一个存储介质写出(output)或者读取(input)到另外一个存储介质的过程表示为I/O流的模型




二、流的分类

        1、根据传输数据的类型分类

字节流:读取和写入数据的时候,以字节为最小单元进行读取和写入操作

字符流:读取和写入数据的时候,以字符为最小单元进行读取和写入操作,因为每个字符根据编码不同,所占用的字节个数不同,每次读取和写入字符时候,是不定长的字节个数写入读取。

拓展:字符编码即计算机通过二进制表示不同国家字符的方式
常用编码类型:UTF-8、GBK、ISO8859-1等
处理中文的编码类型utf-8占3个字节、GBK占2个字节

                  关于Java中的编码可以参看我的这篇博客(Java中的编码问题)


         2、根据传输数据的方向分类
输入流:把数据从其他存储机制读入到当前内存机制当中
输出流:把内存当中的数据写出到其他存储机制当中


三、Java中的I/O流

        


1、梳理Java中I/O
        首先Java中分为两大类流:一类是字节流,另一类是字符流;
        每种大类的流都会对应输入流和输出流;即分别对应字节输入输出流和字符输入输出流;

2、字节输入/输出流



3、字符输入/输出流




4字节流和字符流相应的方法
字节输入流和字符输入流都有相应的read()方法,可以一个字节/一个字符的读取,也可以利用字节数组/字符数组进行批量读取
         相应的
字节输出流和字符输出流也有对应的write()方法,可以一个字节/一个字符的写出,也可以将整个字节数组/字符数组进行批量写出

 注意对应好,如果是以一个字节或者一个字符的读取,那么就要一个字节或者一个字符的写出

四、I/O流的应用:文件复制功能
         
1、使用字节流进行文件复制

源代码:
package com.huaixn.copy;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;public class ByteCopy {public static void main(String[] args) {ByteCopy bc= new ByteCopy();try {bc.copy1();bc.copy2();} catch (Exception e) {e.printStackTrace();}}//单字节的拷贝public void copy1() throws Exception{//首先构建输入流的对象,指定需要读取的文件路径FileInputStream fis = new FileInputStream("C:/Users/Administrator/Desktop/my.doc");//构建文件输出流的对象,即将文件复制在哪里去,后面的true代表每次写入时不清空当前文件内容FileOutputStream fos =new FileOutputStream("C:/Users/Administrator/Desktop/mycopy1.doc",true);//一个字节一个字节的读取文件的内容int value = fis.read();//把读取的一个字节写出while(value!=-1){fos.write(value);fos.flush();value = fis.read();}//读取完毕后关闭流fis.close();fos.close();}//利用字节数组拷贝public void copy2() throws Exception{//首先构建输入流的对象,指定需要读取的文件路径FileInputStream fis = new FileInputStream("C:/Users/Administrator/Desktop/my.doc");//构建文件输出流的对象,即将文件复制在哪里去,后面的true代表每次写入时不清空当前文件内容FileOutputStream fos =new FileOutputStream("C:/Users/Administrator/Desktop/mycopy2.doc",true);//构建字节数组byte [] bytes = new byte[1024];//把读取的字节存入到字节数组中int len=fis.read(bytes);//把读取的字节数组写出,注意一一对应while(len!=-1){/* * 利用第一种写出,查看文件属性可知,复制后的文件大小和原来文件大小不一致 * 原因是当最后一次读取没有1024字节时,也会写出1024个字节 * 所以我们采用第二种写出方式 *///fos.write(bytes);fos.write(bytes, 0, len);fos.flush();len=fis.read(bytes);}//读取完毕后关闭流fis.close();fos.close();}}

2、利用字符流进行文件拷贝
源代码:
package com.huaixn.copy;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;public class CharCopy {public static void main(String[] args) {CharCopy cc = new CharCopy();try {cc.copy1();cc.copy2();} catch (Exception e) {e.printStackTrace();}}public void copy1() throws Exception{//构建字符输入流对象FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\my.txt");//构建字符输出流对象FileWriter fw =new FileWriter("C:\\Users\\Administrator\\Desktop\\mycopy1.txt");//读取单个字符int value=fr.read();//输出单个字符while(value!=-1){fw.write(value);fw.flush();value=fr.read();}fr.close();fw.close();}public void copy2() throws Exception{//构建字符输入流对象FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\my.txt");//构建字符输出流对象FileWriter fw =new FileWriter("C:\\Users\\Administrator\\Desktop\\mycopy2.txt");//构建字符数组char [] chars = new char[1024];//把读取的字符存入字符数组中int len =fr.read(chars);//把字符数组中的数据写出while(len!=-1){fw.write(chars, 0, len);fw.flush();len =fr.read(chars);}//关闭流操作fr.close();fw.close();}}

关于Java中的流,以前也写过一篇,有兴趣的可以点下面的链接查看:

                 博客:Java中的文件拷贝


在上面的文件复制功能代码中,使用字节流可以对.txt、.doc、.docx等文件类型进行拷贝
但使用字符流拷贝时,.doc以及.docx文件类型拷贝后出现了乱码,至于其中的原因,可能是因为中文编码的问题导致,小伙伴们可以在自己的PC机上尝试读取不同类型的文件;

总结:
1、我初次接触Java中的流时,感觉很复杂,有事输出流,字节流等;其实主要还是对流的分类不够了解;现在就感觉好很多了;
2、说点个人的体验吧,流的分类一定要搞清楚,然后要知道哪些是字节输入输出流,哪些是字符输入输出流;
3、勤加练习也是帮助记忆各种流的名字以及类别的方法,可能刚开始会搞不清楚,在理解好流的分类的基础上多敲几遍代码就能慢慢理解了;
4、共勉!

        
0 0