Java 日看一类(17)之IO包中的FileInputStream类

研究生如何快速发CVPR 研究生如何快速发CVPR,找到科研方向 阅读详情

该类引入了:

import java.nio.channels.FileChannel;
import sun.nio.ch.FileChannelImpl;

继承了InputStream。



该类的类头注释如下:

/**
 * A <code>FileInputStream</code> obtains input bytes
 * from a file in a file system. What files
 * are  available depends on the host environment.
 *
 * <p><code>FileInputStream</code> is meant for reading streams of raw bytes
 * such as image data. For reading streams of characters, consider using
 * <code>FileReader</code>.
 *
 * @author  Arthur van Hoff
 * @see     java.io.File
 * @see     java.io.FileDescriptor
 * @see     java.io.FileOutputStream
 * @see     java.nio.file.Files#newInputStream
 * @since   JDK1.0
 */

大意如下:

FileInputStream从文件系统的文件中获取输入byte

文件的有效性取决于主机环境

FileInputStream可以直接从原始byte流读取数据(读取出byte数据),例如图像数据

如果要从流中读取字符,请考虑使用FileReader



该类含有如下的成员变量:

文件描述符:

private final FileDescriptor fd;

输入文件的路径:

private final String path;

文件流频道:

private FileChannel channel = null;

线程关闭锁

private final Object closeLock = new Object();

流关闭标示(每次调用时刷新:

private volatile boolean closed = false;





该类含有如下的成员方法:

构造方法(输入文件的路径构造

public FileInputStream(String name) throws FileNotFoundException {
    this(name != null ? new File(name) : null);//判定文件路径是否为空
}

构造方法(输入该文件投射出的File对象

public FileInputStream(File file) throws FileNotFoundException {
    String name = (file != null ? file.getPath() : null);//把File类标示的虚拟路径引入
    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);//将fd与该对象绑定
    path = name;
    open(name);//打开该文件
}

构造方法(文件描述符构造流,仅绑定了描述符序号,没有给出路径

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

    /*
     * FileDescriptor is being shared by streams.
     * Register this stream with FileDescriptor tracker.
     */
    fd.attach(this);
}

打开并读入输入文件(系统native方法,看不见工作原理

private native void open0(String name) throws FileNotFoundException;

同上,调用上一个方法

private void open(String name) throws FileNotFoundException {
    open0(name);
}

从数据流中读入byte数据,如果没有输入流,该方法无效(调用下一个native方法

public int read() throws IOException {
    return read0();
}

被上个函数调用的read()方法

private native int read0() throws IOException;

读取传入的byte数组中特定位置特定长度的数值(还是native,可以参考我前面写的BufferInputStream

private native int readBytes(byte b[], int off, int len) throws IOException;

读入传入byte数组的全部数值

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

相当于上个native函数的public转化

public int read(byte b[], int off, int len) throws IOException {
    return readBytes(b, off, len);
}

跳过后续读入的n个字符(参考我前面写的各种BufferInputStream类

public native long skip(long n) throws IOException;

返回当前文章剩余可读取数据(设计思路很清晰,但内部封装无法看出来具体实现

public native int available() throws IOException;

关闭输入流

public void close() throws IOException {
    synchronized (closeLock) {//关闭锁
        if (closed) {
            return;
        }
        closed = true;
    }
    if (channel != null) {//流频道不为空
       channel.close();
    }

    fd.closeAll(new Closeable() {
        public void close() throws IOException {
           close0();//注销文件描述符
       }
    });
}

返回该流的文件描述符

public final FileDescriptor getFD() throws IOException {
    if (fd != null) {
        return fd;
    }
    throw new IOException();
}

返回该流的文件流频道

public FileChannel getChannel() {
    synchronized (this) {
        if (channel == null) {
            channel = FileChannelImpl.open(fd, path, true, false, this);//如果为空就申请一个文件流频道
        }
        return channel;
    }
}

jni注册初始化(猜测

private static native void initIDs();

向jvm注销该对象并释放内存(猜测

private native void close0() throws IOException;

确认在没有更多数据流入该流中时或该类不能再被使用到后(代码块失效)自动关闭流

protected void finalize() throws IOException {
    if ((fd != null) &&  (fd != FileDescriptor.in)) {//存在文件描述符且非标准输入流
        /* if fd is shared, the references in FileDescriptor
         * will ensure that finalizer is only called when
         * safe to do so. All references using the fd have
         * become unreachable. We can call close()
         */
        close();
    }
}



静态代码块:

static {
    initIDs();
}






该类使用非常频繁,也非常方便,推荐大家深入了解


uniapp - Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not suppo Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not supported for code-splitting builds. uniapp 编译报错,vite vue3 Hbuilder 中编译报错,uniapp 打包 App 报错(vue3)hbuilder提示错误,uniapp运行到手机/模拟器 App 报错(vue3)uniapp项目启动报错,如何解决这个问题,安卓app,苹果app 阅读详情

相关推荐

Opencv全景图像处理实战:柱面与透视展开技术详解

本文详细解析了使用OpenCV实现全景图像处理的两种核心技术:柱面展开与透视展开。通过原理拆解与实战代码演示,指导开发者将360度环绕的鱼眼或球面图像转换为可用的平面视图,适用于街景展示、车载环视、室内测量等计算机视觉应用场景。

weixin_29081163的博客 585

JDK1.8源码学习--io包(FileInputStream)

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄! 一.FileInputStream的作用: 直接看源码注释(我的翻译可能不太准,如果道友们有更棒的理解,可以留言或者私信) /*...

w5_Silence的博客 857

MATLAB去雾算法实战:5种经典方法对比+1种改进方案(附完整源码)

本文详细对比了MATLAB中5种经典去雾算法(包括暗通道先验、多尺度Retinex等)的实现效果,并提出一种创新的自适应融合改进方案。通过完整的源码展示和性能对比,帮助开发者掌握图像去雾的核心技术,提升计算机视觉应用中的图像质量。特别针对去雾算法中的光晕效应问题,给出了工程实践中的优化技巧。

weixin_26801149的博客 414

Java学习(110)Java输入输出流——文件输入流FileInputStream

Java学习(110)Java输入输出流——文件输入流FileInputStream

weixin_43360025的博客 3126

飞思卡尔16位单片机(二)——CodeWarrior开发环境搭建及新建、调试工程

一、安装CodeWarrior 飞思卡尔16位单片机的开发环境为CodeWarrior5.1,这个软件安装比较简单,软件的安装文件可以从相应的网站上下载。安装CodeWarrior所需要的电脑的硬件资源也比较宽泛,目前一般的电脑都可以满足这个要求,可以支持win10、win7等操作系统。安装过程按照按照软件的提示一步步操作即可。 二、安装USBDM驱动 USBDM是...

bigmarshal的博客 1万+

VS2022命令行编译C++报错?一招解决‘fatal error C1034: iostream: 不包括路径集‘

本文针对VS2022命令行编译C++时常见的'fatal error C1034: iostream: 不包括路径集'错误,深入剖析了其根源在于环境变量缺失。文章提供了永久配置用户环境变量(PATH、INCLUDE、LIB)的一劳永逸解决方案,确保在任何终端中都能直接使用cl命令进行编译,并给出了进阶配置与常见错误排查指南。

weixin_29011667的博客 305

File类以及InputStream,OutputStream的介绍及其用法

文件操作中的File类以及InputStream和OutputStream的简单介绍及使用

yss233333的博客 690

Open-AutoGLM 实战:手把手教你用 AI 操作手机「喂饭教程」

Open-AutoGLM 是一个由智谱AI开源的手机操作智能体框架,由手机端智能助手框架Phone Agent和9B大小的模型AutoGLM-Phone-9B组成,借助ADB自动执行点击、滑动、输入等操作——用户只需用自然语言描述任务,系统便能自动规划并完成整个操作流程。

blues_C的博客 1270

【IO流系列】FileInputStream 字节输入流

FileInputStream 是 Java IO 包中的一个类,它是字节输入流的一种。它用于从文件中读取数据,以字节为单位进行读取。

kuxiaoyang的博客 4158

基于MATLAB的多无人机多任务调度算法——CBBA带时间窗

本文将介绍基于MATLAB的CBBA算法,并对其进行改进,加入时间窗概念,以提高多无人机系统的调度效率和性能。时间窗用于限定任务的执行时间范围,以避免任务执行时间过长或过短导致的问题。具体而言,我们为每个任务设置一个允许的最早开始时间和最晚结束时间,并在任务分配的过程中考虑这些时间约束。在多无人机系统中,需要将若干个任务分配给不同的无人机完成,以实现高效的任务执行。以上是关于基于MATLAB的多无人机多任务调度算法CBBA带时间窗的简要介绍和源代码实现。多无人机系统的调度问题。

BUG?不存在的! 1899

【第07例】IPD体系进阶: 6 个技术评审点(TR)

TR技术评审点

产品线负责人 4425

【Java】什么是 FileInputStream

它是 Java I/O 流的一部分,允许程序以字节为单位读取文件内容,非常适合处理二进制文件(如图片、音频、视频等)以及文本文件的读取。尽管 FileInputStream 是一个底层 I/O 工具,它在处理文件读取时仍然非常强大,但对于文本文件的处理来说,使用 BufferedReader 或其他高级 API 可能更加高效。在日常开发中,FileInputStream 是文件读取的基础工具之一,理解它的工作方式和使用场景可以帮助开发者更好地处理 Java 中的文件操作。如果到达文件末尾,返回 -1。

哈哈哈哈哈哈哈 942

15、基于最优传输的协作多视图聚类框架

本文提出了一种基于最优传输理论的协作多视图聚类框架,通过引入协作学习机制在不同视图间建立先验交互,以提升共识聚类的质量。框架包含两种新方法:协作共识投影方法(CoCP)和基于新表示的协作共识方法(CoCNR)。CoCP在全局空间中整合多视图信息并进行共识投影,而CoCNR则通过协作编码生成新的数据表示以实现更优聚类。方法利用熵正则化的Wasserstein距离与Wasserstein重心,有效捕捉数据分布间的几何结构,并通过聚合步骤获得统一模型。实验结果表明,所提方法在多个数据集上均优于现有方法,具有良好的

gpt4scribbler的博客 87

java中的io流

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出 。

m0_66689823的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

2021.11.17 Java io流 ·FileInputStream类·FileOutputStream类·文件复制

io流 I:input O:output 通过IO可以完成硬盘文件的读和写 IO流的分类 1.按照流的方向,以内存为参照物,往内存中去,叫做输入(读)。从内存中出来,叫做输出(写)。 2.按照读取数据方式不同进行分类: ·有的流是按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。 这种流是万能的,什么类型的文件都可以读取。包括:文本文件、图片、声音文件、视频 假设文件file.txt,采用字符流的话,读流程如下: a中国bc张三 第一次读:‘a’字符(正好读到’a’) 第二次读

qq_43416650的博客 526

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java学习 17 IO流(一)

是Unicode字符集的一种编码方案,采取可变长度编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节。字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流(InputStream)字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流(OutputStream)字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流(Reader)File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的。

yanzidong的博客 1455

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

fileinputstream java_java基础学习_io流之FileInputStream

一。FileInputStream属性:/* File Descriptor - handle to the open file */private final FileDescriptor fd;/*用来标识输入流的状态*/private final String path; //文件的路径信息private FileChannel channel = null;private final Ob...

weixin_42576467的博客 350

Java IO流分析整理

Java中的流,可以从不同的角度进行分类。 按照数据流的方向不同可以分为:输入流和输出流。 按照处理数据单位不同可以分为:字节流和字符流。 按照实现功能不同可以分为:节点流和处理流。   输出流:   输入流: 因此输入和输出都是从程序的角度来说的。 字节流:一次读入或读出是8位二进制。 字符流:一次读入或读出是16位二进制。 字节流和字符流的原理是相同的,只不过

8万+

FileInputStream类

FileInputStream和FileOutPutStream类都是用来操作磁盘文件的。如果用户对文件读取需求比较简单,则可以使用FileInputStream类,该类继承InputStream类 1 package cn.atun; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 im...

diaoxie2012的博客 154

17 -- 18. Java学习 -- File类、IO流

使用Apache Commons IO和不使用时的代码量存在较大差异。在传统的Java IO操作中,即使是简单的文件读写,也需要处理流的开启和关闭,还要处理异常。而使用Apache Commons IO,这些都被内部处理了,大大减少了代码量,提高了代码的可读性和可维护性。

ACDBBB的博客 1099

java基础学习_io流之FileInputStream

一。FileInputStream属性: /* File Descriptor - handle to the open file */private final FileDescriptor fd; /*用来标识输入流的状态*/ private final String path; //文件的路径信息 private FileChannel channel = null; ...

weixin_30735391的博客 211

Java学习 day17_IO

第二种 try-with-resourses //语法 try(资源,实现AutoCloseable接口){ // 代码 }catch{ }finally{ } 特点:当try代码块中的代码执行完 会自动close Demo package com.cskaoyan.bytestream.out; import java.io.FileNotFoundException; import java.io.FileOutputStream; import ja..

weixin_43385930的博客 389

java基础 day17 IO流

IO流: FileInputStream: package wwl.Io; import java.io.FileInputStream; import java.io.IOException; /** * 读字节为单位读取文件的内容 * @author 王文龙 * */ public class Test02 { public static void main(String[]...

龙龙的博客 141

java中IO练习题

Java中IO流,输入输出流概述与总结 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中。其中, 所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类; 而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类。 【首先需要明白的是:流是干什么的???(为了永久性的...

萍踪缘的博客 1448

Java File类和IO流

Java File类和IO流

weixin_45734473的博客 418

java byte char io流_Java中的IO流之字节流

在介绍字节流之前,我们先看一个File文件类。【File类】1. File类的作用是:对磁盘文件进行删除、创建等操作。2. 常用的三种构造函数:1 //直接传入一个路径,拿到一个文件或是一个文件夹2 File file1=new File("H:\\test");34 //第一个参数传入父路径,第二个参数传入子路径或者文件5 File file2=new File("H:\\test","text...

weixin_39669202的博客 129
上一篇: Java 日看一类(16) 之IO包中的FileDescriptor类
下一篇: Java 日看一类(18)之IO包中的FileNameFilter接口类和FileNotFoundException异常类
wyf95278
博客等级 码龄10年 38粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值