目录:IO流的体系,字节流,字符集,字符流
一.IO流的体系:
一.字节流:
1.FileOutputStream : 操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
书写步骤:(1)创建字节输出流对象
(2)写数据: 写到本地文件中的是整数在ASCII上对应的字符 字符9所对应的数字是57
(3) 释放资源
//1.创建对象
FileOutputSream fos = new FileOutputStream("myio\\a.txt");
//2.写出数据
fos.write(97);
//3.释放资源
fos.close();
2.FileOutputStream写数据的三种方式
第三个方法的参数:第一个参数:数组;第二个参数:起始索引;第三个参数:个数
FileOutputStream fos = new FileOutputStream("myio\\a.txt");
byte[] bytes = {97,98,99,100};
fos.write(bytes,1,2); b c
3.FileInputStream : 操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。
书写步骤:(1)创建对象
细节:如果文件不存在,就直接报错
(2)读数据
细节:读到文件末尾了,read方法返回-1;
(3) 释放资源
细节:每次使用完都要释放资源
//1.创建对象
FileInputStream fis = new FileInputStream("myio\\a.txt");
//2.读取数据
int b1 = fis.read();
Sestem.out.println(b1);
//3.释放资源
fis.close();
4.FileInputStream的循环读取:
//1.创建对象
FileInputStream fis = new FileInputStream();
//2.循环读取
int b;
while((b = fis.read()) != -1){
System.out.print((char)b);
}
//3.释放资源
fis.close();
5.FileInputStream一次读多个字节
注意:一次读一个字节数组的数据,每次读取会尽可能把数组装满
三.字符流:
1.字符流的底层其实就是字节流 字符流 = 字节流 + 字符集
2.特点:输入流:一次读一个字节,遇到中午时,一次读多个字节
输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中
3.使用场景:对于纯文本进行读写操作
4.FileReader:
(1)创建字符输入流对象
(2)读取数据
(3)释放资源
//1.创建对象并关联本地文件
FileReader fr = new FileReader("myio:\\a.txt");
//2.读取数据 read()
int ch;
while((ch = fr.read()) != -1) {
//想看的中文,就把这些十进制数据强转就可以了
System.out.print((char)ch);
}
//3.释放资源
fr.close();
//1.创建对象
FileReader fr = new FileReader("D:\\作业\\04231803-张萍-Java实验\\a.txt");
//2.读取数据
char[] chars = new char[2];
int len;
while((len = fr.read(chars)) != -1) {
//把数组中的数据变成字符串再打印
System.out.println(new String(chars,0,len));
}
//3.释放资源
fr.close();
5.FileWriter构造方法:
6.FileWriter成员方法:
7.FileWriter书写细节:
(1)创建字符输出流对象
(2)写数据
(3)释放资源
8.字节流和字符流的使用场景:
字节流:拷贝任意类型的文件
字符流:读取纯文本文件中的数据 ; 往纯文本文件中写出数据
综合练习:
1.拷贝一个文件夹,考虑子文件夹
//1.创建对象表示数据源
File src = new File(pathname);
//2.创建对象表示目的地
File dest = new Filepathname);
//3.调用方法开始拷贝
copydir(src,dest);
以上是写在main里面的
作用:拷贝文件夹
参数一:数据源
参数二:目的地
private static void copydir(File src,File dest) throws IOException {
//如果没有这个目录就自己创建
dest.mkdirs();
//1.进入数据源
File[] files = src.listFiles();
//2.遍历数组
for(File file : files) {
if(files.isFile()){
//3.判断文件,拷贝
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));
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()));
}
2.加密和解密
System.out.println(100 ^ 10); //110
System.out.println(110 ^ 10); //100
//1.创建对象关联原始文件
FileInputStream fis = new FileInputStream("myio\\girl.jpg");
//2.创建对象关联加密文件
FileOutputStream fos = new FileOutputStream("myio\\ency.jpg");
//3.加密处理
int b;
while(b = fis.read()) != -1 ) {
fos.write( b ^ 2);
}
//4.释放资源
fos.close();
fis.close();
//解密时改一下上面那个路径代码即可
FileInputStream fis = new FileInputStream("myio\\ency.jpg");
FileOutputStream fos = new FileOutputStream("myio\\redu.jpg");