转载请注明源出处:http://www.cnblogs.com/lighten/p/7001458.html

1.前言

  前五章按照JDK的类顺序介绍了几种流,第五章讲了Java的文件系统。本章介绍Java的第一个真正意义的流源头:文件流。之前介绍的都是一些流的装饰类,主要作用是更好的处理流的内容,比如缓存,读取内容等。ByteArray流可以说是一个伪源,其接受一个字节数组作为数据源。毫无疑问文件流涉及操作系统的文件,肯定是通过native方法进行读取。下面对其有些什么操作进行介绍。

2.FileInputStream

  FileInputStream是真正的输入源,不同于其它流,所以其不继承FilterInputStream,而是直接继承抽象父类InputStream。其构造函数如下:

  接收一个文件路径,或者是一个File实例,或者是一个FileDescriptor实例。这个类的介绍看第四小节。

  所有覆写抽象类的方法最终调用的都是native方法,所以也没有什么好说明的。唯一值得说明的就是close方法,其不止调用了native的close方法,还关闭了所有具有相同FileDescriptor实例的流。

3.FileOutputStream

  FileOutputStream的构造方法和输入流的差不多,但是区别在于多了一个boolean参数,也就是是否是追加模式。了解C语言的都知道,文件写入默认情况下都会丢弃之前文件中的内容,但是对文件也有追加的模式,就是在原内容最后继续写。Java也就是实现了相同的功能,默认也是false,即不追加,覆盖原文件内容。

  除了这一点,其它的也和FileInputStream的情况一样,覆写父类的方法都是调用了native方法,没有什么好讲的地方。

4 相关类介绍

4.1 FileDescriptor

  该类的实例被看作成一个不透明的句柄,句柄指向一个底层的机器特定的结构,可能表示一个打开的文件,一个打开的socket套接字,一个其它源或者是一些字节。主要实际的作用是用来创建一个FileInputStream或FileOutputStream实例并持有它。这个类结构比较简单,只有一个空参的构造函数,但是理解起来不太容易。先看一个例子再来理解其使用方法。

    @Test
public void test() throws IOException {
FileDescriptor descriptor = new FileDescriptor();
FileInputStream fis = new FileInputStream(descriptor);
try {
System.out.println(fis.read());
} catch (IOException e) {
System.out.println("fis执行异常");
}
String path = FileDescriptorTest.class.getClassLoader().getResource("").getPath()+"test.txt";
File file = new File(path);
fis = new FileInputStream(file);
descriptor = fis.getFD();
FileInputStream nfis = new FileInputStream(descriptor);
System.out.println("nfis>>>"+nfis.read());
FileInputStream sfis = new FileInputStream(descriptor);
System.out.println("sfis>>>"+sfis.read());
System.out.println("nfis>>>"+nfis.read());
nfis.close();
try {
System.out.println("sfis>>>"+sfis.read());
} catch(Exception e) {
System.out.println("nfis执行异常");
}
sfis.close();
fis.close();
}

  运行结果是:

  这个例子可以看出几点:1.直接new创建的FileDescriptor实例,生成的流是无效流。2.通过一个有效流获取的FileDescriptor可以用作生成一个新的流。3.所有共用相同FileDescriptor实例的流,其操作是相互影响的,比如A流读了一个字节,B流再读是读取下一个字节,如果A流关闭了,B流也会关闭。这个就是FileDescriptor的作用,其是一个句柄,可以被很多个流实例共享,但是操作是相互影响的。

  代码的逻辑很简单,但是看不出相互关联。网上找了一下,大致的意思是这个类是一个文件描述符或者说是一个句柄。按照我个人的理解就是这个类其实对应着硬件的一个资源,我们所创建的文件流其实只是一个Java实例,其与一个文件句柄相关联。如果不同的流有同一个文件句柄,那么操作就会互相干扰。至于文件句柄对应一个文件,负责真正的文件资源,打开,读取,写入,关闭,不在意是哪个流实例操作的,但是这个会对其它持有相同句柄的Java流产生影响,这个观点可能有所错误,如有清楚的,请指教一下。Java代码中流并没有对这个实例进行操作,只是调用native方法,也就调用attch方法与具体的流实例相互关联了,这个操作是不是JVM管理的不甚清楚。

  

Java之IO(六)FileInputStream和FileOutputStream的更多相关文章

  1. 【Java IO】FileInputStream 和 FileOutputStream

    class FileInputStream extends  InputStream implements Closeable

  2. Java API —— IO流( FileInputStream & FileOutputStream & BufferedInputStream & BufferedOutputStream )

    1.IO流概述 · IO流用来处理设备之间的数据传输        · 上传文件和下载文件        · Java对数据的操作是通过流的方式 · Java用于操作流的对象都在IO包中   2.IO ...

  3. Java之IO(零)总结

    转载请注明原出处:http://www.cnblogs.com/lighten/p/7274378.html 1.前言 本章是对之前所讲述的整个Java的IO包的一个总结,抽出个人认为比较重要的知识点 ...

  4. java io系列07之 FileInputStream和FileOutputStream

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

  5. 跟着刚哥梳理java知识点——IO(十五)

    凡是与输入.输出相关的类.接口都定义在java.io包下 java.io.File类 1.File是一个类,可以有构造器创建其对象.此对象对应着一个文件或者一个目录. 2.File中的类,仅涉及到如何 ...

  6. Java IO 之 FileInputStream & FileOutputStream源码分析

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

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

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

  8. Java IO流的写入和写出操作 FileInputStream和FileOutputStream

    今天学习了Java的IO流,关于文件的读入和写出,主要是FileInputStream和FileOutputStream来实现,这两个流是字节流.还有字符流(FileReader和FileWriter ...

  9. Java IO(五)字节流 FileInputStream 和 FileOutputStream

    Java IO(五)字节流 FileInputStream 和 FileOutputStream 一.介绍 字节流 InputStream 和 OutputStream 是字节输入流和字节输出流的超类 ...

随机推荐

  1. Python调用Google翻译

    出自:http://blog.csdn.net/zhaoyl03/article/details/8830806 最近想动手做一个文档自动下载器,需要模拟浏览器的行为.虽然感觉思路上没有困难,但在技术 ...

  2. hdu 5015 233矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=5015 需要构造一个 n+2 维的矩阵. 就是要增加一维去维护2333这样的序列. 可以发现 2333 = 233 ...

  3. poj2462

    看八戒在做这个题,我也做了做.. 坑很多,还是要注意细节.不得不吐槽,难道又到了计算几何只能套模板否则就一串WA的情况了么! 要不是八戒做出来了,这题我估计我也就扔到这里了..哥不服啊~所以得做出来! ...

  4. Bitcoin

    看李笑来老师的2013演讲——Bitcoin is not virtual currency,it is a real world. 1.由于bitcoin的算法中进行有上限量的发布,所以这是不会出现 ...

  5. [leetcode] 19. Count and Say

    这个还是一开始没读懂题目,题目如下: The count-and-say sequence is the sequence of integers beginning as follows: 1, 1 ...

  6. Excel中使用VBA进行度分秒与十进制度的转换

    发现Excel的VBA功能真是批量处理的一把利刃,工作中小试牛刀了一把,将Excel中度分秒形式的坐标批量处理成十进制度形式,处理完后用于GIS展点制图. 原Excel数据如下: VBA代码如下: S ...

  7. PLSQL(PL/SQL)集成Team Foundation Server (TFS),实现数据库代码的版本管理

    PL/SQL是面向Oralcle数据库的集成开发环境,是众多Oracle数据库开发人员的主要工具.由于PL/SQL(百度百科)不仅是一种SQL语言,更是一种过程编程语言,在项目实施过程中,会积累大量除 ...

  8. DBCC--SQLPERF

    ​提供所有数据库的事务日志空间使用情况统计信息.也可以用于重置等待和闩锁的统计信息. 语法: DBCC SQLPERF ( [ LOGSPACE ] | [ "sys.dm_os_latch ...

  9. Alwayson--配置只读请求

    场景:有三台服务器SQLNode131,SQLNode132 ,SQLNode133: 1) 三台服务器加入域DCDemo.com 2) 三台服务器使用端口访问数据库 3) 三台服务器构建故障转移群集 ...

  10. Xamarin.Forms第三方XAML预览工具-LiveXAML简单体验

    截至目前,Xamarin官方的Xaml Previewer工具仍然处于测试阶段,使用中也发现了各种不便,例如各种莫名其妙的渲染失败,或者提示需要编译项目才能渲染等等,复杂项目基本不可用, 完全没有体现 ...