有出有入:使用字节输入流 | 带你学《Java语言高级特性》之五十四

简介: 上一节中我们学习了字节输出流OutputStream,与之对应的还有字节输入流InputStream,本节将为读者详细介绍字节输入流相关内容与使用FileInputStream读取文件内容。

上一篇:使用FileOutputStream将数据写入文件 | 带你学《Java语言高级特性》之五十三
上一节中我们学习了字节输出流OutputStream,与之对应的还有字节输入流InputStream,本节将为读者详细介绍字节输入流相关内容与使用FileInputStream读取文件内容。

【本节目标】
通过阅读本节内容,你将了解InputStream接口相关的内容,通过几组示例图直观深刻地理解字节输入流的工作原理,学会使用FileInputStream读取文件内容。

InputStream字节输入流

与OutputStream对应的一个流就是字节输入流,InputStream类主要实现的就是字节数据读取,该类定义如下:

public abstract class InputStream extends Object implements Closeable

在InputStream类中定义有如下几个核心方法:

No 方法 类型 描述
01 public abstract int read() throws IOException 普通 读取单个字节数据,如果现在已经读取到底了,返回-1
02 public int read(byte[] b) throws IOException 普通 读取一组字节数据,返回的是读取的个数,如果数据已经读取到底了则返回-1
03 public int read(byte[] b, int off, int len) throws IOException 普通 读取一组字节数据(只占数组的部分)

image.png
输入,读取单个字节数据

image.png
输入(int read(byte data[]))读取一组字节数据

InputStream类属于一个抽象类,这时应该依靠它的子类来实例化对象,如果要从文件读取一定使用FileInputStream子类,对于子类而言只关心父类对象实例化,构造方法:public FileInputStream(File file) throws FileNotFoundException;

image.png
InputStream

范例:读取文件数据

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        File file = new File("D:"+ File.separator + "hello" + File.separator + "mldn.txt");
        InputStream input=new FileInputStream(file);
        byte[] data=new byte[1024];  //开辟一个缓冲区读取数据
        int len = input.read(data);  //读取数据,数据全部保存在字节数组中,返回读取个数
        System.out.println("【"+new String(data,0,len)+"】");
        input.close();
    }
}

对于字节输入流里面最为麻烦的问题就在于:使用read()方法读取的时候只能够以字节数组为主进行接收。

特别需要注意的是从JDK1.9开始在InputStream类中增加了一个新的方法:public byte[] readAllBytes() throws IOException;

范例:新方法

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        File file = new File("D:"+ File.separator + "hello" + File.separator + "mldn.txt");
        InputStream input=new FileInputStream(file);
        byte[] data=input.readAllBytes();   //读取全部数据
        System.out.println("【"+new String(data)+"】");
        input.close();
    }
}

如果你现在要读取的内容很大很大的时候,那么这种读取会直接将程序崩溃。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:秒懂字符输出流:Writer | 带你学《Java语言高级特性》之五十五
更多Java面向对象编程文章查看此处

相关文章
|
28天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
63 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
20天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
47 2
|
3天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
14 4
|
18天前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
39 3
|
18天前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
23 2
|
24天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
41 3
|
27天前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
42 4
|
1月前
|
分布式计算 安全 Java
Java语言的特点?
Java语言的特点?
|
存储 Java 编译器
Java语言------图书馆管理系统(入门简略版)
Java语言------图书馆管理系统(入门简略版)
115 0
Java语言------图书馆管理系统(入门简略版)
|
小程序 安全 前端开发
【Java编程进阶】Java语言基础入门篇
整个Java全栈编程知识体系十分庞大,包括JavaSE知识,Web前端,Web后端,数据库相关的知识等,初学者应该系统踏实的学习,一步一个脚印。Java语言是一种完全面向对象的跨平台语言。有很多突出的优点,例如简单易学,面向对象,分布式,安全可靠,解释型语言,跨平台运行,可移植高性能多线程,可实现网络编程等。
182 0
【Java编程进阶】Java语言基础入门篇
下一篇
无影云桌面