Java InputStream输入流详解(非常全面)

Java InputStream输入流详解(非常全面)-mikechen

Java InputStream简介

InputStream,翻译过来就是字节输入流,可以将磁盘中的文件读取到java程序中。

Java InputStream输入流详解(非常全面)-mikechen

在Java程序中,从某个数据源读取数据到程序的流称为输入流。

 

Java InputStream类结构

InputStream是所有字节输入流的顶级父类,InputStream并不是一个接口,而是一个抽象类。

  1. public abstract class InputStream implements Closeable {
  2.  
  3. /**
  4. 1、从输入流中读取下一个字节的数据,一个字节一个字节的读
  5. 2、返回值int是读取字节对应的int值
  6. 3、如果返回值int= -1,那么说明已经读取完成
  7. */
  8. public abstract int read() throws IOException;
  9.  
  10. /**
  11. 1、将输入流中读取的数据放入byte数组中
  12. 2、返回值int是读取字节的长度
  13. 3、如果返回值int= -1,那么说明已经读取完成
  14. */
  15. public int read(byte b[]) throws IOException {
  16. return read(b, 0, b.length);
  17. }
  18.  
  19. public int read(byte b[], int off, int len) throws IOException {
  20. if (b == null) {
  21. throw new NullPointerException();
  22. } else if (off < 0 || len < 0 || len > b.length - off) {
  23. throw new IndexOutOfBoundsException();
  24. } else if (len == 0) {
  25. return 0;
  26. }
  27.  
  28. int c = read();
  29. if (c == -1) {
  30. return -1;
  31. }
  32. b[off] = (byte)c;
  33.  
  34. int i = 1;
  35. try {
  36. for (; i < len ; i++) {
  37. c = read();
  38. if (c == -1) {
  39. break;
  40. }
  41. b[off + i] = (byte)c;
  42. }
  43. } catch (IOException ee) {
  44. }
  45. return i;
  46. }

1.read()方法是一个抽象方法:其是数据的读取源头,这个方法中要实现读取数据,返回读取的值,子类必须实现这个方法;

2.read(byte[])方法:用处是将流的输入读入byte[]数组,其实际上调用的是read(byte[], int, int);

3.read(byte[], int, int):将流读入byte[]数据的第off个位置开始,读取len个字节。

 

Java InputStream常用子类

因为InputStream是抽象类,所以我们要学习的是它的子类,如下图所示:

Java InputStream输入流详解(非常全面)-mikechen

1、FileInputStream

FileInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作,一般用于程序读取文件系统中的文件。

 

常用的有以下两个:

1)FileInputStream(File file):参数传入一个File类型的对象;

2)FileInputStream(String name):参数传入文件的路径。

 

1.使用步骤

第一步:打开流,即创建字节文件输入流对象;

第二步:读数据,即通过流读取内容;

第三步:释放资源,即用完后关闭流资源。

 

2.代码示例

详细代码示例如下:

  1. public class FileInputStreamDemo {
  2. public void demo() throws Exception{
  3. //1:创建字节文件输入流
  4. FileInputStream fis = new FileInputStream("mikechen.txt") ;
  5. int by = 0 ;
  6.  
  7. //2:开始读数据
  8. while((by=fis.read())!=-1) {
  9. System.out.print((char)by);
  10. }
  11. //3:释放资源
  12. fis.close();
  13. }
  14. }

 

2、BufferedInputStream

BufferedInputStream 是缓冲输入流,它继承于FilterInputStream。

BufferedInputStream 的作用:是为另一个输入流添加一些功能,例如,提供“缓冲功能”等。

相对于 FileInputStream,使用BufferedInputStream读资源比FileInputStream读取资源的效率高。

原因是:BufferedInputStream大部分是从缓冲区读入,FileInputStream每次都是从硬盘读入,读取内存速度比读取硬盘速度快得多,因此BufferedInputStream效率高。

 

BufferedInputStream构造方法

  1. BufferedInputStream(InputStream in)

创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。

  1. BufferedInputStream(InputStream in, int size)

创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。

 

BufferedInputStream使用示例

  1. public class BufferedInputStreamExample {
  2. public static void main(String[] args) {
  3. try {
  4. FileInputStream fin = new FileInputStream("D:\\testout.txt");
  5. BufferedInputStream bin = new BufferedInputStream(fin);
  6. int i;
  7. while ((i = bin.read()) != -1) {
  8. //如果是中文,此方法不支持
  9. System.out.print((char)i);
  10. }
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. }

 

3、ObjectInputStream

ObjectInputStream顾名思义就是可以从流中读入一个用户自定义的对象。

 

ObjectInputStream构造方法

  1. ObjectInputStream(InputStream in)

创建从指定 InputStream 读取的 ObjectInputStream。

 

ObjectInputStream使用示例

1)定义实体

  1. public class Employee implements Serializable {
  2. private String name;
  3. private int id;
  4.  
  5. public Employee(String name,int id){
  6. this.name = name;
  7. this.id = id;
  8. }
  9.  
  10. public void showInfo(){
  11. System.out.println("name:" + name + "\tid:" + id );
  12. }
  13. }

备注:类必须实现Serializable接口才可以被序列化

 

2)使用案例

  1. public static void main(String[] args) throws IOException{
  2. FileOutputStream fos = new FileOutputStream("c://data.txt");
  3. ObjectOutputStream oos = new ObjectOutputStream(fos);
  4. oos.writeObject(new Employee("mikechen",1));
  5. oos.writeObject(new Employee("adashui",2));
  6. oos.close();
  7. }

 

 

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复架构即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法
欢迎您,新朋友,感谢参与互动!