常见字节流


  以字节为单位获取数据的流,称为字节流,它们都继承于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
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值