InputStream read()方法详解

article/2025/9/21 0:52:39

  在Java7中,InputStream被定义为一个抽象类,相应的,该类下的read()方法也是一个抽象方法,这也就意味着必须有一个类继承InputStream并且实现这个read方法。
  查阅Java7 API,我们可以看到,在InputStream中定义了三个重载的read()方法:
这里写图片描述
  但是在这三个方法中,只有参数列表为空的read方法定义为抽象方法,这也就意味着在直接继承自InputStream的所有子类中,必须重写这个方法。下面我们来看看这个方法的介绍:
这里写图片描述
  这里有两点需要注意:一是这个方法的返回值是int类型;二是在这个方法每次从数据源中读取一个byte并返回。很多初次接触Java的读者在看到这里时都会产生下面的疑问,就是这个方法读取的byte是如何以int的形式返回的。
  在计算机中,所有的文件都是以二进制的形式存储的,换句话说,每个文件不管是什么类型,在计算机中的形式都是一串0和1。而read()方法在读的时候是每次读取8个二进制位,这8个0或1就是我们所谓的一个byte(字节)。在这里通常容易产生的疑问就是将字节和字符混为一谈。无论在什么语言什么系统中,只要它符合当今世界对于计算机技术的主流定义,那么一个byte就是8个二进制位。而字符则不同,字符是与人为定义的编码规则相关的,一个字符的大小(也就是其所占的二进制位)是由编码规则决定的,比如在GBK编码中一个汉字用两个字节表示,而在utf-8中,一个汉字由3到4个字节表示。言归正传,既然一个byte表示8个二进制位,那么这8个二进制位就是一个0-255之间的十进制数字,实际上在Java中,byte就是一个0-255之间的整数,而将从文件中读取的二进制转化成十进制这一过程是由read()方法完成的。
  也就是说,read()这个方法完成的事情就是从数据源中读取8个二进制位,并将这8个0或1转换成十进制的整数,然后将其返回。
下面再来看read(byte[] b)这个方法,这个方法的介绍如下:这里写图片描述
  这个方法使用一个byte的数组作为一个缓冲区,每次从数据源中读取和缓冲区大小(二进制位)相同的数据并将其存在缓冲区中。当然byte数组中存放的仍然是0-255的整数,将二进制转换为十进制这个过程仍然是read方法实现的。
  需要注意的是,虽然我们可以指定缓冲区的大小,但是read方法在读取数据的时候仍然是按照字节来读取的。在utf-8等变长编码中,一个复杂字符(比如汉字)所占字节往往大于1,并且长度往往是不固定的。(参照UTF-8编码规则)按照字节读取数据会将字符割裂,这就导致我们在使用read(byte[] b)方法读取文件时,虽然指定了缓冲区的大小,但是仍然会出现乱码。下面这段代码可以很好地解释这一点

public static void main(String[] args) throws IOException {// TODO Auto-generated method stubInputStream in = null;File f = new File("D:/test.txt");byte[] b = new byte[2];in = new FileInputStream(f);int i = 0;while ((i = in.read(b)) != -1) {String str = new String(b);System.out.print(str);}}

文件如下(采用ANSI编码):
这里写图片描述
运行结果如下:
这里写图片描述
补充一点:在调用new String(byte[] b)这个构造方法时,java会根据传入的数据按照当前编码规则创建String,如果将编码方式改为GBK,则可以正常输出中文:
这里写图片描述
这是因为,GBK编码每个汉字占两个字节,缓冲区大小设为2就可以避免字符编码割裂的情况。


http://chatgpt.dhexx.cn/article/g0CDhdGr.shtml

相关文章

【Java学习笔记】InputStreamReader的理解

一、InputStreamReader类 API文档说明:InputStreamReader类是从字节流到字符流的桥接器:它使用指定的字符集读取字节并将它们解码为字符。 它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。每次调…

InputStreamReader介绍使用

InputStreamReader类: java.io.InputStreamReader extends Reader InputStreamReader:是字节流通向字符流的桥梁:他使用指定的charset读取字节并将其解码为字符。(解码:把看不懂的变为能看懂的) 继承自父类的共性成员方法:int r…

jconsole工具监测jvm

背景 本篇文章为了记录如何使用jconsole工具。 jconsole工具使用环境是windows,监控服务端在linux上。 如何启动jconsole 找到你本地jdk的目录,进入bin目录,找到jconsole.exe程序双击启动即可 本地进程 如果是想调试本地程序的话&#xf…

jconsole远程连接服务器失败,提示“连接失败:是否重试“

操作步骤: 运行程序的时候加上参数: -Djava.rmi.server.hostname****** -Dcom.sun.management.jmxremotetrue -Dcom.sun.management.jmxremote.port9991 -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse 服务器打开端口:效果就…

java jconsole 远程连接_jconsole连接远程tomcat

咱们先说怎么做,然后再聊聊一些原理,当然,本人技术能力有限,有错误的地方,欢迎指正。 1.本机环境,远程环境 本机环境:windows 7 java version "1.8.0_121" 远程环境:centos 6.5 java…

jconsole远程连接的使用

背景 在项目做性能压测的时候,对程序进行分析,需要用到jconsole工具,以前都没用过,学习了一下 连接步骤 1. 打开工具 打开jdk安装目录 -> bin ,找到jconsole.exe 双击打开 2. 到服务器中,加入以下…

简单使用Jconsole

引言 本文简单介绍Jconsole,死锁用例测试分析线程 正文 测试用例 DeadLockDemo : public class DeadLockDemo {private static Object resource1 new Object();//资源 1private static Object resource2 new Object();//资源 2public static void…

linux jconsole 监控jvm,JVM监测分析JConsole

一、基本操作 启动界面 1.JConsole是什么 从Java 5开始引入了JConsole。JConsole是一个内置Java性能分析器,可以从命令行或在GUI shell中运行。您可以轻松地使用JConsole(或者,它更高端的“近亲” VisualVM)来监控Java应用程序性能和跟踪Java中的代码。 …

Java应用程序监控之 jconsole

jconsole jconsole 启动一个图形控制台,使您可以监视和管理Java应用程序。JConsole图形用户界面是一个符合Java Management Extensions(JMX)规范的监视工具。JConsole使用Java虚拟机(Java VM)的广泛工具来提供有关Jav…

JConsole远程监控配置

首先,看本机(Windows)安装了JRE没 Win 》 CMD 打开命令窗口 如有安装,则会显示以下版本信息;若没有显示,就安装吧 1 C:\Users\Administrator>java -version 2 java version "1.8.0_111" 3 …

jconsole连接失败:是否重试?

背景 在学习使用jconsole的时候,按照大佬们的教程一步一步操作的,到了连接的时候却一直报这个错误,连接不上远程服务,百度了很久也没有相关的说明,都是让添加那些启动参数,问题是启动参数我早就添加了。。…

JConsole详解

一、JConsole是什么 从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。 二、如何启动JConsole 如…

Jconsole小记

今天在看jmeter相关的文章时,看到了这个,网上查看了一些相关的博客,虽然现在还不做性能方面的,先记录下来以便日后查看。 Jconsole,Java Monitoring and Management Console。 Jconsole是JDK自带的监控工具&#xff…

jconsole使用

目的: 为了检查一个经常会跑死的java程序,在网上查询了下, 觉得jconsole这个工具还不错,所以就部署了一把 一、服务器端部署 首先在服务器端,启动你要监控的java程序,我的启动脚本如下: /ho…

java jconsole_jconsole与jvisualvm

jvisualvm同jconsole都是一个基于图形化界面的、可以查看本地及远程的JAVA GUI监控工具,可以认为jvisualvm是jconsole的升级版,因此这里不再介绍jconsole,只介绍jvisualvm。jvisualvm是一个综合性的分析工具,可以认为其整合了jstack、jmap、jinfo等众多调试工具的功能,并以…

JConsole工具使用

转自:https://www.cnblogs.com/baihuitestsoftware/articles/6405580.html#top Jconsole,Java Monitoring and Management Console。Jconsole是JDK自带的监控工具,在JDK/bin目录下可以找到。它用于连接正在运行的本地或者远程的JVM&#xff…

Jconsole

JConsole有界面,能够比较方便地看到堆内存 \线程\类,以及JMX的变化. 线下环境中算是个不错的诊断工具. 那怎么操作呢? 十分简单, 本地的JDK安装路径中找到 jConsole.exe ,双击,填写远程JVM进程即可. 要注意: JConsole使用时要求远程JVM打开了 JMX 端口, JMX端口和服务端口是…

完全体,千字详解:“Java性能调优六大工具”之JConsole工具

JConsole工具是JDK自带的图形化性能监控工具。 通过JConsole工具, 可以查看Java应用程序的运行概况, 并监控堆信息、 永久区使用情况及类的加载情况等。 本文主要介绍JConsole工具的基本使用方法。 一,JConsole连接Java程序 JConsole程序在%JAVA_HOME%/bin目录下,启动…

JConsole使用教程

JConsole是一个Java虚拟机的监控和管理工具,可以监控Java应用程序的内存使用、线程和类信息等。 以下是JConsole的使用教程: 1.启动JConsole JConsole是一个Java自带的工具,可以在bin目录下找到jconsole.exe文件。双击运行该文件即可启动JC…

深入理解Java虚拟机——可视化监控工具(Jconsole)

目录 一、可视化监控工具(Jconsole)的作用二、可视化监控工具(Jconsole)的使用三、测试实例四、修改测试实例代码 一、可视化监控工具(Jconsole)的作用 内存监控线程监控 二、可视化监控工具(…