Java学习之字节流InputStream和OutputStream
一、InputStream的子类及其使用场景
1 . AudioInputStream
使用场景:
- 从外部音频文件、流或
URL
获得 一个音频流 - 从音频输入流中写入外部文件
- 将音频输入流转换为其他音频格式
2.ByteArrayInputStream
在字节数组和流之间搭建桥梁。
将字节数组作为字节流的数据源
举例:
import java.io.*;
public class ByteArrayStream {
public static void main(String[] args){
byte[] b = "hello".getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(b);
int n =0;
while((n = bais.read())!=-1){
System.out.print((char)n); //hello
}
}
}
3.FileInputStream
在文件和流之间搭建桥梁。
以文件路径名字构造一个文件输入流,打开一个与实际文件的连接,用于从该流中读取文件字节流
举例:
package chap14_2;
import java.io.*;
public class OpenFile {
public static void main(String args[]) throws IOException{
try{ //创建文件输入流对象
FileInputStream rf = new FileInputStream("OpenFile.java");
int n=512,c=0;
byte buffer[] = new byte[n];
while ((c=rf.read(buffer,0,n))!=-1 ){ //读取输入流
System.out.print(new String(buffer,0,c));
}
rf.close(); //关闭输入流
}
catch (FileNotFoundException ffe){
System.out.println(ffe);}
catch (IOException ioe){
System.out.println(ioe);
}
}
}
4.FilterInputStream
FilterInputStream
包含一些其他输入流,它将其用作其基本数据源,可能在此过程中转换数据或提供其他功能。FilterInputStream
本身只需使用将所有请求传递给包含的输入流的版本覆盖InputStream
的所有方法。FilterInputStream
的子类可能会进一步覆盖其中一些方法,也可能提供其他方法和字段。
5.ObjectInputStream
ObjectInputStream
用于恢复之前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或用于在远程通信系统中整理和取消整理参数和参数。
确保从流创建的图表中所有对象的类型与Java虚拟机中的类匹配。使用标准机制按要求加载类。
6.PipedInputStream
通常用于将一个程序的输出连接到另一个程序的输入。输出流作为管道的发送端,输入流作为管道的接收端。使用前需要调用connect
方法将输出流和输入流连接起来。通常一个线程执行管道输出流的写操作,另一个线程执行管道输入流的读操作。
举例:
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipedStream {
public static void main(String[] args) throws IOException {
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out);
new Thread(new Input(in)).start();
new Thread(new Output(out)).start();
}
}
7.SequenceInputStream
SequenceInputStream
表示其他输入流的逻辑串联。它从有序的输入流集合开始,从第一个流读取到文件结束,然后从第二个流读取,依此类推,直到在最后一个包含的输入流上到达文件结束。
二、OutputStream的子类及使用场景
1.ByteArrayOutputStream
在字节数组和流之间搭建桥梁。
构造一个字节数组输出流,用于将多个字节写入到流中,最后可以整体转为一个字节数组
举例:
import java.io.*;
public class ByteArrayStream {
public static void main(String[] args){
byte[] b = "hello".getBytes();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(b, 0, b.length);
System.out.println(new String(baos.toByteArray()));
}
}
2.FileOutputStream
在文件和流之间搭建桥梁。
以文件路径名字构造一个文件输出流,打开一个与实际文件的连接,用于文件的写字节流操作
举例:
import java.io.*;
public class Write1 {
public static void main(String args[]){
try{
System.out.print("Input: ");
int count,n=512;
byte buffer[] = new byte[n];
count = System.in.read(buffer); //读取标准输入流
FileOutputStream wf = new FileOutputStream("Write1.txt");
//创建文件输出流对象
wf.write(buffer,0,count); //写入输出流
wf.close(); //关闭输出流
System.out.println("Save to Write1.txt!");
}
catch (FileNotFoundException ffe){
System.out.println(ffe);}
catch (IOException ioe){
System.out.println(ioe);} }
}
3.FilterOutputStream
FilterOutputStream
类本身只需使用将所有请求传递给基础输出流的版本来覆盖OutputStream
的所有方法。FilterOutputStream
的子类可能会进一步覆盖其中一些方法,并提供其他方法和字段。
4.ObjectOutputStream
ObjectOutputStream
将Java对象的原始数据类型和图形写入OutputStream
。可以使用ObjectInputStream
读取(重新构建)对象。对象的持久存储可以通过为流使用文件来实现。如果流是网络套接字流,则可以在其他主机或其他进程中重新构建对象。
5.PipedOutputStream
通常用于将一个程序的输出连接到另一个程序的输入。输出流作为管道的发送端,输入流作为管道的接收端。使用前需要调用connect
方法将输出流和输入流连接起来。通常一个线程执行管道输出流的写操作,另一个线程执行管道输入流的读操作。
举例:
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipedStream {
public static void main(String[] args) throws IOException {
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out);
new Thread(new Input(in)).start();
new Thread(new Output(out)).start();
}
}