JAVA IO流

一、文件

文件在程序中是以流的形式来操作的。

流:数据在数据源(文件)和程序(内存)之间经历的路径。

输入流:数据从数据源(文件)到程序(内存)的路径。

输出流:数据从程序(内存)到数据源(文件)的路径。

二、常用的文件操作

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形式往文件添加内容

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值