Input/Output
:指跨越出了
JVM
的边界,与外界数据的源头或者目标数据源进行数据交换
Java
程序会从各种地方输入数据,比如文件,磁盘,网络,其它程序中
Java
会采用不同的方式输出执行结果,比如屏幕、文件、磁盘、网络等
输入/
输出是针对
JVM
输入输出中的流模型
在
Java
程序中,对于数据的输入输出操作以流
Stream
方式进行,
JavaSE
提供各种各样的类用于使用相同的方法获取不同类型的数据,程序中通过标准的方法输入或者输出数据
流是处理输入
/
输出的一个洁净的方法,它不需要代码理解键盘和网络的不同。
Java
中流的实现是基于java.io包定义的类层次结构的
流概念
java.io
包通过数据流、序列化和文件系统为用户提供一种完成
I/O
操作的输入
/
输出流
数据流是指所有的数据通信通道
流是字节或字符数据的数据源或目的,用以隐藏数据传输细节,可以从流读取数据或将数据写到流
Java
程序不能直接操纵
I/O
设备,而是在程序和设备之间加入了一个中间介质,这就是流。
IO
输入输出通常指数据在内部存储器和外部存储器或其它周边设备之间的输入输出
流是数据传输的抽象表达,与具体设备无关。程序一旦建立了流,就可以不用理会起点或终点是何种设备
建立流实际上就是建立数据传输通道,将起点和终点连接起来
Java
程序通过流来完成输入
/
输出,它是生产或消费信息的抽象
流通过Java
的输入
/
输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,但是所有流的行为具有同样的方式
相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入,
从磁盘文件,从键盘或从网络套接字获取输入,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/
输出的一个洁净的方法,它不需要代码理解键盘和网络的不同。
流的分类
从
Java
不同版本上来说,流可以分为
BIO
、
NIO
和
AIO
三大类。
Java
中的
BIO
、
NIO
和
AIO
理解为是
Java语言对操作系统的各种 IO
模型的封装。程序员在使用这些
API
的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java
的
API
就可以了。
BIO
即同步阻塞
I/O
模式,数据的读取写入必须阻塞在一个线程内等待其完成。
NIO
即同步非阻塞,一个线程不断的轮询每个输入输出的状态改变,如果有状态发生了改变,则进
行下一步的操作。
AIO
即异步非阻塞
I/O
模型,无需一个线程去轮询所有
IO
操作的状态改变,在相应的状态改变后,系
统会通知对应的线程来处理。
扩展类的功能
扩展一个类功能的最简单方式就是继承
装饰模式
装饰器模式
Decorator Pattern
允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵
活
主要解决:一般的为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着
扩展功能的增多,子类会很膨胀
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模
式可以动态扩展一个实现类的功能
缺点:多层装饰比较复杂
使用场景:
1
、扩展一个类的功能。
2
、动态增加功能,动态撤销。
注意事项:可代替继承。
要求:
1
、被装饰方
(
多个
)
有个抽象角色
---
接口、抽象类
2
、装饰方实现接口(继承抽象类),并将装饰方定义为属性
Decorator
模式又名包装器
Wrapper
,它的主要用途在于给一个对象动态的添加一些额外的职责。与生成子类相比,它更具有灵活性
装饰器模式中的四种角色:被装饰对象、装饰对象、装饰器
Decorator
、公共接口或抽象类
在
IO
流定义中使用装饰模式
Java.io
包中大量的使用了设计模式中的装饰模式
decorator
和适配器模式
adapter
,使
IO
库具有很强的对称性和可扩展性,对称性表现在I/O
的对称和
byte/char
流的对称上。
File类
类
File
提供了一种与机器无关的方式来描述一个文件对象的属性
对于目录,
Java
把它简单的处理为一种特殊的文件,即文件名的列表
java.io.File
用于封装和平台无关的文件夹和文件夹对象,例如获取一个文件的字节数。这个写法是
针对windows
平台的,如果使用
mac
或者
linux
平台,则需要使用
通过类
File
中提供的方法,可以得到文件或者目录的描述信息,包括名称、所在路径、可读性等,
还可以生成新的文件、目录、改变文件名、删除文件、列出一个目录中所有的文件或者与某个模式
匹配的文件等
常见的构造方法
File(String pathName)
以
path
为路径创建
File
对象,如果
pathname
是相对路径,则默认的当前路
径在系统属性
user.dir
中存储
File(String parent,String child)
这里文件对象的路径为相对于
parent
路径的
child
路径
重点方法
System
.
out
.
println
(
ff
.
length
());
//
获取指定文件对象的字节数
,
单位为字节
System
.
out
.
println
(
ff
.
exists
());
//
是否存在对应的文件对象
,
返回
true
则表示存在
ff
.
delete
()
//
删除文件或者文件夹,注意
Java
并不能保证删除一定成功
ff
.
mkdirs
()
//
创建多级文件夹
,
而使用
mkdir
只能创建一层文件夹
//
实际编程中很少使用的方法
listFiles
():
File
[]
//
获取当前文件夹的所有子文件信息,子文件为
File
对象
静态属性
Separator
存储当前系统的路径分隔符
注意:
\
在字符串中为转义字符,如果需要使用
\
则必须写成
\\
。一般推荐使用/
访问文件名的方法
getName():String
获取文件名称
getPath():String
获取路径,如果构建
File
时使用的是相对路径,则这里返回的就是相对路径;如果
创建时参数为绝对路径,则返回绝对路径
getAbsolutePath():String
获取绝对路径
getParent():String
获取当前文件对象的上级
File
对象,如果构建文件对象时使用的是相对路径,则
这里返回为
null
文件检测相关方法
canWrite():boolean
是否可写
canRead():boolean
是否可读
首先
exists()
存在性判断,存在时再进行是否文件或者文件夹的判断
isFile():boolean 是否是文件,因为
File
对象可以封装文件和文件夹
isDirectory():boolean是否为文件夹
isAbsolute():boolean
是否为绝对路径
lastModified():long
文件的最后修改时间
常见操作
createNewFile():boolean
创建一个新文件
这个方法中有个受检型异常需要进行处理,处理方法:
try/catch
结构或者在方法上
throws
抛出异常
如果文件不存在则返回
true
,表示创建成功;如果文件已经存在则返回
false
,表示创建失败
static createTempFile(String prefix, string suffix):File
这个临时文件名称会有随机内容
临时文件的默认存放位置为操作系统默认的临时文件位置
c:\Users\Administrator\AppData\Local\Temp\
exists():boolean
文件或者文件夹是否存在
length():long
获取文件大小,单位为字节,如果是文件夹则返回值没有指定
renameTo(File):boolean
修改名称,可以修改文件名和文件夹名称
delete():boolean
删除文件。也可以删除文件夹,要求文件夹为空,不能有文件和子文件夹
注意:因为具体的文件或者文件夹的删除操作是由操作系统负责实现的,所以
Java
不能保证一定能
够删除成功
!
deleteOnExit():void
退出系统时自动删除
目录操作方法
mkdir():boolean
只能创建一层文件夹,如果创建
d:/a1/a2/a3
时,当父文件夹
d:/a1/a2
不存在时则
创建失败
mkdirs():boolean
自动创建多级文件夹
list():String[]
获取当前文件夹的所有子文件信息
listFiles():File[]
获取当前文件夹的所有子文件信息,子文件为
File
对象
static listRoots():File[]
列出系统的所有的根路径
文件过滤器
FilenameFilter
带参数的
listFiles
方法支持对于子文件进行过滤,只获取需要满足条件的文件对象
FilenameFilter
接口中包含一个
accept(File dir,String name)
方法,该方法用于对指定
File
的所有子目录或者文件进行迭代,如果方法返回true
则
list
方法会获取该目录或者文件
匿名内部类的写法
:
推荐写法