java.io包-字节流(一)

字节流的基类、文件流、过滤流、标准流、内存读写流、顺序输出流
把不同类型的输入、输出抽象为流(Stream),而其中输入或输出的数据则称为数据流(Data Stream)。
在这里插入图片描述
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
流分为输入流(InputStream)和输出流(OutputStream)。
巧计:只要是向内存中写入即为输入流、从内存中写出就是输出流。
常见:一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流;
键盘只是一个输入流,而屏幕则只是一个输出流。
在这里插入图片描述
一、基类:InputStream和OutputStream
字节流主要操作byte类型数据,以byte数组为准,java 中每一种字节流的基本功能依赖于基本类 InputStream 和 Outputstream,他们是抽象类,不能直接使用。字节流能处理所有类型的数据(如图片、avi等)。

1.InputStream-所有字节输入流类的基类
是从装置来源地读取数据的抽象表示,例如System的标准输入流 in 对象就是一个 InputStream 类型的实例。
InputStream类的方法

方法 说明
read()throws IOException 从输入流中读取数据的下一个字节(抽象方法)
skip(long n) throws IOException 跳过和丢弃此输入流中数据的 n 个字节
available()throws IOException 返回流中可用字节数
mark(int readlimit)throws IOException 在此输入流中标记当前的位置
reset()throws IOException 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置
markSupport()throws IOException 测试此输入流是否支持 mark 和 reset 方法
close()throws IOException 关闭流

在 InputStream 类中,方法 read() 提供了三种从流中读数据的方法:

1)int read():从输入流中读一个字节,形成一个 0~255 之间的整数返回(是一个抽象方法)
2)int read(byte b[]):从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
3)int read(byte b[],int off,int len):从输入流中读取长度为 len 的数据,写入数组 b 中从索引 off 开始的位置,并返回读取得字节数。
对于这三个方法,若返回-1,表明流结束,否则,返回实际读取的字节数。

2.OutputStream-所有表示字节输出流类的基类
是用于将数据写入目的地的抽象表示。例如 System 中的标准输出流对象 out 其类型是 java.io.PrintStream,这个类是 OutputStream 的子类。
OutputStream类方法:

方法 说明
write(int b)throws IOException 将指定的字节写入此输出流(抽象方法)
write(byte b[])throws IOException 将字节数组中的数据输出到流中
write(byte b[], int off, int len)throws IOException 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
flush()throws IOException 刷新此输出流并强制写出所有缓冲的输出字节
close()throws IOException 关闭流

例子:把输入流中的所有内容赋值到输出流中。
注意》read是一个字节一个字节地读,字节流的结尾标志是-1

一般来说,很少直接实现 InputStream 或 OutputStream 上的方法,因为这些方法比较低级,通常会实现它们的子类。

二、文件流
在I/O处理中,最常见的就是对文件的操作。java.io包中所提供的文件操作类包括:
1).用于读写本地文件系统中的文件:FileInputStream和FileOutputStream
2).描述本地文件系统中的文件或目录:File、FileDescriptor和FilenameFilter
3).提供对本地文件系统中文件的随机访问支持:RandomAccessFile

FileInputStream类用于打开一个输入文件,若要打开的文件不存在,则产生异常FileNotFoundException,这是一个非运行时Runtime异常,必须捕获或声明抛弃。
FileOutputStream类用来打开一个输出文件,若要打开的文件不存在,则会创建一个新的文件,否则原文件的内容会被新写入的内容所覆盖。
在进行文件的读/写操作时,会产生非运行时异常 IOException,必须捕获或声明抛弃(其他的输入/输出流处理时也同样需要进行输入/输出异常处理)。

文件流的构造方法:

//打开一个以 f 描述的文件作为输入
FileInputStream(File f)
//打开一个文件路径名为 name 的文件作为输入
FileInputStream(String name)

//创建一个以 f 描述的文件作为输出
//若文件存在,则其内容将被清空
FileOutputStream(File f)
//创建一个文件路径名为 name 的文件作为输出
//文件如果已经存在,则其内容被清空
FileOutputStream(String name)
//创建一个文件路径为 name的文件作为输出
//文件如果已经存在,则在该输出上输出的内容被节到原有内容之后
FileOutputStream(String name, boolean append)

输入流的参数是用于指定输入的文件名,输出流的参数则是用于指定输出的文件名。

例子:把File1.txt的内容复制到File2.txt中。

三、缓冲流
类BufferedInputStream和BufferedOutputStram实现了带缓冲的过滤流,它提供了缓冲机制,把任意的 I/O 流“捆绑”到缓冲流上,可以提高 I/O 流的读取效率。

在初始化时,除了要指定所连接的 I/O 流之外,还可以指定缓冲区的大小。缺省时是用 32 字节大小的缓冲区;最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等;一般缓冲区的大小为内存页或磁盘块等的整数倍。

BufferedInputStream的数据成员buf是一个位数组,默认为2048字节。当读取数据来源时例如文件,BufferedInputStream会尽量将buf填满。当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源作读取。当buf中的数据不足时,BufferedInputStream才会再实现给定的InputStream对象的read()方法,从指定的装置中提取数据。
BufferedOutputStream 的数据成员 buf 是一个位数组,默认为 512 字节。当使用 write() 方法写入数据时,实际上会先将数据写至 buf 中,当 buf 已满时才会实现给定的 OutputStream 对象的 write() 方法,将 buf 数据写至目的地,而不是每次都对目的地作写入的动作。
在这里插入图片描述
构造方法:

//[ ]里的内容代表选填
BufferedInputStream(InputStram in [, int size])
BufferedOutputStream(OutputStream out [, int size])

举个例子,将缓冲流与文件流相接:

FileInputStream in = new FileInputStream("file.txt");
FileOutputStream out = new FileIOutputStream("file2.txt");
//设置输入缓冲区大小为256字节
BufferedInputStream bin = new BufferedInputStream(in, 256);
BufferedOutputStream bout = new BufferedOutputStream(out, 256);
int len;
byte bArray[] = new byte[256];
len = bin.read(bArray); //len得到的是实际读取的长度,bArray中得到的是数据

在这里插入图片描述
对于 BufferedOutputStream,只有缓冲区满时,才会将数据真正送到输出流,但可以使用 flush() 方法人为地将尚未填满的缓冲区中的数据送出。
例如方法copy():

public void copy(InputStream in, OutputStream out) throws IOException {
    out = new BufferedOutputStream(out, 4096);
    byte[] buf = new byte[4096];
    int len = in.read(buf);
    while (len != -1) {
    out.write(buf, 0, len);
    len = in.read(buf);
    }
    //最后一次读取得数据可能不到4096字节
    out.flush();
}

参考自实验楼。

发布了28 篇原创文章 · 获赞 3 · 访问量 931

猜你喜欢

转载自blog.csdn.net/weixin_43273005/article/details/102748423