第十章
主要内容
-
File类
- File对象主要用来获取文件本身的一些信息,不涉及对文件的读写操作。
- 创建一个File对象的构造方法有3个:
File(String filename); File(String directoryPath,String filename); File(File f, String filename);
-
文件字节输入、输出流
java.io
包提供了大量的流类,Java
把InputStream
抽象类的子类创建的流对象称作字节输入流;OutputStream
抽象类的子类创建的流对象称作字节输出流
Java
把Reader
抽象类的子类创建的流对象称作字符输入流;Writer
抽象类的子类创建的流对象称作字符输出流。
- 针对不同的源或目的地。
java.io
包为程序提供了相应的输入流或输出流。 - 这些输入、输出流绝大部分都是
InputStream
、OutputStream
、Reader
或Writer
的子类。
-
文件字符输入、输出流
- Reader类提供的read方法以字符为单位顺序地读取源中的数据。
int read(): int read(char b[]): int read(char b[], int off, int len): void close(): long skip(long numBytes):
- Writer流以字符为单位顺序地写文件,每次调用write方法就顺序地向目的地写入内容。 Writer类有如下常用的方法。
void write(int n): 向输出流写入一个字符。 void write(byte b[]): 向输出流写入一个字符数组。 void write(byte b[],int off,int length): 从给定字符数组中起始于偏移量off处取len个字符写到输出流。 void close(): 关闭输出流。
- Reader类提供的read方法以字符为单位顺序地读取源中的数据。
-
缓冲流
- BufferedReader和BufferedWriter类创建的对象称作缓冲输入、输出流。二者的源和目的地必须是字符输入流和字符输出流。
- 构造方法:
BufferedReader(Reader in); BufferedWriter (Writer out);
- BufferedReader和BufferedWriter类读写文件的方法:
readLine() 读取文本行 write(String s,int off,int len) 把字符串s写到文件中 newLine(); 向文件写入一个回行符
-
随机流
- 使用RandomAccessFile类来创建一个随机访问文件流。RandomAccessFile类创建的流的指向既可以作为源也可以作为目的地。
- 构造方法:
RandomAccessFile(String name,String mode) ; RandomAccessFile(File file,String mode) ;
- 相关方法:
seek(long a) 定位RandomAccessFile流的读写位置 getFilePointer() 获取流的当前读写位置
-
数组流
- 字节数组流
- 字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字节数组作为流的源和目标。
- ByteArrayInputStream构造方法及常用方法
ByteArrayInputStream(byte[] buf); ByteArrayInputStream(byte[] buf,int offset,int length); public int read();顺序地从源中读出一个字节 public int read(byte[] b,int off,int len);顺序地从源中读出参数len指定的字节数 ByteArrayOutputStream流构造方法及常用方法 ByteArrayOutputStream(); ByteArrayOutputStream(int size); public void write(int b); 顺序地向缓冲区写入一个字节 public void write(byte[] b,int off,int len); 将参数b中指定的len个字节顺序地写入缓冲区 public byte[] toByteArray(); 返回输出流写入到缓冲区的全部字节
- 字符数组
- CharArrayReader和CharArrayWriter类是字符数组流,使用字符数组作为流的源和目标。例子10 向内存(输出流的缓冲区)写入字符串 。
- 字节数组流
-
数据流
- DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流。
- 构造方法:
DataInputStream(InputStream in)创建的数据输入流指向一个由参数in指定的底层输入流 DataOutputStream(OutnputStream out)创建的数据输出流指向一个由参数out指定的底层输出流
-
对象流
- ObjectInputStream和ObjectOutputStream类创建的对象称为对象输入流和对象输出流。
- 它的构造方法是:
ObjectInputStream(InputStream in) ObjectOutputStream(OutputStream out)
- 相关方法:
writeObject(Object obj) 将一个对象obj写入到一个文件 readObject() 读取一个对象到程序中
- 所谓序列化:一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。
-
序列化与对象可隆
- 如果一个“复制品”实体的变化不会引起原对象实体发生变化,反之亦然。这样的复制品称为原对象的一个克隆对象或简称克隆。
- 一个对象调用clone()方法就可以获取该对象的克隆对象。
对象输入流通过对象的序列化信息来得到当前对象的一个克隆。
-
使用Scanner解析文件
- 使用Scanner类和正则表达式来解析文件。
- 使用默认分隔标记解析文件
- 创建Scanner对象,并指向要解析的文件,例如:
File file = new File("hello.java"); Scanner sc = new Scanner(file); sc将空白作为分隔标记
- 创建Scanner对象,并指向要解析的文件,例如:
- 使用默认分隔标记解析文件
- 使用正则表达式作为分隔标记解析文件 :
- 创建Scanner对象,指向要解析的文件,并使用useDelimiter方法指定正则表达式作为分隔标记,
- 使用Scanner类和正则表达式来解析文件。
-
文件锁
- FileLock、FileChannel类处理Java提供的文件锁功能。它们分别在java.nio和java.nio.channels包中。
- 输入、输出流读写文件时可以使用文件锁。
- RondomAccessFile创建的流在读写文件时使用文件锁的步骤如下:
- 先使用RondomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw,例如:
RandomAccessFile input=new RandomAccessFile("Example.java","rw");
- input流调用方法getChannel()获得一个连接到地层文件的FileChannel对象(信道),例如
FileChannel channel=input.getChannel();
- 信道调用tryLock()或lock()方法获得一个FileLock(文件锁)对象,这一过程也称作对文件加锁.
例如:FileLock lock=channel.tryLock();
- 先使用RondomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw,例如:
重点和难点
-
重点:通过文件流读写数据,各种数据流的区别。掌握流的连接思想。
-
难点:流的连接思想及各种数据流的使用。
总结
-
掌握File类及各种方法的使用。
-
File对象主要用来获取文件本身的一些信息,不涉及对文件的读写操作。
-
创建一个File对象的构造方法有3个:
File(String filename); File(String directoryPath,String filename); File(File f, String filename);
-
File的各种方法
public String getName() //获取文件的名字。 public boolean canRead() //判断文件是否是可读的。 public boolean canWrite() //判断文件是否可被写入。 public boolean exits() //判断文件是否存在。 public long length() //获取文件的长度(单位是字节)。 public String getAbsolutePath() //获取文件的绝对路径。 public String getParent() //获取文件的父目录。 public boolean isFile() //判断文件是否是一个普通文件,而不是目录。 public boolean isDirectroy() //判断文件是否是一个目录。 public boolean isHidden() //判断文件是否是隐藏文件。 public long lastModified() //获取文件最后修改的时间。
-
-
InputStream
的子类创建的对象称为字节输入流,字节输入流按字节
读取源的数据。 -
OutputStream
的子类创建的对象称为字节输出流。字节输出流按字节
将数据写入输出流指向的目的地。 -
Reader
的子类创建的对象称为字符输入流,字符输入流按字符
读取源中的数据。 -
Writer
的子类创建的对象称为字符输出流。字符输出流按字符
将数据写入输出流指向的目的地。 -
使用对象流写入或读入对象时,要保证对象是序列化的。