I/O是Input / Output的缩写,用于处理设备之间的数据传输。
输入 (Input):读取外部数据到程序中。
输出(Output):将程序输出到外部设备中。
流的分类
1.、按数据单位分:字节流(8bit),字符流(16bit)
2、按流向分:输入流、输出流
3、按角色分:节点流,处理流
(抽象基类) | 字节流 | 字符流 |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
抽象基类 | 字节流(文件流) | 缓冲流(处理流的一种) |
InputStream | FileInputStream | BufteredInputStream |
OutputStream | FileOutputStream | BufteredOutputStream |
Reader | FileReader | BufferedReader |
Writer | FileWriter | ButteredWriter |
FileReader和FileWriter的使用(字符流)
FileReader读入数据
例:将day下的hello.txt文件读入到程序中,并输出到控制台
步骤
①实例化File类的对象,指明要操作的文件。
File file = new File ("hello.txt");
②提供FileReader的对象,并指明操作的文件,用于数据的写入。
FileReader fr = new FileReader(file);
③数据的读入
//read():返回读入的一个字符。如果达到文件未尾,还回-1。(每次读入一个字节)
int date= fr.read(); //date是最后一个字符对应的数值
while(date!=-1){
System.out. println( (char)date);
date=fr.read();
}
④流的关闭操作。
fr.close();
异常的处理:
为了保证流资源一定可以执行关闭操作。需使用try-catch-finally处理,并将关闭操作放入finally中。
注意:读入的文件必须存在,否则会报FileNotFoundException。
对③操作的升级
char [] cbuf =new char[5]; //每次读入5个字符
// read (char[] cbuf):返回每次读入到cbuf数组中字符的个数,如果达到末尾,返回-1
int len; //记录每次读入到cbuf数组中的字符个数
while ((len = fr.read (cbuf))!=-1){
for (int i=o; i < len; i++){
System.out. print(cbuf[ij);
}
}
FileFWriter写出数据
步骤
①提供File类的对象,指明写出到的文件。
File file = new File ("hellol. txt");
②提供FileWriter的对象,并指明操作的文件,用于数据的写出。
FileWriter fw = new FileWriter (file);
③.写出的操作
fw.write("hello");
fW.write("world");
④资源的关闭
fw.close();
说明:
1、输出操作:对应的File可以不存在,不会报异常。
2、File对应的硬盘中文件不存在,在输出时,会自动创建此文件存在:
①如果使用的构造器为:FileWriter (file) / FileWriter (file,false)会对原有的文件进行覆盖。
②如果使用的是FileWriter (file,true):不会覆盖原有文件,会在原内容的基础上进行添加。
使用FileReader和FileWriter实现文本文件的复制
步骤:
1、创建File类的对象,指明读入和写出的文件。
File srcFil e= new File ("hellol.txt"); //读入程序中的文件
File destFile = new File ("hello2.txt"); //程序内容写出到的文件
2、创建输入流和输出流的对象。
FileReader fr = new FileReader (scrFile); //输入流
FileWriter fw = new FileWriter(destFile); //输出流
3、数据的读入和写出。
char [] cbuf = new char[5];
int len; //记录每次读入到cbuf数组中的字符个数
while ((len=fr.read((buf))!=-1){ //每次写出len个字符
fw.write (cbuf,0,len);
}
4、关闭。
fw.close();
fr. close();
注:字符流不能处理图片文件
FileInputStream和FileOutputStream的使用(字节流)
步骤:
1、1、创建File类的对象,指明读入和写出的文件。
File srcFil e= new File ("hellol.txt"); //读入程序中的文件
File destFile = new File ("hello2.txt"); //程序内容写出到的文件
2、创建输入流和输出流的对象。
FileInputStream fis = new FileInputStream (scrFile); //输入流
FileOutputStream fos = new FileOutputStream (destFile); //输出流
3、数据的读入和写出。
byte [] butter = new byte[5];
int len;
while ((len=fis.read(buffer))!=-1){ //读入
fos.write(butter, o,len); //写出
}
4、关闭。
fis.close();
fos. close();
可写为使一个通用的方法
指定路径下文件的复制,将要复制的路径和将要复制到的路径改为变量的形式,然后方法的形参和变量名相同。
小结:
1、对于文本文件(.txt,java,.C .CPp),使用字符流处理。
2、对于非文本文件(jpg,mp3,mp4, avi,doc,ppt)用字节流处理。