1、流概述
流是一组有序的数据序列,可分为输入流和输出流两种。I/O流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。不仅可以使用在文件上,也可以用于键盘、鼠标、显示器等。
输入流
文件--->数据流--->目的地
输出流
源-->数据流--->文件
2、流概述
Java定义了许多类专门复杂各种方式的输入/输出。这些类都放在java.io包中。其中,输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;而所有输出流都是OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。
2.1 输入流
InputStream类是字节输入流的抽象类,是所有字节输入流的父类。InputStream类的具体层次结构。
- InputStream
- AudioInputStream
- ByteArrayInputStream
- StringBufferInputStream
- FileInputStream
- FilterInputStream
- BufferedInputStream
- DataInputStream
- PushbackInputStream
- InputStream
- ObjectInputStream
- SequenceInputStream
- PipedInputStream
该类中所有方法遇到错误时都会触发IOException异常。
- [x] read()方法:从输入流中读取数据的下一个字节。返回0~255范围内的int字节值。如果流已经到达末尾,而没有可用字节,则返回-1
- [x] read(byte[] b):从输入流中读入一定长度的字节,并以整数的形式返回字节数。
- [x] close():关闭此输入流并释放与该流关联的所有系统资源。
Java中的字符时Unicode编码,是双字节的。InputStream是用来处理字节的,并不适合处理字符文本。Java为字符文本的输入提供了一套单独的类Reader。
- Reader
- CharArrayReader
- BufferedReader
- LineNumberReader
- FilterReader
- PushBackReader
- InputStreamReader
- FileReader
- PipedReader
- StringReader
2.2 输出流
OutputStream类是字节输出流的抽象类。
- OutputStream
- ByteArrayOutputStream
- FileOutputStream
- FilterOutputStream
- BufferedOutputStream
- DataOutputStream
- PushbackOutputStream
- OutputStream
- ObjectOutputStream
- SequenceOutputStream
- PipedOutputStream
OutputStream类中的所有方法均返回void,遇到错误时都会触发IOException异常。
- [x] write(int b) 将指定的字节写入此输出流
- [x] write(byte[] b):将b个字节从指定的byte数组写入此输出流
- [x] write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此输出流
- [x] flush():彻底完成输出并清空缓存区
- [x] close():关闭输出流
Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。
- Writer
- CharArrayWriter
- BufferedWriter
- LineNumberWriter
- FilterWriter
- PushBackWriter
- OutputStreamWriter
- FileWriter
- PipedWriter
- PrintWriter
- StringWriter
3、File类
File类是java.io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台物馆的方法来操作文件,可以实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息,如所在目录,文件的长度,以及文件读写权限等。
3.1 文件的创建与删除
使用File类创建一个文件对象,通常使用以下3种构造方法来创建文件对象。
// 1.File(String pathName)
New File(String pathName)
File file = new File("D:\\a.txt");
// 2.File(String parent, String child)
// 该构造方法根据定义的父路径和子路径字符串创建一个新的File对象。
new File(String parent, String child);
String parent = "D:/doc";
String child = "letter.txt";
// 3.File(File f,String child)
// 该构造方法根据parent抽象路径名和子路径字符串创建一个新的File实例
String f = "D:/doc/";
String child = "letter.txt";
public static class {
public static void main(String[] args) {
File file = new File("test.txt");
if(file.exits()) {
file.delete();
}else{
try{
file.createNewFile();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
4、 文件输出/输出流
4.1 FileInputStream与FileOutputStream类
两个类都是用来操作磁盘文件的,该类继承自InputStream,提供了基本的文件写入能力。
FileInputStream类常用构造方法
- FileInputStream(String name);
- FileInputStream(File file); 该方法允许把文件连接输入流之前对文件做进一步操作。
public static class {
public static void main(String[] args) {
File file = new File("test.txt");
try{
// 创建FileOutputStream对象
FileOutputStream out = new FileOutputStream(File);
byte byt[] = "两个类都是用来操作磁盘文件的,该类继承自InputStream,提供了基本的文件写入能力。".getBytes();
out.write(byt);
out.close();
}catch(Exception e){
e.printStackTrace();
}
try{
FileInputStream in = new FileInputStream(file);
byte byt[] = new byte[1024];
int len = in.read(byt);
// 将文件信息输出,但是这个输出new String有问题
System.out.println(new String(byt,0,len));
in.close()
}catch(Exception e){
e.printStackTrace();
}
}
}
4.2 FileReader和FileWriter类
汉字采取上面的字节流读入会产生乱码的问题,所以使用字符流的FileReader和FileWriter类,即可避免该现象。
5.带缓存的输入/输出流
缓存是I/O的一种性能优化,缓存流为I/O流增加了内存缓冲区,有了缓存,使得在流上执行skip(),mark(),和reset()方法成为可能。
5.1 BufferedInputStream和BufferedOutputStream类
BufferedInputStream构造方法
- [x] BufferedInputStream(InputStream in)
- [x] BufferedInputStream(InputStream in, int size)
第一种形式的构造方法创建了一个带有32字节的缓存流;第二个按照指定的大小来创建最优的缓存区大小。
BufferedOutputStream构造方法
- [x] BufferedOutputStream(OutputStream out)
- [x] BufferedOutputStream(OutputStream out,int size)
5.2 BufferedReader和BufferedWriter
以上分别继承了Reader和Writer类
BufferedReader类的常用方法
方法 | 描述 |
---|---|
read() | 读取单个字符 |
readLine() | 读取一个文本行,并将其返回为一个字符串。若无数据,则返回null。 |
BufferedWriter常用方法
方法 | 描述 |
---|---|
write(String s,int off,int len) | 写入字符串的某一部分 |
flush() | 刷新该流的缓存 |
newLine() | 写入一个行分割符 |
在使用BufferedWriter类的Write()方法时,数据并没有立刻被写入值输出流,而是首先进入缓存去中。如果想立刻将缓存区中的数据写入输出流,一定要调用flush()方法。
字符数据--> BufferedWriter--> OutputStreamWriter-->OutputStream --> 文件
package simple.java;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import sun.net.www.content.text.plain;
public class FileTest {
public static void main(String[] args) throws IOException {
String[] array = {"取等","学家尽快","断努力"};
File f = new File("C:\\pox.txt");
try{
FileWriter fileWriter = new FileWriter(f);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
for (int i=0;i