[八]JavaIO之FileInputStream 与 FileOutputStream
接下来介绍 FileInputStream 和 FileOutputStream
他就是从一个文件中读取数据
|
或者将数据写入到一个文件中 |
既然是从文件读取数据,那么自然要记录文件本身的信息 所以有文件描述符 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) 版本直接赋值参数到fd FileInputStream(File file) 每次都是new FileDescriptor(); |
read方法读取一个字节 带数组参数的read方法将数据读取到字节数组中,并且返回实际读取的个数 跟InputStream是一样的 看得出来,如同我们之前说过的那样,文件的读写操作依赖于操作系统,所以 所有的read都歇菜了,最终依赖的都是本地方法 还有一个需要时刻记住的是,read 阻塞选手 |
![]() |
连读的能力都没有,需要借助本地方法 自然是没有能力跳过和获取可用个数的 所以仍旧是依赖的本地方法 |
|
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() 就是返回他们的值 如果fd不存在,抛出异常 从构造方法可以看得出来, 必然会有一个fd getChannel nio的后续再说,没有就创建一个 |
![]() |
![]() |
FileOutputStream 用于写入诸如图像数据之类的原始字节的流 如果要写入字符流,请考虑使用 FileWriter |
FileOutputStream的字段除了append以外,跟FileInputStream一样的, 含义作用 也是一样的![]() append 表示字节写入文件末尾处,而不是写入文件开始处,因为 文件输出字节流默认是数据写入文件开始部位 |
就像刚才说的那样,字段除了append以外,跟FileInputStream是一样的,含义也是一样的
进而,构造方法也是一样,只不过多了一个参数 append
这个boolean 类型的参数,正是用来设置append 标志是否是追加写
方法的内容都差不多的,我们不在详细介绍
|
![]() |
write方法还是家族遗传的,本质不变 直接写入一个字节,或者从数组中写入字节到文件 |
write(int) 将指定字节写入此文件输出流 |
write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中 |
write(byte[] b,int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流
|
和输入一样,借助于操作系统,,依赖于本地方法![]() |
[八]JavaIO之FileInputStream 与 FileOutputStream的更多相关文章
- java基础知识回顾之javaIO类---FileInputStream和FileOutputStream字节流复制图片
package com.lp.ecjtu; import java.io.FileInputStream; import java.io.FileNotFoundException; import j ...
- java-IO流-字节流-概述及分类、FileInputStream、FileOutputStream、available()方法、定义小数组、BufferedInputStream、BufferedOutputStream、flush和close方法的区别、流的标准处理异常代码
1.IO流概述及其分类 * 1.概念 * IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * ...
- 【Java IO】FileInputStream 和 FileOutputStream
class FileInputStream extends InputStream implements Closeable
- 2016-9-6 批量给文件名的前面加上“igeek_高薪就业” 2、 利用FileInputStream和FileOutputStream复制文件
在此只列出典型题目,有的题目扫一眼就有代码的不去浪费时间了,想要完整题目的评论留邮箱,看到就发.持续更新中... 1.批量给文件名的前面加上“igeek_高薪就业” package com.work; ...
- java中OutputStream字节流与字符流InputStreamReader 每一种基本IO流BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWriter,FileInputStream,FileReader,FileWriter,InputStr
BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWri ...
- 深入解析FileInputStream和FileOutputStream
http://swiftlet.net/archives/1363 FileInputStream和FileOutputStream类属于字节类,可以操作任意类型的文件.在数据流的处理过程中,有两种情 ...
- FileInputStream和FileOutputStream详解
一.引子 文件,作为常见的数据源.关于操作文件的字节流就是 FileInputStream & FileOutputStream.它们是Basic IO字节流中重要的实现类.二.FileInp ...
- [十八]JavaIO之FileReader 和 FileWriter
简介 FileReader FileWriter 都是提供操作文件的便捷类 这两个类的实现非常的简单 原理 回忆下之前的InputStreamReader和OutputStreamWriter Inp ...
- java io系列07之 FileInputStream和FileOutputStream
本章介绍FileInputStream 和 FileOutputStream 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_07.html File ...
随机推荐
- 数据分析——pyecharts
导入类库 from pyecharts import Pie, Bar, Gauge, EffectScatter, WordCloud, Map, Grid, Line, Timeline impo ...
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.e3mall.search.mapper.ItemMapper.getItemList
java.lang.RuntimeException: org.apache.ibatis.binding.BindingException: Invalid bound statement (not ...
- 对象池----unity中应用
对象池应用在unity中能减少资源消耗,节省内存空间具体原理不再赘述. 以下是他的操作步骤:(注意:对象池中应用到了栈或对队列!) 1).先建立一个(怪物)物体 mMonster; 2).再建立一 ...
- js中的观察者模式
什么事观察者模式: 这是一种创建松散耦合代码的技术.它定义对象间 一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.由主体和观察者组成,主体负责发布事件,同时观察者通过 ...
- 大数据BI框架知识点备注
将这段时间的一些基于大数据方案的BI知识点暂时做些规整,可能还存在较多问题,后续逐步完善修改. 数据模型: 1.星型模型和雪花模型,同样是将业务表拆分成事实表和纬度表:例如一个员工数据表,可以拆分为员 ...
- MongoDB 分片键的选择与案例
MongoDB版本:3.6 一.分片键类别 1.升序片键 升序片键例如:日期时间字段.自增字段. 2.随机分发片键 随机分发片键例如:用户名.邮件名.UUID.MD5值或者是其它的一些没有规律的值的列 ...
- Java中的锁——Lock和synchronized
上一篇Java中的队列同步器AQS 一.Lock接口 1.Lock接口和synchronized内置锁 a)synchronized:Java提供的内置锁机制,Java中的每个对象都可以用作一个实现同 ...
- 利用redis + lua解决抢红包高并发的问题
抢红包的需求分析 抢红包的场景有点像秒杀,但是要比秒杀简单点.因为秒杀通常要和库存相关.而抢红包则可以允许有些红包没有被抢到,因为发红包的人不会有损失,没抢完的钱再退回给发红包的人即可.另外像小米这样 ...
- i春秋官网4.0上线啦 文末有福利
爱瑞宝地(Everybody)期待了很久的 i春秋官网4.0上线啦 除了产品的功能更加完善 性能和体验也将大幅度提高 清新.舒适的视觉感受 搭配更加便捷的操作流程 只需一秒,扫码立即登录 即刻进入网络 ...
- [Swift]LeetCode306. 累加数 | Additive Number
Additive number is a string whose digits can form additive sequence. A valid additive sequence shoul ...