体系
按照流的方向可分为:输入流(读取)和输出流(写出),按照操作文件类型可分为字节流和字符流,如图所示,蓝色方框为抽象类,黄色方框为其子类。

总结:

字节输入输出流
FileOutPutStream(字节输出流)
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
步骤:
1、创建字节输出流对象(使用有参构造方法)
a.参数是字符串表示的路径(自动创建File对象)或者File对象都是可以的
b.如果文件不存在会创建一个新的文件,但要保证父级路径是存在的
c.如果文件已存在,则会清空文件(因为默认续写开关是关闭的)
2、写数据
write方法的参数如果是整数,实际写到本地文件中的是整数在ASCII上对应的字符
3、释放资源
每次使用完流必须释放资源
写数据的三种方式:

续写:打开续写开关,在创建FileOutPutstream对象的第二个参数,默认是false,表示关闭续写,改为true表示打开续写
换行:写入换行符:\r\n
FileInPutStream(字节输入流)
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
字节流读取文件时,不要有中文
步骤:
1、创建字节输入流对象
如果文件不存在则直接报错(和输出流不同):因为没有文件,也就没有数据,无法写入
2、读数据
a.一次读一个字节,读出来的是数据在ASCII上对应的数字
b.读到文件末尾,read方法返回-1
3、释放资源
每次使用完流必须释放资源
FileInPutStream循环读取
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\Idea Projects\\myio\\a.txt");
int b;
while ((b = fis.read()) != -1) {
System.out.println((char) b);
}
fis.close();
}
如果同时打开多个流,则先打开的后关闭
FileInPutStream读取的问题
FileInPutStream一次读取多个字节,返回值为读取的字节数

一次读取一个字节数组(一般为1024的整数倍)的数据,每次读取会尽可能把数组装满
read空参有参方法区别:
1、空参read返回的是字符对应的ASCII码值
2、有参read将读到字符解码再强转(相当于直接把字符放进buffer数组中),返回实际读取的字节数
相同:读到文件末尾都返回-1
try……catch异常处理

JDK7推出AutoCloseable接口,在特定情况下,可以自动释放资源

JDK7方案:
try后面的小括号中写创建对象的代码,只有实现了AutoCloseable接口的类,才能在小括号中创建对象
字符输入输出流
概述
字符流的底层起始就是字节流,字符流=字节流+字符集
特点:输入流:一次读一个字节,遇到中文时,一次读多个字节
输出流:底层会被数据按照指定的编码方式进行编码,变成字节再写到文件中
使用场景:对于纯文本文件进行读写操作
FileReader(字符输入流)
1、创建字符输入流对象

如果文件不存在,则直接报错
2、读取数据

a.按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数
b.读到文件末尾了,read方法返回-1
空参read方法细节:
1、默认也是一个字节一个字节读取,如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读三个字节
2、在读取之后,方法的底层还会进行解码并转成十进制,最终把这个十进制作为返回值,这个十进制也表示在字符集上的数字
有参read方法细节:
1、读取多个数据,并放到buffer数组中
2、读取数据+解码+强转三步合并,把强转以后的字符放到数组当中(相当于空参构造方法+强制类型转换)
3、返回实际读取的字符数
FileWriter(字符输出流)
构造方法

默认续写开关关闭(false)
成员方法

1、创建字符输出流对象
细节:(同FileOutPutStream字节输出流)
a.参数是字符串表示的路径或者File对象都可以
b.如果文件不存在则会创建一个新的文件,但是要保证父级路径是存在的
c.如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关
2、写数据
细节:(类似FileOutPutStream字节输出流)
如果Write方法的参数是整数,实际上写到本地文件中的是整数在字符集上对应的字符
如果参数是字符或者字符串则会直接写入
3、释放资源
每次使用完流之后都要释放资源
应用
用字节流拷贝文件,代码实现:
//拷贝文件
public class test1 {
private static void copydir(File src, File dest) throws IOException {//把src文件拷贝到dext文件夹
dest.mkdir();//防止dest不存在
//1.进入数据源
File[] files = src.listFiles();
//2.遍历数组
for (File file : files) {
if (file.isFile()) {//如果是文件则直接拷贝
//3.判断文件,拷贝
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(new File(dest, file.getName()));//在dest文件夹中创建和file同名的文件
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
fos.close();
fis.close();
} else {
//4.如果是文件夹,递归
copydir(file,new File(dest,file.getName()));
}
}
}
}
3103

被折叠的 条评论
为什么被折叠?



