Java字节流

什么是流:
  • IO 流的 I 指 input,表示输入,O 指 output,表示输出。
  • 流就是⼀组有序的数据序列,以先进先出的⽅式发送数据的通道。
Java中的流有很多种不同的分类:
  1. 按照⽅向分,可以分为输⼊流和输出流。 如何判断输⼊还是输出,站在Java程序⻆度,看数据是从外界来到Java中呢还是从Java中输出到外界,外届-Java 就是输⼊流, Java-外界 就是输出流。
  2. 按照单位分,可以分为字节流和字符流。 字节流指每次处理数据都是以字节为单位,字符流是指每次处理数据都是以字符为单位。
  3. 按照功能分,可以分为节点流和处理流。
InputStream 常用方法

InputStream是java.io包中的顶层⽗类,实现了Closeable接⼝,该接⼝的作⽤是每次操作结束之后释放资源

public abstract class InputStream implements Closeable
public abstract int read()						以字节为单位读取数据

public int read(byte b[])						将数据存入 byte 类型的数组中,并且返回数据长度

public byte[] readAllBytes()					将数据存入 byte 类型的数组中返回

public int read(byte b[],int off,int len)		将数据存入 byte 类型的数组的指定区间中,并返回数据长度

public int available()							返回当前数据流中未读取的数据个数

public void close()								关闭当前输入流对象
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Test2 {
	public static void main(String[] args) {
		File file = new File("C:/Users/73981/Desktop/test.txt");
		try {
			InputStream inputStream = new FileInputStream(file);
			int temp = 0;
			try {
				System.out.println("当前未读取的数据个数"+inputStream.available());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("开始读取");
			while((temp = inputStream.read())!=-1) {
				System.out.println(temp);
				System.out.println("当前未读取的数据个数"+inputStream.available());
			}
			inputStream.close();
			System.out.println("**********************************");
			inputStream = new FileInputStream(file);
			byte[] bytes = new byte[6];
			int length = inputStream.read(bytes);
			System.out.println("数据长度"+length);
			System.out.println("遍历byte数组");
			for(byte b:bytes) {
				System.out.println(b);
			}
			inputStream.close();
			System.out.println("*********************************");
			inputStream = new FileInputStream(file);
			bytes = new byte[10];
			length = inputStream.read(bytes, 2, 3);
			System.out.println("数据长度"+length);
			System.out.println("遍历byte数组");
			for(byte b:bytes) {
				System.out.println(b);
			}
			inputStream.close();
			System.out.println("**********************************");
			inputStream = new FileInputStream(file);
			bytes = inputStream.readAllBytes();
			System.out.println("遍历 byte 数组");
			for(byte b:bytes) {
				System.out.println(b);
			}
			inputStream.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
OutputStream 常用方法如下:
public abstract write(int b)						以字节为单位写数据

public void write(byte b[])byte 类型数组中的数据写出

public void write(byte b[],int off,int len)byte 类型数组中指定区间的数据写出

public void flush()									可以强制将缓冲区的数据同步到输出流中

public void close()									关闭数据流
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Test {
	public static void main(String[] args) {
		File file = new File("C:/Users/73981/Desktop/test.txt");
		try {
			OutputStream outputStream = new FileOutputStream(file);
			try {
				byte[] bytes = {105,111,99};
				outputStream.write(bytes,1,2);
				outputStream.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

以下为拓展部分:

  • 实际开发中不能直接实例化InputStream,因为它是⼀个抽象类,应该实例化其实现了抽象⽅法的⼦类, FileInputStream
  • FileInputStream的实例化就相当于⼀根连接到某个⽂件的管道,通过该管道就可以把⽂件中的数据取出读取到Java程序中, FileInputStream只能连接⽂件,不能连接⽬录,否则会抛出FileNotFoundException。
  • read()读取数据,每⼀此read()返回值就是⼀个字节的数据,如果取出的数据为-1,则表示该⽂件的所有的数据已经全部取出。
  1. 以字节为单位的输入流的框架图:
    在这里插入图片描述
(01) InputStream 是以字节为单位的输入流的超类。InputStream提供了read()接口从输入流中读取字节数据。

(02) ByteArrayInputStream 是字节数组输入流。它包含一个内部缓冲区,该缓冲区包含从流中读取的字节;通俗点说,它的内部缓冲区就是一个字节数组,而ByteArrayInputStream本质就是通过字节数组来实现的。

(03) PipedInputStream 是管道输入流,它和PipedOutputStream一起使用,能实现多线程间的管道通信。

(04) FilterInputStream 是过滤输入流。它是DataInputStream和BufferedInputStream的超类。

(05) DataInputStream 是数据输入流。它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。

(06) BufferedInputStream 是缓冲输入流。它的作用是为另一个输入流添加缓冲功能。

(07) File 是“文件”和“目录路径名”的抽象表示形式。关于File,注意两点:
	a), File不仅仅只是表示文件,它也可以表示目录!
	b), File虽然在io保重定义,但是它的超类是Object,而不是InputStream。
	
(08) FileDescriptor 是“文件描述符”。它可以被用来表示开放文件、开放套接字等。

(09) FileInputStream 是文件输入流。它通常用于对文件进行读取操作。

(10) ObjectInputStream 是对象输入流。它和ObjectOutputStream一起,用来提供对“基本数据或对象”的持久存储。

  1. 以字节为单位的输出流的框架图:
    在这里插入图片描述

  1. 以字节为单位的输入流和输出流关联的框架图:
    在这里插入图片描述

返回 I/O 流目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值