JAVA学习笔记(7)——输入/输出流和文件

一、输入/输出流
通常程序需要从外部获取/输出信息
–这个“外部”范围很广,包括诸如键盘、显示器、文件、磁盘、网络、另外一个程序等
–“信息”也可以是任何类型的,例如一个对象、串字符、图像、声音等

通过使用java.io包中的输入/输出流类就可以达到输入输出信息的目的

1.I/O流(Input/Output)
–在Java中将信息的输入与输出过程抽象为I/O流
输入是指数据流入程序
输出是指数据从程序流出
–一个流就是一个从源流向目的地的数据序列
–IO流类一旦被创建就会自动打开
–通过调用close方法,可以显式关闭任何一个流,如果流对象不再被引用,Java的垃圾回收机制也会隐式地关闭它
(1)输入流
– 为了从信息源获取信息,程序打开一个输入流,程序可从输入流读取信息
(2)输出流

– 当程序需要向目标位置写信息时,便需要打开一个输出流,程序通过输出流向这个目标位置写信息

2.预定义的I/O流类
输入/输出流可以从以下几个方面进行分类
–从流的方向划分
    输入流
    输出流
–从流的分工划分
    节点流
    处理流
–从流的内容划分
面向字符的流:
–专门用于字符数据
–源或目标通常是文本文件
–Java中的字符使用16-bit 的Unicode编码,
每个字符占两个字节
面向字节的流:用于一般目的
(1)面向字符的流
面向字符的抽象类——Reader和Writer
– java.io包中所有字符流的抽象基类
– Reader提供了输入字符的API
– Writer提供了输出字符的API
– 它们的子类又可分为两大类
节点流:从数据源读入数据或往目的地写出数据
处理流:不直接与数据源或目标相连,而与另外的流进行配合
        如:BufferedReader对另一个流产生的数据进行缓冲
– 多数程序使用这两个抽象类的一系列子类来读入/写出文本信息
例如FileReader/FileWriter用来读/写文本文件
(2)面向字节的流
数据源或目标中含有非字符数据,必须用字节流来输入/输出
通常被用来读写诸如图片、声音之类的数据(二进制)
绝大多数数据是被存储为二进制文件的,世界上的文本文件大约只能占到2%,通常二进制文件要比含有相同数据量的文本文件小得多
InputStream和OutputStream
–是用来处理8位字节流的抽象基类,程序使用这两个类的子类来读写8位的字节信息
–分为两部分
节点流
处理流
(3)标准输入输出
标准输入输出流对象
–System类的静态成员变量
–包括
System.in:InputStream类型的,代表标准输入流,这个流是已经打开了的,默认状态对应于键盘输入。
System.out:PrintStream类型的,代表标准输出流,默认状态对应于屏幕输出
System.err:PrintStream类型的,代表标准错误信息输出流,默认状态对应于屏幕输出
(4)IO异常

–多数IO方法在遇到错误时会抛出异常,因此调用这些方法时必须在方法头声明抛出IOException异常或者在try块中执行IO,然后捕获IOException

二、文件读写

1、File类
表示磁盘文件信息
定义了一些与平台无关的方法来操纵文件
–创建、删除文件
–重命名文件
–判断文件的读写权限及是否存在
–设置和查询文件的最近修改时间等

构造文件流可以使用File类的对象作为参数

2、写文本文件
BufferedWriter类
–如果需要写入的内容很多,就应该使用更为高效的缓冲器流类BufferedWriter
–FileWriter和BufferedWriter类都用于输出字符流,包含的方法几乎完全一样,但BufferedWriter多提供了一个newLine()方法用于换行

不同厂家生产的计算机(IBM, Apple, Sun) 对文字的换行方法不同。newLine()方法可以输出在当前计算机上正确的换行符

3、读文本文件
FileReader类
–从文本文件中读取字符
–继承自Reader抽象类的子类InputStreamReader
BufferedReader
–读文本文件的缓冲器类
–具有readLine()方法,可以对换行符进行鉴别,一行一行地读取输入流中的内容

–继承自Reader

4、读、写二进制文件
(1)二进制文件
–原则上讲,所有文件都是由8位的字节组成的
–如果文件字节中的内容应被解释为字符,则文件被称为文本文件;如果被解释为其它含义,则文件被称为二进制文件(字节)
(2)抽象类OutputStream
–派生类FileOutputStream
用于一般目的输出(非字符输出)
用于成组字节输出
–派生类DataOutputStream
具有写各种基本数据类型的方法
将数据写到另一个输出流
它在所有的计算机平台上使用同样的数据格式
其中size方法,可作为计数器,统计写入的字节数
(3)DataInputStream 类和DataOutputStream类创建的对象被称为数据输入流和数据输出流。
–按着机器无关的风格读取,可连接到FileInputStream和FileOutputStream
–可从数据流中读、写基本数据类型构造方法
(1)DataInputStream(InputStream in)将创建的数据输入流指向一个由参数in指定的输入流,以便从后者读取数据(DataInputStream chaines to FileInputStream. )
(2)DataOutputStream(OutnputStream out)将创建的数据输出流指向一个由参数out指定的输出流,然后通过这个数据输出流把Java数据类型的数据写到输出流out。(DataOutputStream chaines to FileOutputStream. )
BufferedOutputStream
–写二进制文件的缓冲流类
–类似于文本文件中的BufferedWriter
–对于大量数据的写入,可提高效率
–用法示例:
DataOutputStream out = new DataOutputStream( 
new BufferedOutputStream( 

new FileOutputStream( fileName ) ) ); 

5、随机文件读写
(1)随机文件读写
–对于很多场合,例如银行系统、实时销售系统,要求能够迅速、直接地访问文件中的特定信息,而无需查找其他的记录。这种类型的即时访问可能要用到随机存取文件和数据库
–随机文件的应用程序必须指定文件的格式。最简单的是要求文件中的所有记录均保持相同的固定长度。利用固定长度的记录,程序可以容易地计算出任何一条记录相对于文件头的确切位置
–Java.io包提供了RandomAccessFile类用于随机文件的创建和访问
–RandomAccessFile类创建的对象的流的指向既可以做源,也可以做目的地(既可以从流中读取数据也可以从流中写入数据)
(2)RandomAccessFile类
– 可跳转到文件的任意位置读/写数据
– 可在随机文件中插入数据,而不破坏该文件的其他数据
– 实现了DataInput 和DataOutput 接口,可使用普通的读写方法
– 有个位置指示器,指向当前读写处的位置。刚打开文件时,文件指示器指向文件的开头处。对文件指针显式操作的方法有:
int skipBytes(int n):把文件指针向前移动指定的n个字节
void seek(long):移动文件指针到指定的位置。
long getFilePointer():得到当前的文件指针。
– 在等长记录格式文件的随机读取时有很大的优势,但仅限于操作文件,不能访问其它IO设备,如网络、内存映像等
(3)构造函数
–RandomAccessFile(String name, String mode)
参数name 用来确定一个文件名,给出流的源,同时也是流目的地。参数mode取r(只读)或rw(可读写)决定流对文件的访问权限。
–RandomAccessFile(File file, String mode)
参数file 是一个File对象,给出流的源,同时也是流目的地。
        参数mode取r(只读)或rw(可读写)决定流对文件的访问权限。
– 建立一个RandomAccessFile时,要指出你要执行的操作:
仅从文件读,还是同时读写
new RandomAccessFile("farrago.txt", "r");

new RandomAccessFile("farrago.txt", "rw");

6、处理压缩文件
(1)压缩流类
–java.util.zip包中提供了一些类,使我们可以以压缩格式对流进行读写
–它们都继承自字节流类OutputStream和InputStream
–其中GZIPOutputStream和ZipOutputStream可分别把数据压缩成GZIP格式和Zip格式
–GZIPInputStream和ZipInputStream可以分别把压缩成GZIP格式或Zip的数据解压缩恢复原状
(2)简单的GZIP压缩格式
lGZIPOutputStream
–父类是DeflaterOutputStream
–可以把数据压缩成GZIP格式
lGZIPInputStream
–父类是InflaterInputStream 

–可以把压缩成GZIP格式的数据解压缩

7、对象序列化
(1)什么是对象序列化
– 保存对象的信息,在需要的时候,再读取这个对象
– serialization 允许你将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。
– serialization不但可以在本机实现,而且可以经由网络操作。这样能自动屏蔽操作系统的差异
用于对象信息存储和读取的输入输出流类:
– ObjectInputStream
– ObjectOutputStream
(2)ObjectInputStream和ObjectOutputStream
–实现对象的读写
通过ObjectOutputStream把对象写入磁盘文件
通过ObjectInputStream把对象读入程序
–不保存对象的transient和static类型的变量
–对象要想实现序列化,其所属的类必须实现Serializable接口
(3)Seriealizable接口
空接口,使类的对象可实现序列化
Serializable 接口的定义
package java.io;
public interface Serializable {
// there's nothing here!
};
实现Serializable接口的语句
public class MyClass implements Serializable {
...
}
使用关键字transient可以阻止对象的某些成员被自动写入文件

猜你喜欢

转载自blog.csdn.net/sinat_38756080/article/details/80232568