《JAVA从入门到??》IO流

File类

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。File是对文件,文件夹,磁盘分区的抽象.
属性:
pathSeparator //与系统相关的路径分隔符字符,为方便起见,表示为字符串。
separator //与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。
构造方法:
File(String pathname) //通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
常用方法:
创建
createNewFile() // 创建新文件
mkdir() // 创建新目录
mkdirs() // 创建多级新目录
exists() // 判断是否存在
删除
delete() // 删除文件或空文件夹
注意:先删文件再删目录
查询
listRoots() //查询磁盘的分区情况
listRoots()[0].listFiles() //获取某个磁盘分区所有文件目录及文件
listRoots()[0].list() //获取某个磁盘分区所有文件目录及文件
listFiles() //查看当前目录下的所有子目录(包含文件)
isFile() //判断是否是一个文件
isDirectory() //判断是否是一个目录
getParentFile() // 获得父级目录
getAbsolutePath() // 获得绝对路径表示的文件
先获取当前文件的绝对路径,在获取上级目录
file.getAbsoluteFile().getParentFile()
length() // 文件长度(字节数)
toURI() // 获取URI(统一资源管理器)地址(含URL地址)
注意: File类只能访问文件的一般信息, 但不能访问文件内容.

IO概念

什么是IO
生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。
我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input和输出output ,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
I, Input, 输入
O, Output, 输出
广义上讲, IO是两个存储介质/设备/容器之间的数据交换,例如:
内存 <-> 硬盘/文件
计算机A <-> 计算机B
byte[] A <-> byte[] B
java提供了IO操作的API, java.io包
IO的分类
根据数据的流向分为:输入流和输出流。
输入流 :把数据从其他设备上读取到内存中的流。
输出流 :把数据从内存中写出到其他设备上的流。
格局数据的类型分为:字节流和字符流。
字节流 :以字节为单位,读写数据的流。
字符流 :以字符为单位,读写数据的流。

字节流

一切皆为字节
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。本质上, 所有的信息都以二进制/字节形式存储和传输。

字节输入输出流
流, Stream, 是进行IO操作时的数据传输通道.
从方向上说, 可分为:
OutputStream: 输出流 ( 写 )
InputStream: 输入流 ( 读 )

对于文件操作而言, Java提供了2个子类:
FileOutputStream
FileInputStream

写文件的步骤:

  1. [可选]创建File
  2. 创建FileOutputStream
  3. 使用write()将字节写到流中
  4. 使用flush()清空缓冲区
  5. 关闭流

读文件的步骤:

  1. [可选]创建File
  2. 创建FileInputStream
  3. 使用read()将流中的字节序列读取出来,存到byte[]
  4. 关闭流

**注意:

  1. OutputStream和InputStream都是字节流, 它们操作的都是字节, 如果希望用这两个类来实现文本信息的传输, 需要自行完成String和byte[]的转换. 转换时注意charSet.
  2. 流使用完毕后应该关闭, 否则占用资源.
  3. 可使用ByteArrayOutputStream作为读取字节时的容器.**

字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
java.io.Reader
|- InputStreamReader
|- FileReader
|- BufferedReader
java.io.Writer
|- OutputStreamWriter
|- FileWriter
|- BufferedWriter

虽然流中的数据本质上都是byte, 但有时候我们更希望以字符为单元来对流进行读写.
JAVA中定义了操作字符流的2个抽象类:
Writer
Reader

方法:
write(char[])
write(String)
int read()
read(char[])
read(char[], int off, int len)

转换流

OutputStreamWriter继承Writer, 它是字符流通向字节流的桥梁.
InputStreamReader继承Reader, 它是字节流通向字符流的桥梁.

构造器:
OutputStreamWriter(OutputStream os);
InputStreamReader(InputStream is);

OutputStreamWriter写文件

InputStreamReader读文件
文件读写便捷类
FileWriter
FileReader

注意: FileReader和FileWriter都采用系统默认字符编码, 无法自定义charset.
高性能读写类/缓冲字符流
BufferedWriter
BufferedReader
这2个类自带缓冲区, 它们的设计是为了更高效地读写字符流.
它们直接继承Writer和Reader.
除了常规的read(), write()之外, 有一个特殊的方法:
readLine()

对象流
java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
有的时候, 需要在流中传输复杂对象, 这要求能够把对象进行序列化(Serialize)和反序列化(DeSerialize).

ObjectOutputStream可以进行对象序列化:
writeObject()
ObjectInputStream可以进行反序列化:
readObject()

序列化概述
Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据、对象的类型和对象中存储的属性 等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。 对象的数据 、 对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。看图理解序列化:在这里插入图片描述

序列化操作
一个对象要想序列化,必须满足两个条件:
该类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。
该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

注意: 对象可序列化的前提是它实现了java.io.Serializable接口, 同时它的成员也要实现这个接口.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值