JavaSE高级开发之JavaIO

核心五个类FIle、Outputstream、Reader、Writer
一个接口Serializable

1. File文件操作类

java.io 包中,File类是唯一与文件本身操作(创建、删除、取得信息)有关,与文件内容无关的程序类。

1.1 File类(即可描述真实文件,也可以是个文件夹)的基本使用

File类的两种实例化方式:

public File(String pathname)
public File(String parent, String child)

创建新文件

pubilc boolean createNewFlie() throws IOException

判断文件是否存在(exists:存在,实际上有)

public boolean exists()

删除文件

public boolean delete()

路径分隔符

File.separator(推荐使用,替换双斜杠)

1.2 目录操作

1.2.1 取得父路径和父File对象
public String getParent()
public File getParentFile()
1.2.2 创建目录(无论有多少级父目录,都会一次性创建)
public boolean mkdirs()

1.3 取得文件信息

判断File对象是否是文件

public boolean isFile()

判断File对象是否是路径

public boolean isDirectory()

取得文件大小

public long length()

取得最后修改日期

public long lastModeifile()

列举一个目录的全部组成

public File[] listFile()

IO相关处理属于阻塞式耗时操作,一般放在子线程中进行。

2.字节与字符流

流的分类
字节流:

InputStream、OutputStream

字符流(char)

Reader、Writer

字节流与字符流的区别:
字节流是原生操作,字节流是处理后的操作

一般使用字节流(无论是网络传输还是磁盘数据保存均以字节为单位),只有处理中文文本时才会用到字符流。

2.1 流操作流程

无论是字节流还是字符流,操作流程几乎一样,以文本操作为例:

  1. 取得file对象
  2. 取得file对象的输入、输出流
  3. 进行数据的读取或写入
  4. 关闭流(Close)

IO操作属于资源处理,所有资源处理(IO、数据库、网络)使用后都必须关闭。

2.2 字节输出流( OutputStream)

如果要想通过程序进行内容输出,则可以使用java.io.OutputStream。 来观察OutputStream类的定义结构:

public abstract class OutputStream implements Closeable, Flushable

OutputStream类实现了Closeable,Flushable两个接口,这两个接口中的方法:

Closeable: public void close() throws IOException;
Flushable: public void flush() throws IOException;

输出方法:

  1. 将指定的字节数组全部输出
public void write(byte[] b) throws IOException;
  1. 将部分字节数组输出
public void write(byte[] b, int offest, int len) throws IOException;
  1. 输出单个字节
public abstract void write(int b) throws IOException;

要进行文件内容的输出,使用FileOutputStream子类

  1. 接收File类(覆盖):
public FileOutputStream(File file) throws FileNotFoundException
  1. 接收File类(追加):
public FileOutputStream(File file, boolean append)

当使用FileOutputStream进行文件内容输出时,只要文件的父路径存在,FileOutputStream会自动创建文件。

2.2.2 AutoCloseable自动关闭支持-- JDk1.7之后

使用自懂关闭接口有一个前提,需要结合 try……catch……

2.3 字节输入流(InputStream)

输入方法read:读取数据到字节数组b中

public int read(byte[] b) throws IOException

返回值三种情况

  1. 返回b长度:当读取的数据大小 > 字节数组大小,返回字节数组大小
  2. 返回一个 > 0的数,单数小于b的长度:读取数据大小 < 字节数组大小,返回真正读取个数
  3. 直接返回 -1 :数据读取完毕

读取单个字节

public int read() throws IOException

2.4 字符流

字符数出流Writer
除了参数为字节数组外,多了一个传入String对象的方法

public void write(String str) throws IOException

字节的输入流Reader
Reader类中没有方法可以直接读取字符串,只能通过字符数组读取

2.5 字节流与字符流

从实际开发来讲,字节流优先考虑,只有处理中文时才会考虑使用字符流。

所有字符流操作,无论是写入还是输出,数据线保存在缓存中。

2.6 转换流:字节流 -> 字符流

转换流用于将底层的字节流转为字符流供子类使用

OutputStreamWriter:字节输出流 -> 字符输出流
InputStreeamReader:字符输出流 -> 字节输出流

3.字符编码

3.1 GBK、GB2312:国标编码

GBK即包含简体中文也包含繁体中文,而GB2312只包含简体中文。

3.2 UNICODE

java提供的16进制编码,可以描述世界上任意的文字。由于采用16进制编码,导致编码的体积太大,造成网络传输负担。

3.3 ISO-8859-1

浏览器默认编码,国际通用编码,不支持中文。

3.4 UTF编码(UTF-8)

相当于结合了ISO-8859-1和UNICOE编码,支持所有语言且体积较小

乱码的产生原因(95%):编解码不一致

4.内存流

除了文件之外,IO操作也可以发生在内存中,发生在内存中的操作流称为内存流。

内存流分类:
字节内存流

ByteArrayInputStream 、ByteArrayOutputStream

字符内存流

CharArrayReader、CharArrayWriter

5. 打印流(输出流进化版)

系统提供的两大打印流

PrintStream:打印流分为字节打印流
PrintWriter:字符打印流

打印流应用的是装饰设计模式:
核心依然是某个类(OutputStream)的功能(write()),但是为了得到更好的从做效果,让其支持的功能更多。

优点:扩展功能特别方便,需要不同的功能时只需要更换修饰类即可。
缺点:类结构复杂

6. System对IO的支持

输出(均是打印流PrintStream的对象)
标准输出(显示器)

System.out

错误输出

System.err

输入(输入流InputStream的对象)
标准输入(键盘)

System.in

7.两种输入流(原生InputStream的进化版)

BufferedReader(了解即可)
readLine():读取一行输入

Scanner-----java.util.Scanner

判断是否有指定类型的数据输入:public boolean hasNextXXX()
取得指定类型数据:public 数据类型 nextXXX()
自定义分隔符:public Scanner useDelimiter(Pattern pattern)

总结:以后除了二进制文件拷贝的处理之外,那么只要是针对程序的信息输出都是用打印流(PrintStream、 PrintWriter),信息输出使用Scanner。

8. 序列化

8.1 定义

将内存的对象变为二进制的形式进行传输或保存到文本中。

8.2实现

java中若要被序列化输出,该类必须要实现 Serializable 接口。该接口是一个标示接口,表示该类具有序列化的功能。

8.3 序列化与反序列化操作

要想实现序列化与反序列化的对象操作,需要使用io包提供的两个类ObjectOutputStream、ObjectInputStream

对象序列化输出–ObjectOutputStream
将对象序列化输出方法

public final void writeObject(Object obj) throws IOException 

对象反序列化输入–ObjectInputStream

将对象反序列输入

public final Object readObject()
    throws IOException, ClassNotFoundException

transient 关键字
使用Serializeable序列化输出时,默认将对象的所有属性以及值均序列化以及反序列化,

如果希望某些属性值不进行序列化输出,可以在属性前加transient关键字。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值