fileinputstream_Java I/O 流之 FileInputStream

e41ad21b76444b4b17afc94f2daef104.gif

一、FileInputStream 简介

1、概念

FileInputStream 是 Java 语言中抽象类 InputStream 用来具体实现类的创建对象。FileInputStream 流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等。

2、构造方法

1)通过打开与 File 类对象代表的实际文件的链接来创建 FileInputStream 流对象

public FileInputStream(File file) throws FileNotFoundException {String name = (file != null ? file.getPath() : null);SecurityManager security = System.getSecurityManager();if (security != null) {security.checkRead(name);}if (name == null) {throw new NullPointerException();}if (file.isInvalid()) {throw new FileNotFoundException("Invalid file path");} // 一系列合法性的判断fd = new FileDescriptor(); // 以下均是对成员变量的构造fd.attach(this);path = name;open(name); // 调用native方法打开文件
}
若 File 类对象的所代表的文件不存在、不是文件是目录、或者其他原因不能打开的话,则会抛出 FileNotFoundException 异常。

2)通过指定的字符串参数来创建File类对象,而后再与 File 对象所代表的实际路径建立链接创建 FileInputStream 流对象

public FileInputStream(String name) throws FileNotFoundException {this(name != null ? new File(name) : null);}
通过查看源码,发现该构造方法等于是在第一个构造方法的基础上进行延伸的,因此规则也和第一个构造方法一致:

3)通过 fdObj 文件描述符来作为参数,文件描述符是指与计算机系统中的文件的连接,前面两个方法的源码中最后都是利用文件描述符来建立连接的(了解)

public FileInputStream(FileDescriptor fdObj) {SecurityManager security = System.getSecurityManager();if (fdObj == null) {throw new NullPointerException();}if (security != null) {security.checkRead(fdObj);}fd = fdObj;path = null;fd.attach(this);
}

二、FileInputStream 常用方法

1、read() 从输入流中读取一个字节返回int型变量,若到达文件末尾,则返回-1

public int read() throws IOException
源码:
public class FileStream {public static void main(String[] args) {//建立文件对象File file = new File("D:test1.txt");try {//建立链接FileInputStream fileInputStream = new FileInputStream(file);int n = 0;StringBuffer sBuffer=new StringBuffer();while (n != -1){  //当n不等于-1,则代表未到末尾n = fileInputStream.read();//读取文件的一个字节(8个二进制位),并将其由二进制转成十进制的整数返回char by = (char) n; //转成字符sBuffer.append(by);}System.out.println(sBuffer.toString());} catch (FileNotFoundException e) {System.out.println("文件不存在或者文件不可读或者文件是目录");} catch (IOException e) {System.out.println("读取过程存在异常");} }
}
最后输出内容和 1.txt 内容一致是:123总结:从(来源)输入流中(读取的内容)读取数据的下一个字节到(去处)java程序内部中返回值为0到255的int类型的值,返回值为字符的ACSII值(如a就返回97,n就返回110).如果没有可用的字节,因为已经到达流的末尾, -1返回的值运行一次只读一个字节,所以经常与while((len = inputstream.read()) != -1)一起使用

2、read(byte[] b) 从输入流中读取 b.length 个字节到字节数组中,返回读入缓冲区的总字节数,若到达文件末尾,则返回-1

public int read(byte[] b) throws IOException
源码:
public int read(byte b[]) throws IOException {return readBytes(b, 0, b.length);
}

查看此方法源码,发现其本质是调用的其它方法 readBytes(b, 0, b.length);

总结:从(来源)输入流中(读取内容)读取的一定数量字节数,并将它们存储到(去处)缓冲区数组b中返回值为实际读取的字节数运行一次读取一定的数量的字节数.java会尽可能的读取b个字节,但也有可能读取少于b的字节数.至少读取一个字节第一个字节存储读入元素b[0],下一个b[1],等等。读取的字节数是最多等于b的长度。如果没有可用的字节,因为已经到达流的末尾, -1返回的值 如果b.length==0,则返回0

3、read(byte[] b,int off,int len) 从输入流中读取最多len个字节到字节数组中(从数组的off位置开始存储字节),当len为0时则返回0,如果len不为零,则该方法将阻塞,直到某些输入可用为止

public int read(byte[] b,int off,int len) throws IOException
源码:
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;}
总结:读取 len字节的数据从输入流到一个字节数组。试图读取多达 len字节,但可能读取到少于len字节。返回实际读取的字节数为整数。 第一个字节存储读入元素b[off],下一个b[off+1],等等。读取的字节数是最多等于len。k被读取的字节数,这些字节将存储在元素通过b[off+k-1]b[off],离开元素通过b[off+len-1]b[off+k]未受影响。

4、close() 关闭此输入流并释放与该流关联的所有系统资源---即释放与实际文件的连接

public void close() throws IOException

三、FileInputStream 常用 API 总结

1、为什么 read() 无参方法读取一个字节,返回的是一个 int 类型,而不是一个byte类型?

因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回 byte,有可能在读到中间的时候遇到 111111111(文件的底层按补码来存储的):

efda04c07c2df2fec3f6c7836d1327d4.png

那么这 11111111 是 byte 类型的 -1,我们的程序是遇到 -1 就会停止不读了,后面的数据就读不到了,所以在读取的时候用 int 类型接收,如果 11111111 会在其前面补上 24 个 0 凑足 4 个字节,那么 byte 类型的 -1 就变成 int 类型的 255 了,这样可以保证整个数据读完,而结束标记的 -1 就是 int 类型。

2、三种 read 方法效率比较

查看三种 read 方法源码,其本质都是利用 for 循环对内容进行单字节的读取,但从代码形式看,使用 read(byte[] b) 较为直观和简便,因此项目中可以此方法为主进行数据读取。

知乎视频​www.zhihu.com

希望可以帮到大家~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小案例:基于python的动态时钟,带十二时辰和经络养身

一、前言 1、仅用来研究学习使用。 2、除正常显示时钟外&#xff0c;还可以实时显示当前对应的时辰&#xff0c;和经络养身提示。 3、适合辅助上班族来养生 二、效果如下&#xff1a; 三、源码如下&#xff1a; 动态时钟附带十二时辰显示import turtle # 导入绘图海龟模块 …

【海淘域名】GoDaddy账户被锁定后的解决方法

转载自【美国海淘网】http://www.usahaitao.com/Experience/Detail_2886.html通过ICANN申诉顺利的从国内无良奸商(35互联与商务中国,小编的域名在这2个大的服务商手中。不过开始都是图便宜&#xff0c;不懂得国内域名管理的黑幕&#xff0c;所以从其下属的皮包第三方手里购入域…

回归分析常数项t值没有显著异于零怎么办_线性回归分析思路总结!简单易懂又全面!...

线性回归分析是一种研究影响关系的方法&#xff0c;在实际研究里非常常见。不管你有没有系统学习过&#xff0c;对于线性回归&#xff0c;相信多少都有那么一点了解。即使如此&#xff0c;在实际分析时&#xff0c;还是会碰到很多小细节&#xff0c;让我们苦思冥想困扰很久&…

LeetCode 1733. 需要教语言的最少人数(哈希+枚举)

文章目录1. 题目2. 解题1. 题目 在一个由 m 个用户组成的社交网络里&#xff0c;我们获取到一些用户之间的好友关系。 两个用户之间可以相互沟通的条件是他们都掌握同一门语言。 给你一个整数 n &#xff0c;数组 languages 和数组 friendships &#xff0c;它们的含义如下&a…

java 3种单例模式

1.饿汉式 1 package singleInstance;2 /**饿汉式&#xff0c;类加载时候创建实例&#xff0c;浪费资源&#xff0c;线程是安全的*/3 public class SingleDome01 {4 //私有构造方法&#xff0c;防止直接new对象5 private SingleDome01() {6 }7 //类加载的时候&a…

在c#中用mutex类实现线程的互斥_面试官经常问的synchronized实现原理和锁升级过程,你真的了解吗...

本篇文章主要从字节码和JVM底层来分析synchronized实现原理和锁升级过程&#xff0c;其中涉及到了简单认识字节码、对象内部结构以及ObjectMonitor等知识点。阅读本文之前&#xff0c;如果大家对synchronized关键字的基本使用还不是很了解的话&#xff0c;推荐阅读笔者之前的一…

TensorFlow 2.x GPU版在conda虚拟环境下安装步骤

先下载安装驱动&#xff1a;https://www.nvidia.cn/Download/index.aspx?langcn&#xff0c;版本要求 WSL cuda 驱动 https://developer.nvidia.com/cuda/wsl 下载安装 anaconda&#xff0c;管理虚拟环境&#xff1a;https://www.anaconda.com/products/individual&#xff0…

如何通过网络将文件传输到嵌入式设备_嵌入式系统 Boot Loader技术内幕,带你完全了解Boot Loader...

一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次&#xff1a;1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选)&#xff0c;和 Boot Loader 两大部分。2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。3. 文件系统。包括根文件系统和建…

TensorFlow 2.0 - CNN / 预训练 / RNN

文章目录1. CNN 卷积神经网络2. 预训练模型3. RNN 循环神经网络学习于&#xff1a;简单粗暴 TensorFlow 2 1. CNN 卷积神经网络 卷积神经网络&#xff0c;卷积后尺寸计算 tf.keras.layers.Conv2D&#xff0c; tf.keras.layers.MaxPool2D # CNN 模型 class myCNN(tf.keras.M…

openwrt mt7620 内存大小检测

单独编译内核: make Vs target/linux/install 相调函数调用流程&#xff1a; init/main.c : start_kernel() -> setup_arch(&command_line) arch/mips/kernel/setup.c: setup_arch()-> cpu_probe()-> prom_init()-> arch_mem_init() -> plat_mem_setup() -&…

python获取当前路径的方法_Python获取脚本所在目录的正确方法【转】

原博文 2015-09-24 10:21 − 1.以前的方法如果是要获得程序运行的当前目录所在位置&#xff0c;那么可以使用os模块的os.getcwd()函数。如果是要获得当前执行的脚本的所在目录位置&#xff0c;那么需要使用sys模块的sys.path[0]变量或者sys.argv[0]来获得。实际上sys.path是Pyt…

JAVA NIO 简介(转)

1. 基本 概念IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现&#xff0c;底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的工具。 (c 的 printf scanf,java 的面向对象封装 ) 2. Java 标准 io 回顾Jav…

TensorFlow 2.0 - Keras Pipeline、自定义Layer、Loss、Metric

文章目录1. Keras Sequential / Functional API2. 自定义 layer3. 自定义 loss4. 自定义 评估方法学习于&#xff1a;简单粗暴 TensorFlow 2 1. Keras Sequential / Functional API tf.keras.models.Sequential([layers...])&#xff0c;但是它不能表示更复杂的模型 mymodel…

python去重复元素_Python实现去除列表中重复元素的方法总结【7种方法】

这里首先给出来我很早之前写的一篇博客&#xff0c;Python实现去除列表中重复元素的方法小结【4种方法】&#xff0c;感兴趣的话可以去看看&#xff0c;今天是在实践过程中又积累了一些方法&#xff0c;这里一并总结放在这里。 由于内容很简单&#xff0c;就不再过多说明了&…

oracle取差值集合

Oracle Minus关键字 SQL中的MINUS关键字 SQL中有一个MINUS关键字&#xff0c;它运用在两个SQL语句上&#xff0c;它先找出第一条SQL语句所产生的结果&#xff0c;然后看这些结果有没有在第二个SQL语句的结果中。如果有的话&#xff0c;那这一笔记录就被去除&#xff0c;而不会…

TensorFlow 2.0 - Checkpoint 保存变量、TensorBoard 训练可视化

文章目录1. Checkpoint 保存变量2. TensorBoard 训练过程可视化学习于&#xff1a;简单粗暴 TensorFlow 2 1. Checkpoint 保存变量 tf.train.Checkpoint 可以保存 tf.keras.optimizer 、 tf.Variable 、 tf.keras.Layer 、 tf.keras.Model path "./checkp.ckpt" …

coturn的负载均衡特性_高性能负载均衡

单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。高性能集群的本质很简单&#xff0c;通过增加更多的服务器来提升系统整体的…

LintCode MySQL 1928. 网课上课情况分析 I

文章目录1. 题目2. 解题1. 题目 online_class_situation 表展示了一些同学上网课的行为活动。 每行数据记录了一名同学在退出网课之前&#xff0c;当天使用同一台设备登录课程后听过的课程数目&#xff08;可能是0个&#xff09;。 写一条 SQL 语句&#xff0c;查询每位同学第…

poj1284:欧拉函数+原根

何为原根&#xff1f;由费马小定理可知 如果a于p互质 则有a^(p-1)≡1(mod p)对于任意的a是不是一定要到p-1次幂才会出现上述情况呢&#xff1f;显然不是&#xff0c;当第一次出现a^k≡1(mod p)时&#xff0c; 记为ep&#xff08;a&#xff09;k 当k(p-1)时&#xff0c;称a是p的…

python输入十个数输出最大值_python输入十个数如何输出最大值

python输入十个数输出最大值的方法&#xff1a;1、如果是整数的话&#xff0c;使用函数【a, b, c map(int, input().split())】&#xff1b;2、使用函数【Xinput().split()】。 相关免费学习推荐&#xff1a;python视频教程 python输入十个数输出最大值的方法&#xff1a; 第一…