字节流以字节为单位,用来读取8位的数据,除了能够处理纯文本之外,还能用来处理二进制文件的数据。
InputStream类和OutputStream类是所有字节流的父类。
InputStream类
面向字节的输入流都是InputStream类的子类,其类的结构层次如图:
类名 | 功能描述 |
---|---|
FileInputStream | 从文件中读取的输入流 |
PipedInputStream | 输入管道 |
FilterInputStream | 过滤输入流 |
ByteArrayInputStream | 从字节数组读取的输入流 |
SequenceInputStream | 两个或多个输入流的联合输入流,按顺序读取 |
ObjectInputStream | 对象的输入流 |
LineNumberInputStream | 为文本文件输入流附加行号 |
DataInputStream | 包含读取 Java 标准数据类型方法的输入流 |
BufferedInputStream | 缓冲输入流 |
PushbackInputStream | 返回一个字节并把此字节放回输入流 |
OutputStream类
类名 | 功能描述 |
---|---|
FileOutputStream | 写入文件的输出流 |
PipedOutputStream | 输出管道 |
FilterOutputStream | 过滤输出流 |
ByteArrayOutputStream | 写入字节数组的输出流 |
ObjectOutputStream | 对象的输出流 |
DataOutputStream | 包含写Java标准数据类型方法的输出流 |
BufferedOutputStream | 缓冲输出流 |
PrintStream | 包含print()和println()的输出流 |
由于这两个都是抽象类,所以使用时创建的输入输出流对象一般都是它们的子类对象。
下面看一个例子,从控制台输入数据,然后输入字符‘#’表示输入完毕,并把数据存到文件中。
public class Demo3 {
public static void main(String[] args) throws IOException {
String filePath="C:\\Users\\xiake\\Desktop\\文本.txt";
InputStream in=new FileInputStream(FileDescriptor.in);
OutputStream out=new FileOutputStream(filePath);
int c;
while((c=in.read())!='#'){
out.write(c);
}
System.out.println("end");
}
}
FileDescriptor是java.io中的一个类,该类不能实例化,其中包含三个静态变量:in,out和err。分别对应标准输入流、标准输出流、标准错误流,利用它们可以在标准输入输出流上建立文件输入输出流,实现键盘输入或屏幕输出操作。
过滤流
常用的两个过滤流是数据输入流DataInputStream和数据输出流DataOutputStream。
由于DataInputStream和DataOutStream分别实现了DataInput和DataOutput两个接口(这两个接口规定了基本类型数据的输入输出)中定义的独立于具体机器的带格式的读写操作。从而实现了对不同类型数据的读写。
看个例子,将三个基本数据类型存入文件中,然后再从文件中读取出来:
public class Demo4 {
public static void main(String[] args) throws IOException {
String filePath="C:\\Users\\xiake\\Desktop\\文本.txt";
DataOutputStream out=new DataOutputStream(new FileOutputStream(filePath));
//往文件中写入基本数据
out.writeInt(100);
out.writeInt(-100);
out.writeInt(1);
out.close();
//
DataInputStream in=new DataInputStream(new FileInputStream(filePath));
//从文件中读出基本数据
System.out.println(in.readInt());
System.out.println(in.readInt());
System.out.println(in.readInt());
in.close();
}
}
运行结果:
100
-100
1
标准输入输出流
System.in、System.out、Systeim.err这三个标准输入输出流对象定义再java.lang.System类中,这三个对象在Java源程序编译时会被自动加载。
- 标准输入:标准输入System.in是BufferedInputStream类的对象,当程序需要从键盘上读入数据时,只需要调用System.in的read()方法即可,该方法从键盘缓冲区读入一个字节的二进制数据,返回以此字节为低字节,高字节为0的整形数据。
- 标准输出:标准输出System.out是打印输出流PrintStream类的对象,PrintStream类是过滤输出流类FilterOutputStream的一个子类,其中定义了向屏幕输出不同类型数据的方法print()和println()。
- 标准错误输出:System.err用于向用户显示错误信息,也是由PrintStream类派生出来的错误流。err流的作用是使print()和println()将信息输出到err流并显示在屏幕上,以方便用户使用和调试程序。