IO流

Posted eatandsleep

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流相关的知识,希望对你有一定的参考价值。

IO流:

一、    File

1.1 概述

Io流的端点是File类;所以File对象可以作为参数传递给流的构造器。

Java是是面向对象的语言。在java中表示文件和目录(文件夹)的类就是File;可以用它来表示一个真实存在文件和目录(文件夹),但是java程序中的File对象可能没有一个真实存在的文件或目录(文件夹)。

     File类可以对文件和目录(文件夹)进行增删改查的操作,但是不能够访问文件内容本身。如需访问还是需要输入/输出流;

1.2构造器   

          1、创建对象(路径)

          创建对象可以分为两类,一类是根据给定的路径创建一个对象,还有就是在给定的路径下创建一个File对象;

路径分为绝对路径和相对路径;绝对路径是带盘符的路径,相对路径是相对于当前项目;

 技术图片

2、路径分隔符

在windows系统下支持的路径分隔符为\\

在Lninx和URL中路径分隔符为 /

Java为了解决兼容性问题在File中定义了一个静态常量:File.separator

     后来windows兼容了 / 所以 路径分隔符的通用格式为 /

 技术图片

 

1.3 常用方法

技术图片

 技术图片

二、IO流

     2.1概述

     IO流技术用来处理设备之间的数据传输。常用的有读写文件和网络通讯;Java中的IO是用流来进行操作的。

     根据流的流向可以分为输入流和输出流。

根据流数据的单位可以分为字节流和字符流。字符流主要用来处理纯文本文件,比如java txt js css html等这些文件。Word,excel不是文本文件,因为里面有图片。字节流可以读取字符流但是不能在内存中使用,查看因为单位不同,变成字符时会产生错误。

按根据流的功能可以分为节点流和处理流。节点流负责要处理文件的节点,处理流是装饰节点流或处理流的。这里用了装饰者模式;

2.2 IO流体系

 技术图片

     数据流可以在文件中存储基本数据类型和String

     对象流的范围更广,可以写入,写出对象流(包括基本数据类型和String),但是要序列化操作。

2.3 IO流操作的固定模式

     1、创建端点(File)

          也可以不创建,字节在节点流输入Path

     2、创建节点流

          常用的是文件节点流

     3、创建处理流

处理流主要是装饰作用,可以装饰节点流,也可以装饰处理流。

缓冲流的底层创建了一个8kb的空间,用来缓存数据提高输入输出的速度

转换流是为了解决字符的编码解码问题。

String也有编码解码对应的方法;

对象流相关的是序列化和反序列化。

序列化是将内存中的对象转换为二进制文件。要求改对象实现Serializable接口 ,提供一个序列化版本号serialVersionUID。每个类都会有默认serialVersionUID版本号,但是会随着属性和值的变化而发生变化,当跨平台时,对象发生更改就不能正确的识别原来的类。对象实现了Serializable接口后可以将其转化为字节,通过IO流将其持久化,然后将其在不同平台之间转换,如:在Window上创建了一个对象可以在mac电脑上恢复,同时这还可以通过网络进行操作。

同时序列化对象的属性也要求可以序列化,基本数据类型和String系统已经实现了序列化,关键是自己定义的类属性需要实现序列化。需要注意的是Static修饰的属性是类属性不能够序列,如果有要求非类属性不序列化的可以使用关键字transitacn

序列化的应用是Web,进程之间交互数据。

     4、进行读写操作方式是read(),和write();

          read()是一次读入一个字节,和硬盘交互太多影响效率,返回每次读要的字符为int型

          read(数组),是一次读入读入数组的长度,读入后数据覆盖改数组元素,返回本次读到的字符/字节个数;数组的长度不是无限大,最大为8kb;

          BuffedReader提供了一个read Line()功能的方法,每次可以读一行,但是没有读换行符,所以所有数据都联成一行,可以用其提供的另一个方法newLine()换行;

          处理流执行write()方法要调用flush()方法输出。

          write()方法默认覆盖文件,如果是追加调用2个参数的方法。

     5、关闭资源

          关闭资源要进行非空判断,否则会报空指针异常,同时也可以用1.7新出的try(){} 避免finally很长。

技术图片

 

2.4 特殊的IO流

在IO流中有一个特殊的类RandomAccessFile类,这个类实现多线程断点写入,写出。该类直接继承自Obeject,实现了DataOutput 和DataInput接口。所以这个类可以读入、也可以写出。还提供了记录指针的方法seek(int pos),可以从指针位置写入写出。

     我们在创建对象的时候要指定这个对象的模式,有四种模式:

     r 表示只能以只读的模式

     rw 表示可以读写

     rwd 可以读写,多线程下同步内容的更新

     rws  可以读写,多线程下同步内容和元数据的更新

技术图片

 

以上是关于IO流的主要内容,如果未能解决你的问题,请参考以下文章

IO流之IO流综述

IO异常--缓冲流--转换流--序列化流( IO流2 )

IO流(序列流)

java中的io流都有哪些

java IO流 IO流概述

IO流