接下来介绍 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) 版本直接赋值参数到fd
FileInputStream(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不存在,抛出异常
从构造方法可以看得出来, 必然会有一个fd
getChannel 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体系会越来越容易理解


[八]JavaIO之FileInputStream 与 FileOutputStream的更多相关文章

  1. java基础知识回顾之javaIO类---FileInputStream和FileOutputStream字节流复制图片

    package com.lp.ecjtu; import java.io.FileInputStream; import java.io.FileNotFoundException; import j ...

  2. java-IO流-字节流-概述及分类、FileInputStream、FileOutputStream、available()方法、定义小数组、BufferedInputStream、BufferedOutputStream、flush和close方法的区别、流的标准处理异常代码

    1.IO流概述及其分类 * 1.概念      * IO流用来处理设备之间的数据传输      * Java对数据的操作是通过流的方式      * Java用于操作流的类都在IO包中      *  ...

  3. 【Java IO】FileInputStream 和 FileOutputStream

    class FileInputStream extends  InputStream implements Closeable

  4. 2016-9-6 批量给文件名的前面加上“igeek_高薪就业” 2、 利用FileInputStream和FileOutputStream复制文件

    在此只列出典型题目,有的题目扫一眼就有代码的不去浪费时间了,想要完整题目的评论留邮箱,看到就发.持续更新中... 1.批量给文件名的前面加上“igeek_高薪就业” package com.work; ...

  5. java中OutputStream字节流与字符流InputStreamReader 每一种基本IO流BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWriter,FileInputStream,FileReader,FileWriter,InputStr

    BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWri ...

  6. 深入解析FileInputStream和FileOutputStream

    http://swiftlet.net/archives/1363 FileInputStream和FileOutputStream类属于字节类,可以操作任意类型的文件.在数据流的处理过程中,有两种情 ...

  7. FileInputStream和FileOutputStream详解

    一.引子 文件,作为常见的数据源.关于操作文件的字节流就是 FileInputStream & FileOutputStream.它们是Basic IO字节流中重要的实现类.二.FileInp ...

  8. [十八]JavaIO之FileReader 和 FileWriter

    简介 FileReader FileWriter 都是提供操作文件的便捷类 这两个类的实现非常的简单 原理 回忆下之前的InputStreamReader和OutputStreamWriter Inp ...

  9. java io系列07之 FileInputStream和FileOutputStream

    本章介绍FileInputStream 和 FileOutputStream 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_07.html File ...

随机推荐

  1. js 原生转json 可以v8中运行

    // load("D:/jsontest.js"); function test1(vvv) { print(vvv); } //把json str 转 json obj func ...

  2. 自制vbs消息轰炸机

    自制消息轰炸机 目标 做一个简单的,可以自己输入参数的vbs程序 准备 电脑qq 脚本设计成了可以指定发给某个好友轰炸的形式,在写好以后容错性比较强,但这意味着你想换人的话,需要重新改代码 vbs脚本 ...

  3. tmux使用中出现的问题和解决方式

    常用操作: tmux ls 看当前都有哪些sessiontmux new -s my1 创建窗口,名为my1ctrl+B,D 退出窗口 (这个就是同时按ctrl和B,然后松开后再按D键)tmux at ...

  4. C++ 初步

    c++新特性: 1. 初始化方法: 复制初始化 int x=1024; 直接初始化 int x (1024); 2.变量随用随定义 3.增加bool数据类型 输入输出: cout<<x; ...

  5. App间相互跳转及图片分享

    A-app: Info--URL Types--URL Schemes:A-app(一个标识,允许别的app调用本App) info.plist 添加白名单: LSApplicationQueries ...

  6. 使用secureCRT和Telnet将文件压缩导出到Ubuntu中,到Ubuntu中加压缩发现:tar解压包的时候出现错误gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now

    细节描述: 问题如题所示:查找博客园和CSDN上查找问题,得到问题解决方法大致如下: 1 修改解压缩命令: 由 tar zxvf software_package.tar.gz变为tar xvf so ...

  7. Hadoop-HA机制工作原理

    一.Hadoop 系统架构 1.1 Hadoop1.x和Hadoop2.x 架构 在介绍HA之前,我们先来看下Hadoop的系统架构,这对于理解HA是至关重要的.Hadoop 1.x之前,其官方架构如 ...

  8. Winform 窗体获得焦点

    给窗体添加Shown事件 public void Form_Shown(object sender, EventArgs e) { this.Activate(); this.Focus(); //定 ...

  9. ssh 报error: kex protocol error: type 30 seq 1

    由于近期服务器升级了openssl,在使用navicat连接数据库报 查看日志 sshd[1990]: error: kex protocol error: type 30 seq 1 [preaut ...

  10. php-cgi占用太多cpu资源而导致服务器响应过慢

    服务器环境:redhat linux 5.5 , nginx ,  phpfastcgi 在此环境下,一般php-cgi运行是非常稳定的,但也遇到过php-cgi占用太多cpu资源而导致服务器响应过慢 ...