java-API之字节流
Posted 技术狂-CYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java-API之字节流相关的知识,希望对你有一定的参考价值。
字节流读取
字节流是由字节组成的,字符流是有字符组成的。java里字符有两个字节组成的,字节流是最基本的。所有的InputStream和OutputStream的子类都是主要处理二进制数据
的。
InputStream抽象类及其子类
InputStream类是一个抽象类,是表示字节输入的所有类的超类/抽象类。源码如下:
public abstract class InputStream{}
public class FileInputStreamextends InputStream{}
// BufferedInputStream类继承于FilterInputStream类,FilterInputStream类继承于InputStream类,所以BufferedInputStream类还是InputStream类的子类
public class FilterInputStream extends InputStream{}
public class BufferedInputStream extends FilterInputStream{}
InputStream类的方法
虽然抽象类InputStream不能创建对象,但是它里面定义了一些共性的方法。
- abstract int read() 从输入流中读取数据的下一个字节。
- int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
- int read(byte[] b, int off, int len)将输入流中最多 len 个数据字节读入 byte 数组。
- void close() 关闭此输入流并释放与该流关联的所有系统资源。
FileInputStream 子类
FileInputStream 从文件系统中的某个文件中获得输入字节。既然继承了父类InputStream,则就可以使用父类中定义的方法。此FileInputStream可以实例化对象。
class FileInputStream extends InputStream
创建对象
- 构造1:FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
InputStream file = new FileInputStream(new File("F:\ioTest\1.txt"));
- 构造2:FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
InputStream file = new FileInputStream("F:\ioTest\1.txt");
FileInputStream类的测试
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
// 测试字节流读取的过程
//BufferedInputStream要比FileInputStream效率高,因为BufferedInputStream底层维护了一个byte[]缓冲数据,数组满了之后才给程序依次,减少了和程交互的次数,提高了程序的执行效率
//byte[] 数组默认尺寸是8192字节
public class Test4_FileInputStream {
public static void main(String[] args) throws IOException {
// 通过FileInputStream类读取文件
// FileInputStreamMethod();
}
/*
* 通过 FileInputStream(File file)创建字节流对象
* in.read() 字节流对象的读取方法,读取完是返回 -1
*/
private static void FileInputStreamMethod() throws IOException {
// 1.创建字节读取流对象 两种创建对象的方式,都可以
InputStream in = new FileInputStream(new File("F:\ioTest\1.txt")); // 方法一
// InputStream in = new FileInputStream("F:\ioTest\1.txt"); // 方法二
// 2.开始读取数据
do {
int data = in.read();
if(data == -1) { //当数据读取完毕时返回值为 -1
in.close(); //关闭此输入流并释放与该流关联的所有系统资源。
System.out.println("数据读完了");
break;
}
System.out.println(data);
}while(true);
}
}
BufferedInputStream 子类
BufferedInputStream为另一个输入流添加一些功能,在创建 BufferedInputStream 时,会创建一个内部缓冲区数组,减少了和程序的交互次数,提高了程序的执行效率。这比运送东西,FileInputStream好比一个人开着小车送,BufferedInputStream好比一个人开着大卡车运送,肯定后者效率高。
private static int DEFAULT_BUFFER_SIZE = 8192; //默认大小8kb
private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
protected volatile byte buf[];
BufferedInputStream类创建对象
- BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
InputStream in = new BufferedInputStream(new InputStream("F:\\ioTest\\1.txt"));
测试
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class Test4_inputStream {
public static void main(String[] args) throws IOException {
BufferedInputStreamMethod(); //使用高效的BufferedInputStream(InputStream in)
}
/*
* 使用具有缓存数组高效的BufferedInputStream类
*/
private static void BufferedInputStreamMethod() throws IOException {
// 1.创建字节读取对象
InputStream in = new BufferedInputStream(new FileInputStream("F:\\ioTest\\1.txt"));
// 2.开始读取数据
int data = 0;
while((data = in.read()) != -1) {
System.out.println(data);
}
// 3.释放资源
in.close();
}
}
以上是关于java-API之字节流的主要内容,如果未能解决你的问题,请参考以下文章