Java进阶---IO

废话不多说,直入正题。

PS:这只是部分常用流

一、File

API描述:File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象那么我们就要研究研究File这个类中都有那些功能可以操作文件或者文件夹呢?

1.File类构造函数 

2.File类常用获取文件相关信息方法

3.File类创建、删除文件等操作方法

public boolean mkdirs() 创建多层文件夹

4.listFiles()方法介绍

文件都存放在目录(文件夹)中,那么如何获取一个目录中的所有文件或者目录中的文件夹呢?这时候就要用到listFiles()方法

提醒:在获取指定目录下的文件或者文件夹时必须满足下面两个条件
1,指定的目录必须是存在的,
2,指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException

5.文件过滤器

我们可以获取到一个目录下的所有文件和文件夹,但能不能对其进行过滤呢?比如我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹呢?listFiles()可以,但有点麻烦。Java给我们提供相应的功能来解决这个问题。

查阅File类的API,在查阅时发现File类中重载的listFiles方法,并且接受指定的过滤器

这方法有个FileFilter类型的参数,FileFilter是个接口,里面有且仅有一个方法

那么这个过滤器是如何过滤的呢?下图为文件过滤器的执行流程:

如下为遍历一个File文件下的所有 .java文件 代码

 

二、字节流

在前面的学习过程中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据。现在我们就要开始给文件中写数据,或者读取文件中的数据。

1. 字节输出流OutputStream

这是一个抽象类。下图为该类下的常用方法:

1.1  FileOutputStream类

OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。

构造方法:

给文件续写构造方法:

附:换行符/r/n

2. 字节输入流 InputStream 

常用方法:

2.1 FileInputStream类

构造方法类似与Outpustream但是没有 续写 构造方法,在这里就不列出来了(查看API)

2.2 字节流复制文件例子

 

三、字符流

1. 字符输入流Reader(抽象类)

下图为该抽象类下的读取重载方法:

1.2 FileReader

用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的

2.  字符输出流Writer(抽象类)

注意:a. 该类可以写入字符串String  . b.该类调用writer()方法后要调用flush()才能写入目的地    c. close()关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。

2.1 FileWriter类

构造方法:

该字符流也可以完成文本的copy,而且比字节流效率更高,在这就不再重复写了。

四、转换流

1. InputStreamReader 类  (Reader下的直接子类)

InputStreamReader 是字节流通向字符流的桥梁,它使用指定的字符编码表读取字节并将其解码为字符。

常用构造方法:

String  CharsetNAme 不写,使用默认字符集

下图为转换流图解:

转换流实例代码:

2.  OutputStreamWriter 类 (Writer下的直接子类)

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。

构造方法类似与InputStreamReader,方法继承与Writer

PS:当使用默认编码是,建议使用FileWriter和FileReader。一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流

五、缓冲流(高效流)

Java中提高了一套缓冲流,它的存在,可提高IO流的读写速度。缓冲流,根据流的分类分类字节缓冲流与字符缓冲流。

1.字节缓冲流

字节缓冲流根据流的方向,共有2个

a . 写入数据到流中,字节缓冲输出流 BufferedOutputStream

b . 读取流中的数据,字节缓冲输入流 BufferedInputStream

1.1 BufferedOutputStream

构造方法:

ps : 参数写是谁就对谁高效

1.2 BufferedInputStream

构造方法:

2. 字符缓冲流

a . 字符缓冲输入流 BufferedReader

b . 字符缓冲输出流 BufferedWriter

2.1 BufferedReader (父类为Reader)

字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取

构造方法:

特有读取行方法:如果已到达流末尾,则返回 null

2.2 BufferedWriter (父类为Writer)

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

构造方法:

特有方法:根据当前的系统,写入一个换行符

3. 使用字符缓冲流完成文本文件的复制

六、Properties 类

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串

特点:
a、Hashtable的子类,map集合中的方法都可以用。
b、该集合没有泛型。键值都是字符串。
c、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。

1.有和流技术相结合的方法:

2. 常用Properties方法:

3. 读取文件中的数据,并保存到集合(将集合中内容存储到文件)

注意:使用字符流FileReader就可以完成文件中的中文读取操作了

七、序列化流与反序列化流(字节流的子类)

用于从流中读取对象的操作流 ObjectInputStream    称为 反序列化流
用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流

特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象

1. 对象序列化流ObjectOutputStream

一个对象写入原始数据类型和java对象图的一个输出流。对象可以读取(重组)用ObjectInputStream。通过使用流的文件,可以实现对对象的持久存储。

构造方法:

特有常用方法:

2. 对象反序列化流ObjectInputStream

对象输入流是用来恢复以前那些对象序列化

构造方法:

常用特有方法:readObject()是用来读取从流对象

3.  序列化接口

当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException异常。
同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生InvalidClassException异常。发生这个异常的原因如下:
a . 该类的序列版本号与从流中读取的类描述符的版本号不匹配 
b . 该类包含未知数据类型 
c . 该类没有可访问的无参数构造方法 
Serializable是一个标记接口(空接口)。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID. 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

4.序列号的冲突问题的解决

解决方法:自定义了序列号,这样编译器就不会计算序列号

private static final long serialVersionUID = 1478652478456L;(后面的数字随意)

4. 瞬态关键字transient

当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient修饰。只要被transient修饰了,序列化时这个属性就不会被序列化了。
同时静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。

public /*transient阻止成员变量序列化*/ int age;

5.一个简单的反序列化和序列化例子代码:

八、打印流

打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.
打印流根据流的分类:
字节打印流 PrintStream
字符打印流 PrintWriter

 

打印流的特点:
a . 此流不负责数据源,只负责数据目的
b . 为其他输出流,添加功能
c . 永远不会抛出IOException ,但是,可能抛出别的异常

 两个打印流的方法,完全一致

void print(String str): 输出任意类型的数据,

void println(String str): 输出任意类型的数据,自动写入换行操作

 构造方法,就是打印流的输出目的端

1. PrintStream(OutputStream下的一个类,不是直接子类)

构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream

2. PrintWriter  (Writer下的直接子类)

这个类实现了所有发现的 PrintStream方法

 

构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream, 接收字符输出流Writer

 

 

 

附:流的操作规律

 

IO流中对象很多,解决问题(处理设备上的数据时)到底该用哪个对象呢?  
把IO流进行了规律的总结(三个明确):

 

明确一:要操作的数据是数据源还是数据目的。

                源:InputStream    Reader

                目的:OutputStream Writer

 

先根据需求明确要读,还是要写。

明确二:要操作的数据是字节还是文本呢?
                源:
                    字节:InputStream
                    文本:Reader
                目的:
                    字节:OutputStream
                    文本:Writer
已经明确到了具体的体系上。

明确三:是否需要额外功能呢?
                额外功能:
                    转换吗?转换流。InputStreamReader OutputStreamWriter
                    高效吗?缓冲区对象。BufferedXXX或者缓冲数组

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值