IO流
流的概念
输入输出流
在Java中,将不同类型的输入输出源(键盘、屏幕、文件、网络等)抽象为流,而其中输入或输出的数据称为数据流。数据流分为输入流和输出流。
输入流:将数据从外设或外存(如键盘、鼠标、文件等)传递到应用程序的流称为输入流
输出流:将数据从应用程序传递到外设或外存(如屏幕、打印机、文件等)的流称为输出流
缓冲流
对数据流的每次操作如果都是以字节为单位进行,数据的传输效率会很低,为了提高数据的传输效率,通常使用缓冲流(buffered stream),即为一个流配有一个缓冲区(buffer),这个缓冲区就是专门用于传送数据的一块内存。缓冲区会事先自动地读取数据存入其中,当需要读取数据时,系统可以直接发送缓冲区中的数据。由此可见,缓冲流提高了内存与外部设备之间的数据传输效率
输入输出流类库
按照处理的数据类型不同,输入输出流分为字节流(byte stream)和字符流(character stream)
字节流:基本单位是字节,每次读写8位二进制数,以二进制的原始方式读写,又称为二进制字节流(binary byte stream)或位流(bits stream)
字符流:基本单位是字符,一次读写16位二进制数,并将其作为一个字符而不是二进制位来处理
Java语言的流类都封装在java.io包中,其中有四个基本类:InputStream、OutputStream、及Reader、Writer类(抽象类),用于数据流的输入输出;File是文件类,用于对磁盘文件与文件夹的管理;RandomAccessFile是随机访问文件类,用于实现对磁盘文件的随机读写操作
InputStream和OutputStream流类通常用来处理字节流,通常用来读写诸如图片、音频、视频之类的二进制数据文件
Reader和Writer类通常用来处理字符流,也就是文本文件
注意:因为InputStream、OutputStream、及Reader、Writer类是抽象类,所以通常是根据这些类所派生出来的子类来对文件处理,这些子类与具体的I/O设备相对应
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p79gplum-1613033491731)(D:\课件\科创\截图\IO.png)]
处理字节流的基本类(InputStream&OutputStream)
InputStream流类
当Java程序需要从外设读入数据时,首先应该创建一个适当类型的输入流对象来完成与外设的连接。由于InputStream是抽象类,所以程序中创建的输入流对象一般是InputStream某个子类的对象,通常调用该对象继承的read()方法就可以实现对相应外设的输入操作。
常用方法 | 功能说明 |
---|---|
public int read() | 从输入流中的当前位置读入一个字节(8b)的二进制数据,然后以此数据为低位字节,配上8个全0的高位字节合成一个16位的整型量(0~255)返回给调用此方法的语句,若输入流中的当前位置没有数据,则返回-1 |
public int read(byte[] b) | 从输入流的当前位置连续读入多个字节保存在数组b中,同时返回所读到的字节数 |
public int read(byte[] b,int off,int len) | 从输入流的当前位置连续读入len个字节,从数组b的第off+1个元素位置处开始存放,同时返回所读到的字节数 |
public int available() | 返回输入流中可读取的字节数(可以用来显示文件大小) |
public long skip(long n) | 使位置指针从当前位置向后跳过n个字节 |
public void mark(int readlimit) | 在当前位置处做一个标记,并且在输入流中读取readlimit个字节数后该标记失效 |
public void reset() | 将位置指针返回到标记的位置 |
public void close() | 关闭输入流与外设的连接并释放所占用的系统资源 |
注意:流中的方法都声明抛出异常,所以在程序中调用流方法时必须处理异常,否则连编译都通不过。由于所有的I/O流类都实现了AutoCloseable接口,因此,在使用I/O流进行输入输出操作时,可以使用try-with-resources语句处理异常(只有实现AutoCloseable接口接口的资源才可以使用try-with-resources语句自动关闭打开的资源)
OutputStream流类
当Java程序需要从外设输出数据时,首先应该创建一个适当类型的输出流对象来完成与外设的连接。由于OutputStream是抽象类,所以程序中创建的输出流对象一般是OutputStream某个子类的对象,通常调用该对象继承的write()方法就可以实现对相应外设的输出操作。
常用方法 | 功能说明 |
---|---|
public void write(int b) | 将参数b的低位字节写入到输出流 |
public void write(byte[] b) | 将字节数组b中的全部字节按顺序写入到输出流 |
public void write(byte[] b,int off,int len) | 将字节数组b中的第off+1个元素开始的len个数据,顺序地写入到输出流 |
public void flush() | 强制清空缓冲区并执行向外设写操作 |
public void close() | 关闭输出流与外设的连接并释放所占用的系统资源 |
flush()方法说明:对于缓冲流式输出,write()方法所写的数据并没有直接传到与输出流相连的外设上,而是暂时先存放在流的缓冲区中,等到缓冲区的数据积累到一定的数量,再执行一次向外设的写操作把它们全部写到外设上。这样处理可以降低计算机对外设的读写次数,提高系统效率。但是在某些情况下,缓冲区中的数据不满时就需要将它们写到外设上,此时应使用flash()方法强制清空缓冲区并执行外设的写操作
文件输入输出流
FileInputStream和FileOutputStream分别是InputStream和OutputStream的直接子类,这两个字类主要是负责完成对本地磁盘文件的顺序输入与输出操作的流。FileInputStream类的对象表示一个文件字节输入流,从中可以读取一个字节或一批字节。在生成FileInputStream类的对象时,若指定的文件找不到,则抛出FileNotFoundException异常,该异常必须捕获或声明抛出。FileOutputStream类的对象表示一个文件字节输出流,可以向流中写入一个字节或一批字节。在生成FileOutputStream类的对象时,若指定的文件不存在,则创建一个新的文件,若已存在,则清除原文件的内容。在进行文件的读写操作时会产生IOException异常,该异常必须捕获或声明抛出。
构造方法 | 功能说明 |
---|---|
public FileInputStream(String name) | 以名为name的文件为数据源建立文件输入流 |
public FileInputStream(File file) | 以文件对象file为数据源建立文件输入流 |
public FileInputStream(FileDescriptor fdObj) | 以文件描述符对象fdObj为输入端建立一个文件输入流 |
public FileOutputStream(String name) | 以指定名字的文件为接收端建立文件输出流 |
public FileOutputStream(String name,boolean append) | 以指定名字的文件为接收端建立文件输出流,并指定写入方式,append为true时输出字节被写到文件的末尾 |
public FileOutputStream(File file) | 以文件对象file为接收端建立文件输出流 |
public FileOutputStream(FileDescriptor fdObj) | 以文件描述符对象fdObj为接收端建立一个文件输出流 |
File是在java.io包中定义的一个类,每个File类对象表示一个磁盘文件或文件夹,其对象属性中包含了文件或文件夹的相关信息,如名称、长度、所含文件个数等,调用它的方法可以获取文件或文件夹的有关信息。FileDescriptor是java.io包中定义的一个另一个类,该类不能被实例化,该类中有三个静态成员:in、out和err,分别对应于标准输入流、标准输出流和标准错误流,利用它们可以在标准输入流和标准输出流上建立文件输入输出流,实现键盘输入或屏幕输出操作
顺序输入流
顺序输入流SequenceInputStream是InputStream的直接子类,其功能是将多个输入流顺序连接在一起,形成单一的输入数据流,没有对应的输出数据流存在。在进行输入时,顺序输入流依次打开每个输入流并读取数据,在读取完毕后将该流关闭,然后自动切换到下一个输入流。也就是说,由多个输入流构成的顺序输入流,当从一个流中读取数据遇到EOF(文件结束标志)时,SequenceInputStream将自动转向下一个输入流,直到构成SequenceInputStream类的最后一个输入流读取到EOF时为止
构造方法 | 功能说明 |
---|---|
public SequenceInputStream(Enumeration e) | 创建一个串行输入流,连接枚举对象e中的所有输入流 |
public SequenceInputStream(InputStream s1,InputStream s2) | 创建一个串行输入流,连接输入流s1和s2 |
创建了一个顺序输入流对象之后,就可以调用顺序输入流类提供的方法进行数据输入
常用方法 | 功能说明 |
---|---|
public int available() | 返回流中的可读取的字节数 |
public void close() | 关闭输入流 |
public int read() | 从输入流中读取字节,遇到EOF就转向下一输入流 |
public int read(byte[] b,int off,int len) | 将len个数据读到字节数组b从off开始的位置 |
管道输入输出流
管道字节输入流PipedInputStream和管道字节输出流PipedOutputStream类提供了利用管道方式进行数据输入输出管理的类。管道流用来将一个程序或线程的输出连接到另外一个程序或线程作为输入,使得相连线程能够通过PipedInputStream和PipedOutputStream流进行数据交换,从而可以实现程序内部线程间的通信或不同程序间的通信
PipedInputStream和PipedOutputStream类分别是InputStream和OutputStream类的直接子类。这两个类必须结合使用,其中,管道输入流作为管道的连接端、管道输出流作为管道的发送端,在程序设计中应注意数据的传输方向
PipedInputStream是一个通信管道的接收端,它必须与一个作为发送端的PipedOutputStream对象相连;PipedOutputStream是一个通信管道的发送端,它必须与一个作为接收端的PipedInputStream对象相连。管道输入输出流提供了两种连接方法。
第一种在构造方法中给出对应的管道流,在创建对象时进行连接。其构造方法如下:
- PipedInputStream(PipedOutputStream src),创建一个管道字节输入流,并将其连接到src的管道字节输出流
- PipedOutputStream(PipedInputStream src),创建一个管道字节输出流,并将其连接到src的管道字节出入流
第二种是利用管道字节输入输出流提供的connect()方法进行连接
PipedInputStream类常用方法 | 功能说明 |
---|---|
public int available() | 返回可以读取的字节数 |
public void close() | 关闭管道输入流并释放系统资源 |
public int read() | 从管道输入流中读取下一字节数据 |
public int read(byte[] b,int off,int len) | 从管道输入流读取len字节数据到数组 |
protected void receive(int b) | 从管道中接收1字节数据 |
public void connect(PipedOutputStream src) | 连接到指定输出流,管道输入流将从该输出流接收数据 |
PipedOutputStream类常用方法 | 功能说明 |
---|---|
public void close() | 关闭管道输出流并释放系统资源 |
public void connect(PipedInputStream) | 连接到指定输入流,管道输出流将从该输入流读取数据 |
public void write(int b) | 写指定字节数据到管道输出流 |
public void write(byte[] b,int off,int len) | 从数组off偏移处写len字节数据到管道输出流 |
public void flush() | 刷新输出流并使缓冲区数据全部写出 |
过滤输入输出流
过滤字节输入流类FilterInputStream和过滤字节输出流类FilterOutputStream,分别实现了在数据的读、写操作的同时进行数据处理,它们是InputStream和OutputStream类的直接子类。FilterInputStream和FilterOutputStream也是两个抽象类,它们又分别派生出数据输入流类DataInputStream和数据输出流类DataOutputStream等子类。过滤字节输入输出流的主要特点是,过滤字节输入输出流是建立在基本输入输出流之上,并在输入输出数据的同时能对所传输的数据做指定类型或格式的转换,即可实现对二进制字节数据的理解和编码转换。
创建输入输出流时,应该将其所连接的输入输出流作为参数传递给过滤流的构造方法。
有时按字节为基本单位进行读写处理并不方便,如一个二进制文件中存放有100个整数值,从中读取时,自然希望按int为基本单位(4字节)进行读取,每次读取一个整数值,而不是每次读取1字节。Java语言中按照基本数据类型进行读写的就是DataInputStream类和DataOutputStream类,这两个类的对象是过滤流。将基本字节输入输出流,自动转换成安基本数据类型进行读写的过滤流,然后利用流串接的方式,即将一个流与其他流串联起来,以达到数据转换的目的。
数据输入流类DataInputStream和数据输出流类DataOutputStream分别是过滤字节输入流类FilterInputStream和过滤字节输出流类FilterOutputStream的子类。由于DataInputStream和DataOutputStream分别实现了DataInput和DataOutput两个接口中定义的独立于具体机器的带格式的读写操作,从而实现了对不同类型数据的读写
数据输入输出流的构造方法 | 功能说明 |
---|---|
DataInputStream(InputStream in) | 建立一个新的数据输入流,从指定的输入流in中读数据 |
DataOutputStream(OutputStream out) | 建立一个新的数据输出流,向指定的输出流out写数据 |
由构造方法的形式可以看出,作为过滤流,字节输入流和字节输出流分别作为数据输入流和数据输出流的构造方法的参数,通过这种方式,过滤流与相应的数据流进行连接
DataInputStream类的常用方法 | 功能说明 |
---|---|
public boolean readBoolean() | 从流中读入1字节的boolean值并返回,0为false,非0为true |
public byte readByte() | 从流中读入1字节的byte值并返回 |
public char readChar() | 从流中读入2字节的char值并返回 |
public short readShort() | 从流中读入2字节的short值并返回 |
public int readInt() | 从流中读入4字节的int值并返回 |
public float readFloat() | 从流中读入4字节的float值并返回 |
public long readLong() | 从流中读入8字节的long值并返回 |
public double readDouble() | 从流中读入8字节的double值并返回 |
DataOutputStream类的常用方法 | 功能说明 |
---|---|
public void writeBoolean(boolean v) | 若v的值为true,向流中写入(字节)1,若v的值为false,写入(字节)0 |
public void writeByte(int v) | 向流中写入v的最低1字节,其他字节丢弃 |
public void writeChar(int v) | 向流中写入v的最低2字节,其他字节丢弃 |
public void writeShort(int v) | 向流中写入v的最低2字节,其他字节丢弃 |
public void writeInt(int v) | 向流中写入参数v的4字节 |
public void writeFloat(float v) | 向流中写入参数v的4字节 |
public void writeLong(long v) | 向流中写入参数v的8字节 |
public void writeDouble(double v) | 向流中写入参数v的8字节 |
标准输入输出流
当Java程序与外设进行数据交换时,需要先创建一个输入或输出流的对象,完成与外设的连接。例如,当Java程序读写文件时,需要先创建文件输入或输出流的对象来建立与文件的连接。但是,当程序对标准输入输出设备进行操作时,则不需要如此。
对一般计算机而言,标准输入设备通常指键盘,标准输出设备通常指显示器。为了方便对键盘输入和屏幕输出进行操作,Java系统事先在System类中定义了静态流对象System.in、System.out和System.err。System.in对应于输入流,通常指键盘输入设备;System.out对应于输出流,指显示器等信息输出设备;System.err对应于标准错误输出设备,使得程序的运行错误可以有固定的输出位置,通常该对象对应于显示器。
System.in、System.out、System.err这三个标准的输入与输出流对象定义在java.lang.System类中,与其他类必须在程序中用import语句引入文件中不同,上述三个对象在Java源程序编译时被自动装载。
- 标准输入:Java语言的标准输入System.in是BufferedInputStream类的对象,当程序需要从键盘上读入数据时,只需调用System.in的read()方法即可,该方法从键盘缓冲区读入一个字节的二进制数据,返回以此字节为低位字节,高位字节为0的整型数据。需要说明的是,System.in.read()语句应包含在try块中,且try块后面要有一个接收IOException异常的catch块。
- 标准输出:Java语言的标准输出System.out是打印输出流PrintStream类的对象。PrintStream类是过滤字节输入流FilterOutputStream的一个子类,其中定义了向屏幕输送不同类型数据的方法print()和println()。这两个方法的区别是前者输出数据后不换行,后者换行。System.out对应的输出流通常指显示器、打印机或磁盘文件等信息输出设备。
- 标准错误输出:标准错误输出System.err用于为用户显示错误信息。也是由PrintStream类派生的错误流。err流的作用是使用方法print()或println()将信息输出到err流并显示在屏幕上,以方便用户使用和调试程序。err也使用与out同样的方法,如“System.out.println(“这是一个错误”);”。但err与标准输出out不同的是,err会立即显示指定的(错误)信息让用户知道,即使指定程序将结果重新定位到文件,err输出的信息也不会被重新定位,而仍会显示在设备上。
处理字符流的基本类(Reader&Writer)
由于Reader和Writer均是抽象类,所以并不能直接使用这两个类,,而是使用它们的子类来创建对象,再利用对象来处理读写操作。
Reader类的常用方法 | 功能说明 |
---|---|
public int read() | 从输入流中读一个字符 |
public int read(char[] cbuf) | 从输入流中读最多cbuf.length个字符,存入字符数组cbuf中 |
public int read(char[] cubffer,int off,int len) | 从输入流中读最多len个字符,存入字符数组cbuffer中从off开始的位置 |
public long skip(long n) | 从输入流中最多向后跳n个字符 |
public boolean ready() | 判断流是否做好读的准备 |
public void mark(int readAheadLimit) | 标记输入流的当前位置 |
public boolean markSupported() | 测试输入流是否支持mark |
public void reset() | 重定位输入流 |
public void close() | 关闭输入流 |
Writer类的常用方法 | 功能说明 |
---|---|
public void write(int c) | 将单一字符c输出到流中 |
public void write(String str) | 将字符串str输出到流中 |
public void write(char[] cbuf) | 将字符数组cbuf输出到流中 |
public void write(char[] cbuf,int off,int len) | 将字符数组按指定的格式输出(off表示索引,len表示写入的字符数量)到流中 |
public void flush() | 将缓冲区中的数据写到文件中 |
public void close() | 关闭输出流 |
使用FileReader类读取文件
文件字符输入流类FileReader是继承自InputStreamReader类,而InputStreamReader类又继承自Reader类,因此Reader类与InputStreamReader类所提供的方法均可供FileReader类所创建的对象使用。
在使用FileReader类读取文件时,必须先调用FileReader()构造方法创建FileReader类的对象,再利用它来调用read()方法,FileReader类的构造方法如下。
构造方法 | 功能说明 |
---|---|
public FileReader(String name) | 根据所给文件名称创建一个可读取的输入流对象 |
注意:Java把每个汉字和英文字母均作为一个字符对待,但把Enter键生成的回车换行符"\r\n"作为两个字符。
使用FileWriter类写入文件
文件字符输出流类FileWriter是继承自OutputStreamWriter类,而OutputStreamWriter类又继承自Writer类,因此Writer类与OutputStreamWriter类所提供的方法均可供FileWriter类所创建的对象使用。
要使用FileWriter类将数据写入文件时,必须先调用FileWriter()构造方法创建FileWriter类对象,再利用它来调用write()方法,FileWriter类的构造方法如下。
构造方法 | 功能说明 |
---|---|
public FileWriter(String filename) | 根据所给文件名称创建一个可供写入字符数据的输出流对象,原先的文件会被覆盖 |
public FileWriter(String filename,boolean a) | 同上,但如果a设置为true,则会将数据追加在原先文件的后面 |
使用BufferedReader类读取文件
缓冲字符输入流类BufferedReader继承自Reader类,BufferedReader类是用来读取缓冲区里的数据。使用BufferedReader类来读取缓冲区中的数据之前,必须先创建FileReader类对象,再以该对象为参数来创建BufferedReader类的对象,然后才可以利用此对象来读取缓冲区中的数据。
BufferedReader类的构造方法 | 功能说明 |
---|---|
public BufferedReader(Reader in) | 创建缓冲区字符输入流 |
public BufferedReader(Reader in,int size) | 创建缓冲区字符输入流,并设置缓冲区大小 |
BufferedReader类的常用方法 | 功能说明 |
---|---|
public int read() | 读取单一字符 |
public int read(char[] cbuf) | 从流中读取字符并写入到字符数组cbuf中 |
public int read(char[] cbuf,int off,int len) | 从流中读取字符并写入到字符数组cbuf中(off表示数组下标,len表示读取的字符数) |
public long skip(long n) | 跳过n个字符不读取 |
public String readLine() | 读取一行字符串 |
public void close() | 关闭流 |
使用BufferedWriter类写入文件
缓冲字符输出流类BufferedWriter继承自Writer类,BufferedWriter类是用来将数据写入到缓冲区中。使用BufferedWriter类将数据写入缓冲区的过程与使用BufferedReader类从缓冲区中读出数据的过程相似。首先必须先创建FileWriter类对象,再以该对象为参数来创建BufferedWriter类的对象,然后才可以利用此对象来将数据写入缓冲区中。所不同的是,缓冲区内的数据最后必须要用flush()方法将缓冲区清空,也就是将缓冲区中的数据全部写到文件内。
BufferedWriter类的构造方法 | 功能说明 |
---|---|
public BufferedWriter(Writer out) | 创建缓冲区字符输出流 |
public BufferedWriter(Writer out,int size) | 创建缓冲区字符输出流,并设置缓冲区大小 |
BufferedWriter类的常用方法 | 功能说明 |
---|---|
public void write(int c) | 将单一字符写入缓冲区中 |
public void write(char[] cbuf,int off,int len) | 将字符数组cbuf按指定的格式写入到输出缓冲区中(off表示数组下标,len表示读取的字符数) |
public void write(String str,int off,int len) | 写入字符串(off表示数组下标,len表示读取的字符数) |
public void newLine() | 写入回车换行字符 |
public void flush() | 将缓冲区中的数据写到文件中 |
public void close() | 关闭流 |
文件的处理与随机访问
计算机程序运行时,数据都保存在系统的内存中,由于关机时内存中的数据全部丢失,所以必须把那些需要长期保存的数据存放在磁盘文件里,需要时再从文件里读取。因此,文件输入输出操作是程序必备的功能。
Java语言对文件与文件夹的管理
Java语言不仅支持文件管理,还支持文件夹管理。在java.io包中定义了一个File类专门用来管理磁盘文件和文件夹,而不负责数据的输入输出。
每个File类对象表示一个磁盘文件或文件夹,其对象属性中包含了文件或文件夹的相关信息,如文件名、长度、所含文件个数等,调用它的方法可以完成对文件或文件夹的管理操作,如创建、删除等。
1.创建File类对象
因为每个File类对象对应系统的一个磁盘文件或文件夹,所以创建File类对象需要给出它所对应的文件名或文件夹名。File类有三个构造方法,分别以不同的参数形式接收文件和文件夹名信息。
File类的构造方法 | 功能说明 |
---|---|
public File(String path) | 用path参数创建File对象所对应的磁盘文件名或文件夹名及其路径 |
public File(String path,String name) | 以path为路径,以name为文件或文件夹名创建File对象 |
public File(File dir,String name) | 用一个已经存在代表某磁盘文件夹的File对象dir作为文件夹,以name作为文件或文件夹名来创建File对象 |
使用File类的构造方法时,要注意以下几点:
-
path参数可以是绝对路径,如"d:\java\myfile\sample.java",也可以是相对路径,如"myfile\sample.java",path参数还可以是磁盘上的某个文件夹。
-
由于不同的操作系统使用的文件夹分隔符不同,如Windows操作系统使用反斜线"\",UNIX操作系统使用正斜线"/"。为了使Java程序能在不同的平台上运行,可以利用File类的一个静态变量File.separator。该属性中保存了当前系统规定的文件夹分隔符,使用它可以组合成在不同操作系统下都通用的路径。例如:
“d:”+File.separator+“java”+File.separator+“myfile”
2.获取文件或文件夹属性
一个File对象一经创建,就可以通过调用它的方法来获得其所对应的文件或文件夹的属性,其中较常用的方法如下所示。
常用方法 | 功能说明 |
---|---|
public boolean exists() | 判断文件或文件夹是否存在 |
public boolean isFile() | 判断对象是否代表有效文件 |
public boolean isDirectory() | 判断对象是否代表有效文件夹 |
public String getName() | 返回文件名或文件夹名 |
public String getPath() | 返回文件或文件夹的路径 |
public long length() | 返回文件的字节数 |
public boolean canRead() | 判断文件是否可读 |
public boolean canWrite() | 判断文件是否可写 |
public String[] list() | 将文件夹中所有文件名保存在字符数组中返回 |
public boolean equals(File f) | 比较两个文件或文件夹是否相同 |
3.文件或文件夹操作
File类中还定义了一些对文件或文件夹进行管理、操作的方法。
常用方法 | 功能说明 |
---|---|
public boolean renameTo(File newFile) | 将文件重命名成newFlie对应的文件名 |
public boolean delete() | 将当前文件删除,若删除成功返回true,否则返回false |
public boolean mkdir() | 创建当前文件夹的子文件夹,若成功返回true,否则返回false |
对文件的随机访问
前面介绍的流类实现的是对磁盘文件的顺序读写,而且读和写要分别创建不同对象。Java语言中还定义了一个功能更强大、使用更方便的随机访问文件类RandomAccessFile,它可以实现对文件的随机读写。
随机访问文件类RandomAccessFile也是在java.io包中定义的。RandomAccessFile是有关文件处理中功能齐全、文件访问众多的类。RandomAccessFile类用于进行随意位置、任意类型的文件访问,并且在文件的读取方式中支持文件的任意读取而不只是顺序读取。RandomAccessFile类有两个构造方法用于创建RandomAccessFile类对象。
RandomAccessFile类的构造方法 | 功能说明 |
---|---|
public RandomAccessFile(String name,String mode) | 以name来指定随机文件流对象所对应的文件名,以mode表示对文件的访问模式 |
public RandomAccessFile(File file,String mode) | 以file来指定随机文件流对象所对应的文件名,以mode表示对文件的访问模式 |
说明:访问模式mode表示所创建的随机读写文件的操作状态。mode的取值如下
- r:表示以只读方式打开文件。
- rw:表示以读写方式打开文件。使用该模式只用一个对象就可以同时实现读和写两种操作。
RandomAccessFile类中定义了许多用于文件读写操作的方法
常用读取方法 | 功能说明 |
---|---|
public void close() | 关闭随机访问文件流并释放系统资源 |
public final FileDescriptorgetFD() | 获取文件描述符 |
public long getFilePointer() | 返回文件指针的当前位置 |
public long length() | 返回文件长度 |
public int skipBytes(int n) | 跳过输入流中n个字符,并返回跳过实际的字节数 |
public int read() | 从文件输入流中读取一个字节的数据 |
public int read(byte[] b,int off,int len) | 从文件输入流的当前指针位置开始读取长度为len字节的数据存放到字节数组b中,存放的偏移位置为off。若遇文件结束符,则返回值为-1 |
public final void readFully(byte[] b) | 从文件输入流的当前指针位置开始读取b.length字节的数据存放到字节数组b中。若遇文件结束符,则抛出EOFException类异常 |
public final void readFully(byte[] b,int off,int len) | 从文件输入流的当前指针位置开始读取长度为len字节的数据存放到字节数组b中,存放的偏移位置为off。若遇文件结束符,则抛出EOFException类异常 |
public final boolean readBoolean() | 读取文件中的逻辑值 |
public final byte readByte() | 从文件中读取带符号的字节值 |
public final char readChar() | 从文件中读取一个Unicode字符 |
public final String readLine() | 从文本文件中读取一行 |
public void seek(long pos) | 设置文件指针位置 |
常用写入方法 | 功能说明 |
---|---|
public void write(int b) | 在文件指针的当前位置写入一个int型数据b |
public void writeBoolean(boolean v) | 在文件指针的当前位置写入一个boolean型数据v |
public void writeByte(int v) | 在文件指针的当前位置写入一个字节值,只写v的最低1字节,其他字节丢弃 |
public void writeBytes(String s) | 以字节形式写一个字符串到文件 |
public void writeChar(int v) | 在文件指针的当前位置写入v的最低2字节,其他丢弃 |
public void writeChars(String s) | 以字符形式写一个字符串到文件 |
public void writeDouble(double v) | 在文件当前指针位置写入8字节数据v |
public void writeFloat(float v) | 在文件当前指针位置写入4字节数据v |
public void writeInt(int v) | 把整型数作为4字节写入文件 |
public void writeLong(long v) | 把长整型数作为8字节写入文件 |
public void writeShort(int v) | 在文件指针的当前位置写入2字节,只写v的最低2字节,其他字节丢弃 |
public void writeUTF(String str) | 作为UTF格式向文件写入一个字符串 |
使用随机文件读写时,在创建了一个随机文件对象之后,该文件即处于打开状态。此时,文件的指针处于文件开始位置,可以通过seek(long pos)方法设置文件指针的当前位置,进行文件的快速定位。而后通RandomAccessFile类中的相应read()和write()方法,完成对文件的读写操作。
在对文件的读写操作完成之后,调用RandomAccessFile类的close()方法关闭文件。
本章小结
- Java语言是以流的方式来处理输入输出的,其好处是:无论是什么形式的输入输出,只要针对流做处理就可以了。
- Java语言中的流是由字符或位组合而成的,可以通过它来读写数据,甚至可以通过它连接数据源,并可以将数据以字符或位组合的形式保存。
- 以数据的读取或写入而言,流可以分为输入流与输出流两种。
- 可以通过InputStream、OutputStream、Reader和Writer类来处理流的输入输出。
- InputStream与OutputStream类及其子类既可用于处理二进制文件也可用于处理文本文件,但主要以处理二进制位流的字节文件为主。
- Reader与Writer类是用来处理文本文件的读取和写入操作,通常是以它们的派生类来创建实体对象,再利用它们来处理文本文件读写操作。
- BufferedWriter类中的newLine()方法可写入回车换行字符,而且与操作系统无关,使用它可以确保程序可跨平台运行。
- 文件流类File的对象对应系统的磁盘文件或文件夹。
- 随机访问文件类RandomAccessFile,可以实现对文件的随机读写。
- 在关闭流对象时,若流对象是在try语句块之前定义的,则流对象的关闭最好是放在finally语句块中;若流对象是在try语句块中定义的,那么关闭流对象的语句可以放在try语句块的最后。
课后习题
- 利用基本输入输出流实现从键盘上读入一个字符,然后显示在屏幕上。
- 利用文件输出流创建一个文件file1.txt,写入字符"文件已被成功创建!",然后用记事本打开该文件,看一下是否正确写入。
- 利用文件输入流打开第2题中创建的文件file1.txt,读出其内容并显示在屏幕上
- 利用文件输入输出流打开第2题中创建的文件file1.txt,然后在文件的末尾追加一行字符串"又添加了一行文字!"。
- 产生15个20~9999的随机整数,然后利用BufferedWriter类将其写入文件file2.txt中之后再读取该文件中的数据并将它们按升序排列。