[八]JavaIO之FileInputStream 与 FileOutputStream

接下来介绍 FileInputStream  和 FileOutputStream

现在看名字应该可以看得出来:

他就是从一个文件中读取数据

或者将数据写入到一个文件中

FileInputStream

既然是从文件读取数据,那么自然要记录文件本身的信息所以有文件描述符 fd以及 path路径名显然,文件描述符是对文件最直接的描述如果是使用文件描述符作为参数的话,path的值将会是null

nio的东西,暂时不说了

构造方法

FileInputStream既然是从文件读取数据那么构造方法的首要作用也就是要唯一确定一个文件根据之前的文章,要么使用File描述,要么可以使用String的路径名,再或者使用文件描述符可以定位文件所以,FileInputStream的构造方法也就这三种形式

通过String的版本可以发现,实际上使用的还是File版本的方法File版本的方法会设置fd 和 path的值而文件描述符版本的却不会设置path

刚才也说了FileInputStream(String name) 是调用的File类型入参的构造方法从上面的代码也看得出来,实际上干活的也就只是另外的两个方法他们都有一个fd.attach(this)  关于这个点,可以查看文件描述符章节中说到的attach方法是为了把所有的跟某个文件描述符相关的流都记录下来,毕竟一个文件可能被多个流打开

还需要注意的是FileInputStream(FileDescriptor fdObj) 版本直接赋值参数到fdFileInputStream(File file)  每次都是new FileDescriptor();

read方法

read方法读取一个字节带数组参数的read方法将数据读取到字节数组中,并且返回实际读取的个数跟InputStream是一样的看得出来,如同我们之前说过的那样,文件的读写操作依赖于操作系统,所以所有的read都歇菜了,最终依赖的都是本地方法还有一个需要时刻记住的是,read 阻塞选手

skip(long n)  available()

连读的能力都没有,需要借助本地方法自然是没有能力跳过和获取可用个数的所以仍旧是依赖的本地方法

public native long skip(long n) throws IOException; public native int available() throws IOException;

Close方法

FileInputStream打开的可是实实在在的资源所以close方法肯定是需要做些事情关闭资源的注释中说的很清楚关闭这个文件输入流并且释放所有与这个流相关的系统资源如果这个流有关联的chanel ,那么也会关联这个channel如下图所示源代码中他是通过fd.closeAll()   方法来执行所谓的"释放所有相关资源"

看一个例子在文件描述符一章节中,我们还记得fd.closeAll()  方法来执行所谓的"释放所有相关资源"那不是释放了所有的么?为什么同一个File还可以打开多个流,关闭不受影响呢?根本在于上面说到的构造方法中 FileInputStream(FileDescriptor fdObj) 版本直接赋值参数到fd FileInputStream(File file)  每次都是new FileDescriptor(); 他们对于使用File构造的,他们的fd每次都是新建的!!!!! 所以说不受影响的 closeAll 的是同一个fd的

getFD()   getChannel() 

getFD()   getChannel()  就是返回他们的值如果fd不存在,抛出异常从构造方法可以看得出来, 必然会有一个fdgetChannel nio的后续再说,没有就创建一个

FileOutputStream

FileOutputStream 用于写入诸如图像数据之类的原始字节的流如果要写入字符流,请考虑使用 FileWriter

FileOutputStream的字段除了append以外,跟FileInputStream一样的, 含义作用 也是一样的append 表示字节写入文件末尾处,而不是写入文件开始处,因为 文件输出字节流默认是数据写入文件开始部位

就像刚才说的那样,字段除了append以外,跟FileInputStream是一样的,含义也是一样的 进而,构造方法也是一样,只不过多了一个参数  append 这个boolean 类型的参数,正是用来设置append 标志是否是追加写 方法的内容都差不多的,我们不在详细介绍

write方法

write方法还是家族遗传的,本质不变直接写入一个字节,或者从数组中写入字节到文件

write(int) 将指定字节写入此文件输出流

write(byte[] b)  将 b.length 个字节从指定 byte 数组写入此文件输出流中

write(byte[] b,int off, int len)   将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流

和输入一样,借助于操作系统,,依赖于本地方法

getFD()   getChannel() close()  和 FileInputStream中的一模一样

代码都是一样的,不再赘述

再一次的介绍了一对成员,你会发现越往后看越简单,因为他们的套路大多数是一样的

所以只需要自顶而下的了解清楚各个逻辑组成部分的含义功能

整个IO体系会越来越容易理解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Java多线程编程

1)设计更复杂 虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂。在多线程访问共享数据的时候,这部分代码需要特别的注意。线程之间的交互往往...

20920
来自专栏我是业余自学C/C++的

free()

17340
来自专栏大闲人柴毛毛

Java并发编程的艺术(三)——volatile

1. 并发编程的两个关键问题 并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行;但往往多条线程之间需要共享数据,此时在并...

44670
来自专栏肖洒的博客

【更正】Java调用Python

该方法可以解决传递形参的问题。也可以执行Python程序。 遇到的问题:需要确定好jython的路径问题和其他设置的路径问题。

13130
来自专栏java工会

反射在微信公众平台开发中的应用

14940
来自专栏马洪彪

Java设计模式(二)抽象工厂模式

一、场景描述 接《Java设计模式(一)工厂模式》 工厂模式有一缺点,就是破坏了类的封闭性原则。例如,如果需要增加Word文件的数据采集,此时按以下步骤操作: ...

421100
来自专栏深度学习之tensorflow实战篇

python连接SQL报错:1366, "Incorrect string value: '\\xF0\\x9F\\x98\\x81'

问题描述:Python从百度地图抓取消息保存到MySQL数据中,对应数据库字段为varchar以及TEXT,字符编码utf-8。部分插入成功,部分插入失败,报错...

37950
来自专栏Java成长之路

深入理解多线程

多线程是java中比较重要的一部分内容,使用多线程有许多的优点: - 提高应用程序的响应。对图形化界面更有意义,可增强用户体验。 - 程序需要实现一些需...

23130
来自专栏大内老A

ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上

ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效。如果我们能...

22380
来自专栏决胜机器学习

PHP面向对象核心(三)——反射、异常处理

PHP面向对象核心(三) (原创内容,转载请注明来源,谢谢) 五、反射 1、反射即PHP运行过程中,提取出关于类、方法、属性、参数等信息,包括 注释信息。动态获...

362120

扫码关注云+社区

领取腾讯云代金券