------------------------IO流第一天--------------------------
文件:
文本文件 字符 字符流
其他字节码文件 字节流
O:out 输出 write
字节流
OutputStream : 字节输出流抽象父类
|--FileOutputStream 可以操作文件的 将程序中的数据写到文件File中
构造: FileOutputStream(File file)
FileOutputStream(String pathname) 如果文件不存在可以帮忙创建出来
写数据:
write重载
写单个字节 一个字节一个字节
写字节数组
写字节数组一部分
关闭流:
close()
I:in 输入 读 read
InputStream : 字节输入流抽象父类
|--FileInputStream 可以操作文件的 字节输入流 将文件中的数据读取到内存中
构造: FileInputStream(File file)
FileInputStream(String pathname)
读数据
int read() 读取一个字节 返回值是 那个字节 只不过用int接收
如果读到了末尾,返回-1
int read(byte[] bys) 按照一个字节数组的量去读取,返回值是读取到字节的个数,
如果读到末尾,返回-1
byte[] 0, length
还有一个方法可以读取字节数组的一部分
关闭流:
close();
字符流:
常见编码表(现在作为了解)
常用的编码表 GBK UTF-8 拉丁码表(不能识别中文)
GBK:英文占一个字节 中文占两个 \r \n
UTF-8:能用一个字节的就用一个 中文占3个
咱们现在默认的是GBK
编码: 将看得懂的变成看不懂的 地下党--发密文
字符---数字 输出流
解码: 将看不懂的变成看的懂得 我党--解读密文
数字--字符 输入流
Reader 字符输入流的抽象父类
|--FileReader 操作文件的字符输入流
构造 FileReader(File file)
FileReader(String pathname)
读取:
int read() 一个字符一个字符读取 返回值是读到的字符 还是用int来接收
如果读不到 返回-1
int read(char[] chs) 使用字符数组读取 将读取到的字符放在数组中,返回值就是读到的字符个数
可以读取字符数组的一部分
关闭流
close()
Writer 字符输出流的抽象父类
|--FileWriter 操作文件的字符输出流
构造 FileWriter(File file)
FileWriter(String pathname)
写
write重载 写单个字符
写字符数组
写字符串
写字符数组一部分
写字符串一部分
关闭流:
close() 先刷新再关闭流
flush() 将数据刷新到文件中
读文件 写文件
1:创建对应的流
2:做对应的操作
3:关闭流
复制文件:
1:创建输入流 跟 数据源文件关联
2:创建输出流 跟 目标文件冠梁
3:从数据源中读数据
4:往目标文件写数据
5:关闭流
------------------------IO流第二天--------------------------
字符流 = 字节流 + 编码表
转换流和子类区别
发现有如下继承关系:
依赖字节流 指定编码
OutputStreamWriter: 字符流通向字节流的桥梁 看的懂变成看不懂的 编码
|--FileWriter:
InputStreamReader: 字节流通向字符流的桥梁 看不懂的变成看的懂得 解码
|--FileReader;
父类和子类的功能有什么区别呢?
OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。
字符转换流原理:字节流+编码表。
FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。
当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。
FileReader fr = new FileReader("a.txt");
这三句代码的功能是一样的,其中第三句最为便捷。
注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。
什么时候用子类呢?
条件:
1、操作的是文件。2、使用默认编码。
总结:
字节--->字符 : 看不懂的--->看的懂的。 需要读。输入流。 InputStreamReader 解码
字符--->字节 : 看的懂的--->看不懂的。 需要写。输出流。 OutputStreamWriter 编码
缓冲流 :
在我们学习字节流与字符流的时候,大家都进行过读取文件中数据的操作,
读取数据量大的文件时,读取的速度会很慢,很影响我们程序的效率,那么,我想提高速度,怎么办?
Java中提高了一套缓冲流,它的存在,可提高IO流的读写速度
缓冲流,根据流的分类分类字节缓冲流与字符缓冲流。
缓冲流 就是 对基本的字符流或者字节流 进行了一层包装
也就是 在构造中 BufferedXxxx(传递对应的字节流或者字符流)
注意 我们学习的字节流 子类 有 FileInputStream FileOutputStream
我们学习的字符流 子类 有 FileReader FileWriter
InputStreamReader OutputStreamWriter
缓冲流就是加了一层包装 在调用方法上都是一样的
只不过 在 BufferedReader 中有读取一行的方法 readLine()
在 BufferedWriter 中有写一个换行操作的方法 newLine()
-------------流的操作规律-------------------------
IO流中对象很多,解决问题(处理设备上的数据时)到底该用哪个对象呢?
把IO流进行了规律的总结(四个明确):
明确一:要操作的数据是数据源还是数据目的。
源: InputStream Reader
目的: OutputStream Writer
先根据需求明确要读,还是要写。
明确二:要操作的设备上的数据是字节还是文本呢?
源:
字节: InputStream
文本: Reader
目的:
字节: OutputStream
文本: Writer
已经明确到了具体的体系上。
明确三:明确数据所在的具体设备。
源设备:
硬盘:文件 File开头。
内存:数组,字符串。
键盘:System.in;
网络:Socket
目的设备:
硬盘:文件 File开头。
内存:数组,字符串。
屏幕:System.out
网络:Socket
完全可以明确具体要使用哪个流对象。
明确四:是否需要额外功能呢?
额外功能:
转换吗?转换流。InputStreamReader OutputStreamWriter
高效吗?缓冲区对象。BufferedXXX
---------------------IO第三天------------------------------------------------
Properties 集合 重点
1:Map 双列集合 Map 共性 也有 Hashtable的子类
2:没有泛型约束 这里面的键值都是String类型
3:一个持久化的属性集
4:唯一可以直接跟io交互使用的集合
load(InputStream in)
store(OutputStream out , String zhushi)
写到文件中
从文件读取 用的最多
配置文件 ?
url=数据库地址
username=数据库名称
password=数据库密码
在jdbc写工具类的时候 完成这样的操作
理解
序列化
反序列化
重点在于 知道 这俩是什么玩意儿
序列化 对象输出流 将对象以对象的形式写到文件中
反序列化 对象输入流 将文件中的数据以 对象形式 读取过来
如果该类对象要序列化,那么该类必须实现序列化接口(Serializable)
注意事项:
读取文件的那个版本号 要跟 字节码文件的版本号 一致 才能进行反序列化
静态的变量不会被序列化的
如果 成员变量不想被序列化 用瞬态关键字 修饰 transient
打印流: 了解
PrintStream 字节打印流
PrintWriter 字符打印流
System.out 是字节打印流
可以当做普通流使用
也可以 在控制台打印
write print println 区别在于 后面两个方法 可以写入任意类型的