第10章 输入与输出流
10.1 File类
public StringgetName():获取文件的名字。
publicboolean canRead():判断文件是否为可读的。
publicboolean canWrite():判断文件是否可被写人。
publicboolean exists():判断文件是否存在。
public long length():获取文件的长度(单位是字节)。
public StringgetAbsolutePath():获取文件的绝对路径
public StringgetParent():获取文件的父目录。
publicboolean isFile():判断文件是否为一个普通文件,而不是目录。
publicboolean isDirectory():判断文件是否为一个目录。
publicboolean isHidden():判断文件是否为隐藏文件。
public longlastModified():获取文件最后修改的时间(时间是从1970年午夜至文件最后修改时刻的毫秒数)。
创建File对象本身一般不会发生异常,它只是对文件或目录路径进行抽象表示,不涉及实际的文件系统操作(如读写等可能引发异常的操作 )
10.2 文件字节输入流
FileInputStream是字节流,用于按字节读取文件内容
FileInputStream的read()方法:从输入流中读取一个字节的数据,返回值为读取到的字节数据(0 - 255 范围),若到达流末尾返回 -1 。它操作的是字节
10.3 文件字节输出流
FileReader按字符读取文件
10.4 文件字符输入和输出流
FileReader是字符流,主要用于按字符读取文本文件
FileReader的read()方法:从输入流中读取一个字符的数据,返回值为读取到的字符(Unicode 码值),若到达流末尾返回 -1 。它操作的是字符,内部会涉及字节到字符的解码转换
10.5 缓冲流
BufferedReader是用于缓冲读取字符的流,它不能直接指向字节流FileInputStream。需要通过InputStreamReader将FileInputStream转换为字符流后,才能作为参数传递给BufferedReader构造方法
BufferedWriter是字符缓冲输出流,FileWriter是用于写入字符到文件的流。可以通过BufferedWriter bw = new BufferedWriter(new FileWriter("文件路径"))的方式,让BufferedWriter指向FileWriter流,起到缓冲写入的作用
10.6 随机流
RandomAccessFile流指向文件只是建立了对文件的操作连接,并不会自动刷新文件。刷新操作一般是针对输出流中缓冲数据写入到文件等存储介质而言,RandomAccessFile本身指向文件时无此行为
10.7 数组流
10.8 数据流
向文件尾追加数据,需要使用FileOutputStream的追加模式。FileOutputStream有两个常用构造方法:
FileOutputStream(String name) :创建一个向指定文件写入数据的输出流,如果文件存在,会覆盖原有内容。
FileOutputStream(String name, boolean append) :当第二个参数append为true时,表示追加模式,即向文件尾追加数据;为false时(默认情况),表示覆盖模式 。
10.9 对象流
使用对象流写入或读入对象时,要保证对象是序列化的。
被序列化的类必须实现Serializable接口,否则会抛出NotSerializableException异常。
静态变量和用transient修饰的变量不会被序列化。反序列化时,类的结构和序列化时需保持一致(如类名、字段等),否则可能出现InvalidClassException等问题 。
注意对象引用的顺序和完整性,避免出现StreamCorruptedException等异常。
使用对象流很容易得获取一个序列化对象的克隆,只需将该对象写入到对象输出流,那么用对象输入流读回的对象一定是原对象的一个克隆。
要克隆对象,可利用对象序列化和反序列化机制。先将对象通过ObjectOutputStream写入字节数组输出流(或其他输出流),再通过ObjectInputStream从对应的输入流中读取,从而得到一个克隆对象。需确保对象所属类实现Serializable接口。