一、文件
文件在程序中是以流的形式来操作的。
流:数据在数据源(文件)和程序(内存)之间经历的路径。
输入流:数据从数据源(文件)到程序(内存)的路径。
输出流:数据从程序(内存)到数据源(文件)的路径。
二、常用的文件操作
1、文件的创建
示例:用三种不同的方式在D盘下创建三个文件。
方式一:
方式二:
方式三:
2、文件的删除和目录的创建
示例1:删除文件”file1.txt“
示例2:删除目录”demo“(在java编程中,目录也被当做文件)
示例3:使用mkdir方法创建一级目录
示例4:使用mkdirs方法创建多级目录
三、流的分类
按操作数据单位不同分为: 字节流(8bit)二进制文件,字符流(按字符)文本文件。
按数据流的流向不同分为:输入流,输出流。
按流的角色的不同分为:节点流,处理流/包装流。
1、Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的。
2、由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
关于文件中的字节:
一个汉字占3个字节,一个数字、字母、符号占1个字节。
例如”hello,程序猿“。”hello“和”,“一共占了6个字节,”程序猿“占了9个字节,所以一共15个字节。
1、字节流FileInputStream和FileOutputStream
示例1:使用FileInputStream对象一个字节一个字节的读取文件中的内容。
示例2:使用FileInputStream对象多个字节的读取文件中的内容。
示例1和示例2读出来的内容都是乱码,不要急,后面有办法解决。
示例3:使用FileOutputStream对象在文件中写入内容。
示例4:使用FileInputStream对象和FileOutputStream对象实现文件的拷贝。
2、字符流FileReader和FileWriter
FileReader和FileWriter是字符流,就是按照字符来操作io。
注意: FileWriter使用后,必须要关闭(close)或者刷新(flush),否则写入不到指定文件!!!
示例1:使用FileReader读取文件内容。
单个字符的方式读:
多个字符的方式读:
使用FileReader读取指定文件内容不会出现乱码!
示例2:使用FileWriter往指定文件写入内容。
四、节点流和处理流
1、基本介绍
1、节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter。
2、处理流(也叫包装流)是”连接“在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter。
2、区别和联系
1、节点流是底层流,直接更数据源相接。
2、处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
3、处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连。
3、处理流的主要功能
1、性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
2、操作的便捷:处理流可能提供一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便。
4、处理流BufferedReader和BufferedWriter
示例1:使用BufferedReader读取文件内容。
使用BufferedReader读取指定文件内容不会出现乱码!
示例2:使用BufferedWriter往指定文件写内容。
示例3:使用BufferedReader和BufferedWriter完成文件的拷贝。
5、处理流BufferedInputStream和BufferedOutputStream
BufferedInputStream是字节流,在创建BufferedInputStream时,会创建一个内部缓冲区数组。
BufferedOutputStream是字节流,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统。
示例1:使用BufferedInputStream和BufferedOutputStream实现图片的拷贝。
6、对象流ObjectInputStream和ObjectOutputStream
看一个需求:
1、将int num = 100这个int数据保存到文件中,注意不是100数字,而是int 100,并且能够从文件中直接恢复int 100。
2、将Dog dog = new Dog("小黄",3)这个dog对象保存到文件中,并且能够从文件恢复。
3、上面的要求,就是能够将基本数据类型或者对象进行序列化和反序列化的操作。
序列化和反序列化:
1、序列化就是在保存数据时,保存数据的值和数据类型。
2、反序列化就是在恢复数据时,恢复数据的值和数据类型。
3、需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现Serializable或者Externalizable接口。
示例1:使用ObjectOutputStream序列化一个dat文件。
示例2:使用ObjectOutputStream反序列化文件。
序列化和反序列化注意事项和细节说明:
1、读写顺序要一致。
2、要求实现序列化或反序列化对象,需要实现Serializable。
3、序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性。
4、序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员。
5、序列化对象时,要求里面属性的类型也需要实现序列化接口。
6、序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化。
7、转换流InputStreamReader和OutputStreamWriter
1、InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成Reader(字符流)。
2、OutputStreamWriter:Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)。
3、当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流。
4、可以在使用时指定编码格式(比如utf-8,gbk,gb2312,ISO8859-1等)。
示例1:使用InputStreamReader对文件进行读取(按照utf-8格式读取)。
示例2:使用OutputStreamWriter对文件进行写入(按照utf-8格式)。
8、打印流PrintStream和PrintWriter
打印流只有输出流,没有输入流。
示例1:使用PrintStream向指定文件写入内容
示例2:使用PrintWriter向指定文件写入内容
五、Properties类
mysql.properties:
示例1:使用Properties根据key读取value
示例2:使用Properties以kv形式往文件添加内容