有出有入:使用字节输入流 | 带你学《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面向对象编程文章查看此处

相关文章
|
3月前
|
JSON JavaScript 前端开发
Python+JAVA+PHP语言,苏宁商品详情API
调用苏宁商品详情API,可通过HTTP/HTTPS发送请求并解析响应数据,支持多种编程语言,如JavaScript、Java、PHP、C#、Ruby等。核心步骤包括构造请求URL、发送GET/POST请求及解析JSON/XML响应。不同语言示例展示了如何获取商品名称与价格等信息,实际使用时请参考苏宁开放平台最新文档以确保兼容性。
|
3月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
204 14
|
4月前
|
Java 编译器 应用服务中间件
为什么说 Java 语言编译与解释并存的原因
在编程语言的世界里,Java以其独特的“编译与解释并存”特性独树一帜。这一特性不仅赋予了Java强大的跨平台能力,还使其在性能和灵活性上达到了很好的平衡。接下来,我们将深入探讨Java语言这一特性的本质、原理以及在实际应用中的体现。
96 6
|
4月前
|
分布式计算 Java 大数据
Java 语言基础概念与常识之主要特点解析
Java是一种广泛应用于企业级开发、移动应用(如Android)、大数据处理及云计算等领域的编程语言。其核心特点包括跨平台性(一次编写,到处运行)、面向对象设计、自动垃圾回收、多线程支持和高性能表现。Java通过JVM实现跨平台,具备强大的健壮性和安全性,同时拥有丰富的标准库与活跃的开发者社区。本文深入解析Java的技术优势及其在电商系统、大数据处理和云计算中的实际应用,并提供相关面试资料供学习参考。
127 0
|
4月前
|
网络协议 安全 Java
实现Java语言的文件断点续传功能的技术方案。
像这样,我们就完成了一项看似高科技、实则亲民的小工程。这样的技术实现不仅具备实用性,也能在面对网络不稳定的挑战时,稳稳地、不失乐趣地完成工作。
253 0
|
Java 安全
Java 字节数组 对比 低速 指针快速
如何才能快速比较两个字节数组呢?我将问题描述成下面的接口: public int compareTo(byte[] b1, int s1, int l1, byte[] b2, int s2,int l2); 最直观的做法是同时遍历两个数组,两两比较。
899 0
|
20天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
59 0
|
1月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
88 16
|
2月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。