目录
io流
FileOutputStream
字节输出流的细节:
FileOutputStream写数据的方式
FilelnputStream
FilelnputStream书写细节
FilelnputStream读取方式
计算机的存储规则
ASCll规则(英文)
GBK(汉字)
Unicode字符集的UTF-8编码格式
java中的编码和解码方式
字符流
FileReader
read()的使用细节
FileWriter
FileWriter构造方法
FileWriter成员方法
FileWriter书写细节
字节缓冲流
字符缓冲流
字符缓冲流特有方法
转换流
序列化流
反序列化流
io流
用于读写文件中的数据(可以读写文件,或网络中的数据..)
io流的分类可以分为输入流和输出流
注意:字节流读取文件的时候,文件中不要有中文
1.什么是IO流?
存储和读取数据的解决方案
l: input O: output
流:像水流一样传输数据
2.I0流的作用?
用于读写数据(本地文件,网络)
3.10流按照流向可以分类哪两种流?
输出流:程序 -->文件
输入流:文件 -->程序
4.io流按照操作文件的类型可以分类哪两种流?
字节流:可以操作所有类型的文件
字符流:只能操作纯文本文件
5.什么是纯文本文件?
用windows系统自带的记事本打开并且能读懂的文件
txt文件,md文件,xml文件,lrc文件等
FileOutputStream
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。
书写步骤:
① 创建字节输出流对象
② 写数据
③ 释放资源
FileOutputStream样例:
//1.创建对象
//号出输出流 0utputstream
//本地文件
File
File0utputStream fos = new File0utputstream("myio\\a.txt");
//2.写出数据
fos.write(97);
//3.释放资源
fos.close();
字节输出流的细节:
1.创建字节输出流对象
细节1:参数是字符串表示的路径或者是File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
细节3:如果文件已经存在,则会清空文件
2.写数据
细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
3.释放资源
每次使用完流之后都要释放资源
4.续写
如果想要续写,打开续写开关即可,开关位置:创建对象的第二个参数
默认false:表示关闭续写,此时创建对象会清空文件
手动传递true:表示打开续写,此时创建对象不会清空文件
File0utputStream fos = new File0utputstream( name: "myio\\a.txt",true);
FileOutputStream写数据的方式
FilelnputStream
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来,
书写步骤:
创建字节输入流对象
读数据
程序
释放资源
FileInputStream样例:
//1.创建对象
FileInputStream fis = new FileInputstream("myiolla.txt")
//2.读取数据
int bl = fis.read();
System.out.println((char)b1);
int b2 = fis.read();
System.out.println((char)b2);
int b3 = fis.read();
System.out.println((char)b3);
int b4 = fis.read();
System.out.println((char)b4);
int b5 = fis.read();
System.out.println((char)b5);
int b6 = fis.read();
System.out.println(b6);//-1
//3.释放资源
fis.close();
FilelnputStream书写细节
1.创建字节输入流对象
细节1:如果文件不存在,就直接报错。
2.读取数据
细节1: 一次读一个字节,读出来的是数据在ASCII上对应的数字
细节2:读到文件末尾了,read方法返回-1。
3.释放资源
细节1:每次使用完流必须要释放资源。
FilelnputStream读取方式
1.一次读取一个字节
弊端:读取速度较慢
2.一次读取多个字节
注意:一次读一个字节数组的数据,每次读取会尽可能把数组装满
读入多个字节样例:
/1.创建对象
FileInputStream fis = new FileInputStream( name: "myio\la.txt")
//2.读取数据
byte[] bytes = new byte[2];
//一次读取多个字节数据,具体读多少,跟数组的长度有关
//返回值:本次读取到了多少个字节数据
int len1 =fis.read(bytes);
System.out.println(len1);//2
String str1= new string(bytes,0,len1);
System.out.println(str1);
int len2 = fis.read(bytes);
System.out.println(len2);//2
String str2 = new string(bytes, 0,len2);
System.out.println(str2);
int len3 = fis.read(bytes);
System.out.println(len3);// 1
String str3 = new string(bytes, 0,len3);
System.out.println(str3);// ed
//3.释放资源
fis.close();
计算机的存储规则
ASCll规则(英文)
编码规则:前面补0,补齐8位
解码规则:直接转成十进制
GBK(汉字)
编码规则:l不需要变动
规则1:汉字两个字节存储
规则2:高位字节二进制一定以1开头,转成十进制之后是一个负数
Unicode字符集的UTF-8编码格式
一个英文占一个字节,二进制第一位是0,转成十进制是正数
一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数
java中的编码和解码方式
字符流
字符流的底层其实就是字节流
特点
输入流:一次读一个字节,遇到中文时,一次读多个字节
输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中
使用场景
对于纯文本文件进行读写操作
FileReader
1.创建字符输入流对象
细节1:如果文件不存在,就直接报错。
2.读取数据
细节1:按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数
细节2:读到文件末尾了,read方法返回-1。
3.释放资源
FileReader使用样例
一次读取一个
//1.创建对象并关联本地文件
FileReader fr = new FileReader("myio\\a.txt");
int ch;
while((ch =fr.read())!= -1){System.out.print((char)ch);
}
//3.释放资源
fr.close();
一次读取多个
//1.创建对象
FileReader fr= new FileReader("myio\\a.txt");
//2.谈取数据
char[]chars = new char[2];
int len;
//read(chars):读取数据,解码,强转三步合并了,把强转之后的字符放到数组当中
//空参的read + 强转类型转换
while((len =fr.read(chars))!= -1){
//把数组中的数据变成字符串再进行打印
System,out.print(new string(chars,0,len));
//3.释放资源
fr.close();
read()的使用细节
1.read()默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个
2.在读取之后,方法的底层还会进行解码并转成十进制,最终把这个十进制作为返回值
FileWriter
FileWriter构造方法
FileWriter成员方法
FileWriter书写细节
1.创建字符输出流对象
细节1:参数是字符串表示的路径或者File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关
2.写数据
细节: 如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符
释放资源
细节:每次使用完流之后都要释放资源
字节缓冲流
字节缓冲流拷贝文件样例:
//1.创建缓冲流的对象
BufferedInputstream bis = ew BufferedInputstream(new FileInputstream("myiolla.txt")),
Bufferedoutputstream bos= new Bufferedoutputstream(new File0utputstream("myiol\copy.txt"));
//2.循环读取并写到目的地
int b;
while((b=bis.read())!=-1){
bos.write(b);
//3.释放资源
bos.close();
bis.close();
字符缓冲流
字符缓冲流特有方法
缓冲流总结
1.缓冲流有几种?
字节缓冲输入流:BufferedInputStream
字节缓冲输出流:BufferedOutputStream
字符缓冲输入流:BufferedReader
字符缓冲输出流:BufferedWriter
2.缓冲流为什么能提高性能
缓冲流自带长度为8192的缓冲区
可以显著提高字节流的读写性能
对于字符流提升不明显,对于字符缓冲流而言关键点是两个特有的方法
3.字符缓冲流两个特有的方法是什么?
字符缓冲输入流BufferedReader:readLine()
字符缓冲输出流BufferedWriter:newLine()
转换流
字符流与字节流之间的桥梁
主要作用:字节流想要使用字符流中的方法
序列化流
序列化流的作用:可以把java中的对象写到本地文件中
学生类代码:
package test11;import java.io.Serializable;public class students implements Serializable {private int age;private String name;private static final long serialVersionUID=1L;public students() {}public students(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "students{" +"age=" + age +", name='" + name + '\'' +'}';}
}
序列化流代码样例:
public class xuliehua {public static void main(String[] args) throws IOException, ClassNotFoundException {//创建对象students s=new students(12,"张三");//创建序列化流ObjectOutputStream obj=new ObjectOutputStream(new FileOutputStream("src/main/java/test11/r",true));//写出数据obj.writeObject(s);//关闭资源obj.close();
}
序列化流的小细节
使用对象输出流将对象保存到文件时会出现NotserializableException异常
解决方案:需要让Javabean类实现Serializable接口
反序列化流
反序列化流的作用:可以把序列化到本地文件中的对象,读取到程序中来
反序列化流代码样例:
package test11;import java.io.*;public class xuliehua {public static void main(String[] args) throws IOException, ClassNotFoundException {//创建反序列流的对象ObjectInputStream ss=new ObjectInputStream(new FileInputStream("src/main/java/test11/r"));//读取数据Object o=ss.readObject();System.out.println(o);ss.close();}
}