OutputStream的作用是接收输出字节,并将这些字节发送到某个接收器。OutputStream表示输出字节流的所有类抽象父类,必须通过它的子类来进行构造。以下是常用的几个子类:
1、字节数组作为输出源——ByteArrayOutputStream
ByteArrayOutputStream实现一个输出流,其中的数据被写入一个byte数组。缓存区会随着数据的不断写入而自动增长,并可实现toByteArray()和toString()获取数据。
下面是一个应用ByteArrayOutStream输出的实例
import java.io.ByteArrayOutputStream; import java.io.IOException; public class TestByteArrayOutputStream { public static void main(String[] args) { // 创建输出流 ByteArrayOutputStream output = new ByteArrayOutputStream(); // 写入数据 byte[] buf = new byte[3]; buf[0] = 100; buf[1] = 101; buf[2] = 102; try { output.write(buf); // 从输出流中输出 System.out.print(output.toString()); // 关闭流 output.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2、文件作为输出源——FileOutputStream
文件输入流FileOutputStream是用于将数据写入File的输出流。FileOutputStream用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用FileWriter。
创建FileOutputStream对象的方法有四种:
FileOutputStream(File file); //向File对象文件中写入数据的文件输出流 FileOutputStream(String name); //向指定名称的文件中写入数据的输出文件流 FileOutputStream(File file,boolean append); //向File对象文件中写入数据的文件输出流 FileOutpuStream(String name,boolean append); //向指定名称的文件中写入数据的输出文件流
//参数append如果是true,则表示对象文件进行追加,默认为False,表示直接从文件开始处写入字节数据。
以下是一个写入指定文件的实例:
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class TestFileOutputStream { public static void main(String[] args) { try { // 创建文件输出流 FileOutputStream output = new FileOutputStream("D:/demo/test.txt"); // 写入数组数据 byte[] buf = new byte[3]; buf[0] = 100; buf[1] = 101; buf[2] = 102; output.write(buf); // 关闭流 output.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
3、对象作为输出源——ObjectOutputStream
ObjectOutputStream将对象的基本数据类型和图形写入OutputStream,可以使用ObjectInputStream读取(重构)对象。通过在流上使用文件可以实现对象的持久储存。
writeObject()方法可以用于将对象写流中。所有对象(包括String和数组)都可以通过writeObject写入。可将多个对象写入流中。必须使用与写入对象时相同类型和顺序从相应的ObjectInputStream中都会对象。还可以使用DataOutput中适当方法将基本数据类型写入流中。还可以使用writeUTF()方法写入字符串。
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Date; public class TestObjectOutputStream { public static void main(String[] args) { try { // 创建文件输出流 FileOutputStream fos = new FileOutputStream("D:/demo/test.tmp"); // 创建响应的对象输出流 ObjectOutputStream output = new ObjectOutputStream(fos); // 写入输出流数据 output.writeInt(1314); output.writeObject("一生一世"); output.writeObject(new Date()); // 关闭流 output.close(); fos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4、缓存输出流——BufferedOutputStream
BufferedOutputStream是从FileOutputStream中继承下来的,他与BufferedInputStream相对应,主要为输出流做缓存,如:
OutputStream s = new BufferedOutputStream(new FileOutputStream("foo"));
由于BufferedOutputStream是3缓存数据的,所以必要时,需要使用flush()方法强制将缓存中的数据真正的写入输出流中。
以下是一个将文件输出流转化成缓存输出流,再输出的过程
import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class TestBufferedOutputStream { public static void main(String[] args) { try { // 创建文件流 FileOutputStream fos = new FileOutputStream("D:/demo?test.txt"); // 创建缓冲输出流 BufferedOutputStream output = new BufferedOutputStream(fos); // 写入数据 byte[] buf = new byte[3]; buf[0] = 100; buf[1] = 101; buf[2] = 102; output.write(buf); // 关闭输出流 output.close(); fos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }