I/O流
一、流的概念
流是一组有序的数据序列,将数据从一个地方带到另一个地方。
1、什么是输入/输出流
输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出则正好相反,是将数据写入到各种输出设备。
数据流是Java进行I/O操作的对象,它按照不同的标准可以分为不同的类别:
- 按照流的方向主要为输入流和输出流两大类。
- 数据流按照数据单位的不同分为字节流和字符流。
- 按照功能可以划分为节点流和处理流。
2、输入流
Java流相关的类都封装在java.io包中,每个数据流都是一个对象。
所有的输入流类都是InputStream抽象类(字节输入流)和Reader抽象类(字符输入流)的子类。InputStream类是字节输入流是字节输入流的父类。
InputStream 类中常用的方法:
Int read():从输入流读入一个8字节的数据,将它转换成一个0-255的整数,返回一个整数,遇到输入流结尾返回-1。
Int read(byte[]b): 从输入流读取若干字节的数据保存到参数 b 指定的字节数组中,遇到结尾返回-1.
Int read(byte[]b,int off,int len): 返回的是实际读取的字节数.遇结尾返回-1.
Void close():关闭数据流,完成操作后需关闭数据流。
Void reset():使输入流重新定位到刚才被标记的位置,这样可以重新读取标记过的数据。
3、输出流
Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。
OutputStream更数据输出有关的方法:
int write(b):将指定字节的数据写入到输出流
int write(byte[]b):将指定字节数组的内容写入输出流。
int write(byte[]b,int off,int len):将指定字节数组从off位置开始的len字节的内容写入输出流。
flush():刷新输出流,强行将缓冲区的内容写入输出流。
二、系统流
Sytem 类封装了 Java 程序运行时的 3 个系统流,分别为:
System.in:标准输入流,默认设备为键盘
System.out:标准输出流,默认设备为控制台
System.err:标准错误流,默认设备为控制台
以上变量的作用域为 public 和 static
三、File类(文件操作类)
1、File类简介
File 类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流
File类提供了如下三种构造方法:
File(String path):如果path是实际存在的路径,则该 File 对象表示的是目录;如果 path 是文件名,则该File对象表示的是文件。
File(String path,String name):path是路径名,name是文件名。
File(File dir,String name):dir是路径对象,name是文件名
File类的常用的方法:
boolean canRead():测试应用程序是否能从指定的文件中进行读取;
boolean canWrite():测试应用程序是否能写当前文件;
boolean delete():删除当前对象指定的文件;
boolean exists():测试当前File是否存在;
String getAbsolutePath():返回由该对象表示的文件的绝对路径名;
String getName():返回表示当前对象的文件名或路径名(如果是路径,则返回最后一级子路径名);
String getParent():返回当前 File 对象所对应目录(最后一级子目录)的父目录名;
long length():返回当前File对象表示的文件长度;
String[]list():返回当前File对象指定的路径文件列表;
Boolean mkdir():创建一个目录,它的路径名由当前File对象指定;
Boolean mkdirs():创建一个目录(可同时创建多个),它的路径名由当前File对象指定;
2、获取文件属性
获取文件属性信息的第一步是先创建一个 File 类对象并指向一个已存在的文件。
3、创建和删除文件
创建文件需要调用createNewFile()方法。删除需调用delete()方法。
无论是创建还是删除文件都要先调用exists()方法判断文件是否存在。
4、创建和删除目录
创建目录需调用mkdir()方法,删除目录需要调用delete()方法,同样也需要调用exists()方法来判断目录是否存在。
5、遍历目录
有两种重载形式:
- String[] list():该方法表示返回由 File 对象表示目录中所有文件和子目录名称组成的字符串数组,如果调用的 File 对象不是目录,则返回 null;
- String[] list(FilenameFilter filter):作用与list()方法相同,不同之处在于返回数组中仅包含符合filter过滤器的文件的目录,如filter为null,则表示接受所有名称。
四、RandomAccessFile类
1、动态读取文件内容
动态读取是指从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾。需用到RandomAccessFile类。
该类提供了如下常用的读取和写入数据的方法:
boolean readBoolean():从文件中读取一个boolean值
byte readByte():从文件中读取一个带符号的字节
char\int\long与上类似;
String readLine():从文件中读取下一行文本
void writeByte(int v):以单字节的形式向文件中写入一个 byte 值
void writeChar(int v):以双字节的形式向文件中写入一个 char 值
void writelnt(int v):以4字节的形式向文件中写入一个整数
writeLong(long v):以8字节的形式向文件中写入一个 long 值
void skipBytes(int n):以当前文件指针位置为起始点,跳过 n 字节
RandomAccessFile类的两种重载形式:
1、RandomAccessFile(File file, String mode):访问参数 file 指定的文件,访问形式由参数 mode 指定,mode 参数有两个常用的可选值 r 和 rw,其中 r 表示只读,rw 表示读写。
2、RandomAccessFile(String name, String mode):访问参数 name 指定的文件,mode 参数的含义同上。
五、字节流的使用
InputStream是Java所有字节输入流类的父类,OutputStream是所有字节输出流类的父类,它们都是抽象类
1、字节输入流
InputStream类的子类:
ByteArrayInputStream 类:将字节数组转换为字节输入流,从中读取字节。
FileInputStream 类:从文件中读取数据
2、字节输出流
OutputStream类常用的子类:
ByteArrayOutputStream 类:向内存缓冲区的字节数组中写数据。
FileOutputStream 类:向文件中写数据。
PipedOutputStream 类:连接到一个 PipedlntputStream(管道输入流)
3、字节数组输入流
ByteArrayInputStream 类:可以从字节数组中读取数据,该类的重载形式有:
1、ByteArrayInputStream(byte[] buf):创建一个字节数组输入流,字节数组类型的数据源由参数 buf 指定。
2、ByteArrayInputStream(byte[] buf,int offse,int length):创建一个字节数组输入流,其中,参数 buf 指定字节数组类型的数据源,offset 指定在数组中开始读取数据的起始下标位置,length 指定读取的元素个数。
4、字节数组输出流
ByteArrayOutputStream 类:可以向内存的字节数组中写入数据,该类的构造方法有两种重载形式:
1、ByteArrayOutputStream():创建一个字节数组输出流,输出流缓冲区的初始容量大小为 32 字节。
2、ByteArrayOutputStream(int size):创建一个字节数组输出流,输出流缓冲区的初始容量大小由参数 size 指定。
六、字符流的使用
1、字符输入流
Reader类是所有字符流输入类的父类,其常用子类有:
CharArrayReader 类:将字符数组转换为字符输入流,从中读取字符。
StringReader 类:将字符串转换为字符输入流,从中读取字符。
BufferedReader 类:为其他字符输入流提供读缓冲区。
InputStreamReader
- InputStreamReader是从字节流到字符流的桥梁:它读取字节,并使用指定的charset将其解码为字符。它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
每个调用InputStreamReader的read()方法之一可能会导致从底层字节输入流读取一个或多个字节。为了使字节有效地转换为字符,可以从底层流读取比满足当前读取操作所需的更多字节。
方法:
String getEncoding():返回此流使用的字符编码的名称
int read()读一个字符
int read(char[] cbuf,int offset,int length):将字符读入数组的一部分。
readLine读取一整行。
BufferedReader:按行读取内容
BufferedInputStream为另一个输入流添加了功能,即缓冲输入并支持mark和reset方法的功能。创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。mark操作会记住输入流中的一个点,并且reset操作会导致从最近的mark操作读取的所有字节在从包含的输入流中取出新字节之前重新读取。
BufferedInputStream的构造方法:
构造方法摘要
构造方法
Constructor | 描述 |
BufferedInputStream(InputStream in) | 创建一个 BufferedInputStream并保存其参数,输入流 in供以后使用。 |
BufferedInputStream(InputStream in, int size) | 创建具有指定缓冲区大小的 BufferedInputStream ,并保存其参数,输入流 in供以后使用。 |
2、字符输出流
Writer类是所有字符输出流的父类,该类常用的子类有:
CharArrayWriter 类:向内存缓冲区的字符数组写数据。
StringWriter 类:向内存缓冲区的字符串(StringBuffer)写数据。
BufferedWriter 类:为其他字符输出流提供写缓冲区。
3、字符文件输入流
用来读取字符文件的类:FileReader。该类有如下的重载形式:
1、FileReader(File file):在给定要读取数据的文件的情况下创建一个新的 FileReader 对象。其中,file 表示要从中读取数据的文件。
2、FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新 FileReader 对象。其中,fileName 表示要从中读取数据的文件的名称,表示的是一个文件的完整路径。
4、字符文件输出流
Java 提供了写入字符文件的类:FileWriter,构造方法的重载形式有:
1、FileWriter(File file):在指定 File 对象的情况下构造一个 FileWriter 对象。其中,file 表示要写入数据的 File 对象。
2、FileWriter(File file,boolean append):在指定 File 对象的情况下构造一个 FileWriter 对象,如果 append 的值为 true,则将字节写入文件末尾,而不是写入文件开始处。
3、FileWriter(String fileName):在指定文件名的情况下构造一个 FileWriter 对象。其中,fileName 表示要写入字符的文件名,表示的是完整路径。
4、FileWriter(String fileName,boolean append):在指定文件名以及要写入文件的位置的情况下构造 FileWriter 对象。其中,append 是一个 boolean 值,如果为 true,则将数据写入文件末尾,而不是文件开始处。