Java InputStream简介
InputStream,翻译过来就是字节输入流,可以将磁盘中的文件读取到java程序中。
在Java程序中,从某个数据源读取数据到程序的流称为输入流。
Java InputStream类结构
InputStream是所有字节输入流的顶级父类,InputStream并不是一个接口,而是一个抽象类。
public abstract class InputStream implements Closeable { /** 1、从输入流中读取下一个字节的数据,一个字节一个字节的读 2、返回值int是读取字节对应的int值 3、如果返回值int= -1,那么说明已经读取完成 */ public abstract int read() throws IOException; /** 1、将输入流中读取的数据放入byte数组中 2、返回值int是读取字节的长度 3、如果返回值int= -1,那么说明已经读取完成 */ public int read(byte b[]) throws IOException { return read(b, 0, b.length); } public int read(byte b[], int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; } int c = read(); if (c == -1) { return -1; } b[off] = (byte)c; int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte)c; } } catch (IOException ee) { } return i; }
1.read()方法是一个抽象方法:其是数据的读取源头,这个方法中要实现读取数据,返回读取的值,子类必须实现这个方法;
2.read(byte[])方法:用处是将流的输入读入byte[]数组,其实际上调用的是read(byte[], int, int);
3.read(byte[], int, int):将流读入byte[]数据的第off个位置开始,读取len个字节。
Java InputStream常用子类
因为InputStream是抽象类,所以我们要学习的是它的子类,如下图所示:
1、FileInputStream
FileInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作,一般用于程序读取文件系统中的文件。
常用的有以下两个:
1)FileInputStream(File file):参数传入一个File类型的对象;
2)FileInputStream(String name):参数传入文件的路径。
1.使用步骤
第一步:打开流,即创建字节文件输入流对象;
第二步:读数据,即通过流读取内容;
第三步:释放资源,即用完后关闭流资源。
2.代码示例
详细代码示例如下:
public class FileInputStreamDemo { public void demo() throws Exception{ //1:创建字节文件输入流 FileInputStream fis = new FileInputStream("mikechen.txt") ; int by = 0 ; //2:开始读数据 while((by=fis.read())!=-1) { System.out.print((char)by); } //3:释放资源 fis.close(); } }
2、BufferedInputStream
BufferedInputStream 是缓冲输入流,它继承于FilterInputStream。
BufferedInputStream 的作用:是为另一个输入流添加一些功能,例如,提供“缓冲功能”等。
相对于 FileInputStream,使用BufferedInputStream读资源比FileInputStream读取资源的效率高。
原因是:BufferedInputStream大部分是从缓冲区读入,FileInputStream每次都是从硬盘读入,读取内存速度比读取硬盘速度快得多,因此BufferedInputStream效率高。
BufferedInputStream构造方法
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。
BufferedInputStream(InputStream in, int size)
创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。
BufferedInputStream使用示例
public class BufferedInputStreamExample { public static void main(String[] args) { try { FileInputStream fin = new FileInputStream("D:\\testout.txt"); BufferedInputStream bin = new BufferedInputStream(fin); int i; while ((i = bin.read()) != -1) { //如果是中文,此方法不支持 System.out.print((char)i); } } catch (IOException e) { e.printStackTrace(); } }
3、ObjectInputStream
ObjectInputStream顾名思义就是可以从流中读入一个用户自定义的对象。
ObjectInputStream构造方法
ObjectInputStream(InputStream in)
创建从指定 InputStream 读取的 ObjectInputStream。
ObjectInputStream使用示例
1)定义实体
public class Employee implements Serializable { private String name; private int id; public Employee(String name,int id){ this.name = name; this.id = id; } public void showInfo(){ System.out.println("name:" + name + "\tid:" + id ); } }
备注:类必须实现Serializable接口才可以被序列化
2)使用案例
public static void main(String[] args) throws IOException{ FileOutputStream fos = new FileOutputStream("c://data.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(new Employee("mikechen",1)); oos.writeObject(new Employee("adashui",2)); oos.close(); }
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》