OutputStream、BufferedWriter的简单讲解
OutputStream
当我们需要将数据从程序中输出到外部存储设备或其他程序时,就需要使用输出流来完成这个任务。OutputStream 是 Java 编程语言中的一个抽象类,用于将数据输出到某个目标中,例如文件、网络连接、内存缓冲区等。它是所有输出流的超类。
OutputStream 类中定义了一些常用的方法,例如:
write() 方法用于将一个字节输出到输出流中;
flush() 方法用于刷新输出流,将缓存中的数据输出到目标设备中;
close() 方法用于关闭输出流。
在使用输出流输出数据时,通常情况下,数据会被先缓存到缓冲区中,然后等到缓冲区满了或者调用了 flush() 方法时才会被真正地输出到目标中。
那么为什么不直接在调用 write() 方法时就将数据输出到目标中呢?这是因为每次向目标输出数据都会产生一定的开销,如果每输出一个字节都要产生一次开销,那么效率会非常低下。因此,为了提高输出效率,Java 使用了缓冲区的机制,将数据先缓存到缓冲区中,等到缓冲区满了或者调用了 flush() 方法时,才将缓冲区中的数据一次性输出到目标中。
调用 flush() 方法可以强制将缓冲区中的数据输出到目标中,即使缓冲区没有满,但是在一般情况下,如果我们不需要强制将数据输出到目标中,就可以不调用 flush() 方法。因为输出流在关闭时会自动将缓冲区中的数据输出到目标中,并关闭流。如果我们在程序中没有显式调用 close() 方法关闭输出流,就需要手动调用 flush() 方法将缓冲区中的数据输出到目标中,否则可能会导致数据丢失或者输出不完整的问题。
当我们使用某个子类创建了一个输出流对象后,就可以调用 OutputStream 类中的方法来将数据输出到目标设备中。例如,如果我们想将数据输出到文件中,可以使用 FileOutputStream 类创建一个文件输出流对象,然后使用该对象的 write() 方法将数据输出到文件中。如果我们想将数据输出到网络中,可以使用 Socket 类创建一个网络连接,并创建一个 SocketOutputStream 对象来向该连接中输出数据。
使用OutputStream将数据输出到文件中:
import java.io.*;
public class OutputStreamDemo {
public static void main(String[] args) {
try {
// 创建一个文件输出流对象
OutputStream os = new FileOutputStream("output.txt");
// 写入数据到输出流中
String str = "Hello, world!";
byte[] data = str.getBytes();
os.write(data);
// 关闭输出流
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedWriter
Writer out = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
这行代码的作用是创建一个字符输出流,用于将数据写入到指定的目标中。
- OutputStreamWriter:将字节流输出转换成字符流输出。在这里,它的构造函数接受一个字节输出流 outputStream 和一个字符编码("UTF-8"),并将其转换成一个字符输出流。
- BufferedWriter:它是一个缓冲字符输出流,它的构造函数接受一个字符输出流作为参数,并将其包装成一个带有缓冲区的字符输出流。这样,在写入字符数据时,可以先将数据写入缓冲区,等到缓冲区满了再一次性将数据写入到目标中,从而提高写入效率。
通过这两个类的组合,我们可以得到一个带有缓冲区、可以将字符输出转换成字节输出的字符输出流。