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、共勉!
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。