导航
以字节为单位获取数据的流,称为字节流,它们都继承于InputStream/OutputStream抽象类。
常用的字节流有:
- FileInputStream/FileOutputStream,文件字节流(节点流)
- ByteArrayInputStream/ByteArrayOutputStream,字节数组流(节点流)
- BufferedInputStream/BufferedOutputStream,字节缓存流(处理流)
- DataInputStream/DataOutputStream,数据字节流(处理流)
- ObjectInputStream/ObjectOutputStream,对象流(处理流)
下面分别介绍一下这五组字节流及用法。
FileInputStream/FileOutputStream
FileInputStream/FileOutputStream是最常用的文件字节流,当数据源为文件对象时,选择这个数据流进行处理。我们可以通过构造器快速了解它的操作数据类型:
public FileInputStream(File file)
public FileOutputStream(File file)
可以看到,这组数据流的操作对象为File类型。
关于数据流的操作,总是分为四个步骤:
- 1.指定数据源
- 2.选择合适的数据流
- 3.进行数据操作
- 4.关闭流,释放资源
来一个文件的拷贝实例,了解其用法:
public class FileStream {
public static void main(String[] args) {
//1.指定数据源
File in_scr = new File("a.txt"); // 输入数据为文件
File out_scr = new File("a-copy.txt"); // 输出数据也为文件
InputStream is = null;
OutputStream os = null;
try {
//2.选择合适的数据流
is = new FileInputStream(in_scr);
os = new FileOutputStream(out_scr);
//3.进行数据操作
byte[] flush = new byte[1024]; //字节流,数据以字节数组为单位
int len = -1;
while( (len = is.read(flush)) != -1 ) {
// for(int i=0;i<len;i++) {
// System.out.println(flush[i]); 可以将输入流直接打印出来观察
// }
os.write(flush,0,len);
}
os.flush(); //将缓存内容输出
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流,释放资源
//先打开的先关闭
try {
if(is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
需要注意的点有:
- 1.flush为byte[]数组,与形参不同,数组传入的是地址,所以在is.read(flush)方法中操作flush,外面的flush也会变换,read方法就是给flush赋值的一个方法,并且有返回值:读取到的元素个数,未读到时返回-1。
- 2.输出流中是有缓存的,就是说当输出流的数据量到达一定程度,才会输出。所以在结尾,我们需要手动将未到达缓存量的数据输出,使用输出流的flush()方法。
ByteArrayInputStream/ByteArrayOutputStream
ByteArrayInputStream/ByteArrayOutputStream,字节数组流,也是一个常用的节点流。当数据对象字节数组byte[ ]时,使用这种流进行操作。观察一下它们的构造器:
public ByteArrayInputStream(byte buf[])
public ByteArrayOutputStream()
可以看到,输入流的操作对象未byte[ ]字节数组;输出流无参数,并不能直接将流中数据输出为文件等,但ByteArrayOutputStream有toString()等方法,来方便对输出流进行操作。
还是来一个文件的拷贝实例,了解其用法:
public class ByteArrayStream {
public static void main(String[] args) {
//1.指定数据源
byte[] in_scr = new byte[] {
-28, -67, -96, -26, -120, -111, -28, -69, -106 };//输入数据
ByteArrayInputStream bais = null;
ByteArrayOutputStream baos = null;
try {
//2.选择合适的数据流
bais = new ByteArrayInputStream(in_scr);
baos = new ByteArrayOutputStream();
//3.进行数据操作
byte[] flush = new byte[1024];
int len = -1;
System.out.print("输入流:");
while ((len = bais.read(flush)) != -1) {
for (int i = 0; i < len; i++) {
System.out.print(flush[i]+","); //读取输入流
}
baos.write(flush, 0, len