IO流

------------------------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 区别在于 后面两个方法 可以写入任意类型的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值