文件是保存数据的地方
文字、声音、视频本质上没有差别
在程序中,数据被封装到文件当中,文件以流的形式进行传输
文件是存放在磁盘当中的。文件与程序的交互相当于磁盘和内存的交互
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀
字节流(8bit)(二进制文件)
字符流(按字符,根据文件编码)(文本文件)、
(字节流+编码 = 字符流)
Reader
Writer
节点流:可以从一个特定的数据源读写数据。(较为底层,跟数据源直接接触)
对文件、对数组、对管道、对字符串等数据源直接操作的流,如File操作的一系列流,FileInputStream、FileReader以及对应的输出流
处理流/包装流:是"连接"在已存在的流(节点流、处理流)之上,为程序提供更为强大的读写功能。更加灵活
通过对以上节点流进行包装处理过的流。BufferedReader、BufferedWriter可以装入任意一个对应的流作为属性
节点流:是底层流,直接跟数据源相接
处理流(包装流):包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法完成输入输出
处理流的包装,使用了修饰器设计模式,不会直接与数据源相连。
优点
序列化:就是在保存数据的时候,保存数据的值和数据类型
反序列化:就是在恢复数据时,恢复数据的值和数据类型
需要将某个对象支持序列化机制,则必须要让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一
不要用字符流去读取二进制文件,会造成文件损坏
二进制文件有声音、视频、doc、pdf等等,基本单位是单个字节,使用字节流去读取
字符流也是二进制文件的一种,每个字符包含多个二进制
public void readFile1() throws IOException { String pathName = "e:\\study.txt"; int readData; FileInputStream fileInputStream = new FileInputStream(file); while((readData = fileInputStream.read()) != -1){//返回的是int类型,读取字符的数据,根据ASCII码转换 System.out.print((char)(readData) + " ");//read无参方法每次读取一个字节,将其转化成char字符就可输出 } fileInputStream.close(); }
//和无参read方法的差别是,多声明一个byte[],并且输出方法不一样 public void readFile2() throws IOException { String pathName = "e:\\study.txt"; byte[] bytes = new byte[8]; int len = 0; FileInputStream fileInputStream = new FileInputStream(file); while((len =fileInputStream.read(bytes)) != -1){//返回的是数组读取字节的个数,真正的数据在数组中 System.out.print(new String(bytes,0,len)+" ");//read带数组参数的方法,每次读取数组大小个字节,需要将其转化成String截取输出。 } fileInputStream.close(); }
public static void main(String[] args) throws IOException { String pathName = "e:\\yy\\tt.txt"; String str = "hello,world.welcome to java"; //FileOutputStream fileOutputStream = new FileOutputStream(pathName,true);//此方法是追加在文件末尾写入 FileOutputStream fileOutputStream = new FileOutputStream(pathName);//此方法是覆盖的方式写入 //fileOutputStream.write(str.charAt(0));读写一个字节 fileOutputStream.write(str.getBytes());//读写一整个字符串 //fileOutputStream.write(str.getBytes(),0,12);读写字符串的[0,12)个字符串 fileOutputStream.close(); }
FileReader
FileWrite:使用完后一定要记得close或者flush,不然数据写不进去。
System类的public final static InputStream in
System.in的编译类型是:InputStream
运行类型是:BufferedInputStream
表示标准输入的是:键盘
System类的public final static PrintStream out
System.out的编译类型是:PrintStream
运行类型是:PrintStream
表示标准输出的是:显示器
打印流只有输出流,没有输入流
字节打印流
PrintStream out = System.out;
out.print("hello,java")
out.close
这个print的底层就是write方法
字符打印流
PrintWriter printWriter = new PrintWriter(System.out);
printWriter.print("hello,java");
printWriter.close;
字节流 + 编码格式 = 字符流
Reader的子类,可以将InputStream字节流转换(包装)成Reader字符流
Writer的子类,可以将OutputStream字节流转换(包装)成Writer字符流
当处理存文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
可以在使用时指定编码格式(utf-8,gbk,gb2312,ISO8859-1等)
最底层是的字节流,传输二进制文件的流(以字节为单位读写)
为了能更好的更有效率的读写中文,我们把字节流按照一定编码规则(默认为utf-8)进行读写,称作字符流(以字符为单位读写)
这两个流属于底层流,称为节点流
再往上一层,有处理流(包装流)(以节点流为单位读写,本质上是操作节点流进行读写)
为了把已经有编码格式的字符流重新设置新的编码格式。我们需要把字符流中的字节流给取出来,然后使用InputStreamReader或者OutputStreamWriter,将该字节流加上编码格式转换成对应的新的字符流
如果有需要的话,就用处理流(包装流)将该字符流进行包装。使用处理流来读写数据。
专门用于读写配置文件的集合类
配置文件的格式:键=值
注意:键值对不需要有空格,值不需要用引号引起来,默认类型是String
如何读取mysql.properties文件
//创建一个Properties类对象 Properties properties = new Properties(); //加载指定配置文件。把想要的配置文件的内容加载到该类实例中 properties.load(new FileReader("src\\mysql.properties")); //把properties类实例的内容显示在控制台 properties.list(System.out);
Properties类是用来和后缀为.properties的配置文件交互(读写)的
首先,我们Propertties类是会保存一份数据的。我们所有对Properties类的操作,数据都会保存在这个类中。
只有两条操作是跟后缀为.properties的配置文件交互的。
没必要纠结参数的输入输出。以程序为主体,load就是读取(InputStream或者Reader),从外来文件到程序。store就是写入(OutputStream或者Writer),从程序写入到文件。