前言:

对于文件系统中的文件。都能够使用FileInputStream流类以二进制的形式进行读取。可是因为Java本身的定位在JVM之上,没有处理计算机底层的能力。因此一些涉及底层处理的方法都是使用native方法调用第三方底层语言进行处理的。

本人重在解说FileInputStream类的内部实现。不会对其应用过分的解说。

FileInputStream的类图:

解析:

FileInputStream重载了3个构造方法。能够通过以下三种方式初始输入流:

public FileInputStream(String name) throws FileNotFoundException;

:以路径的方式初始一个输入流。其内部调用的是以下的构造方法

public FileInputStream(File file) throws FileNotFoundException;

:以File实例的方法初始一个输入流

public FileInputStream(FileDescriptor fdObj);

:以FileDescriptor实例初始一个输入流(FileDescriptor是一个文件描写叙述符)

FileInputStream内部记录了几个属性,用来标识输入流的状态:

private final String path;

:文件的路径信息

private final Object closeLock = new Object();

:关闭时的同步锁

private volatile boolean closed = false;

FileInputStream内部,有几个native类型的方法,用于调用底层语言来完整对于文件系统的操作:

private native void open0(String name) throws FileNotFoundException;

:打开文件

private native int read0() throws IOException;

:读取一个字节

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

:读取指定字节数

public native long skip(long n) throws IOException;

:丢弃指定字节,下次读取时,从丢弃后的位置開始读取

public native int available() throws IOException;

:获取文件接下来的文件长度

private static native void initIDs();

private native void close0() throws IOException;

:关闭文件

FileInputStream流类内部提供了一种对于文件操作的机制,可是因为Java语言的局限,FileInputStream须要通过native方法调用底层语言实现。

例如以下简单演示样例:

public class FileInTest {

    public static void main(String[] args) throws FileNotFoundException {

        InputStream is = new FileInputStream("F:/shiro-config.ini");

        int i;
try {
i = is.read(); while (i != -1) {
System.out.println((char) i);
i = is.read();
}
is.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} } }

在实际应用中。FileInputStream并不常单独使用,须要与其它装饰流一起使用,来达到更加简便的操作文件。

其它的IO流在本系列文章中会一一解说。

Java IO(三) 之 FileInputStream的更多相关文章

  1. java IO(三):字符流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  2. Java IO(三)

    File File类的常见方法: 1.创建. boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立就创建文 ...

  3. Java IO(三)--字节流基本使用

    I/O流分类: InputStream和Read的子类都有read(),用来读取单个字节或字节数组 OutputStream和write的子类都有write(),用来写入单个字节或字节数组 一般都是通 ...

  4. 系统学习 Java IO (三)----文件类 File

    目录:系统学习 Java IO---- 目录,概览 Java IO API 中的 File 类可以访问基础文件系统. 使用 File 类,可以: 检查文件或目录是否存在. 如果目录不存在,创建一个目录 ...

  5. java Io流中FileInputStream和BufferedInputStream的速度比较

    首先是对FileInputStream 加上 FileOutputStream 对文件拷贝的应用 我这里拷贝的是一个视频.当然,你们拷贝什么都可以,当文件越大时效果越明显 下面是对BufferedIn ...

  6. Java IO: FileInputStream

    原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) FileInputStream可以以字节流的形式读取文件内容.FileInputStream ...

  7. 系统学习 Java IO ---- 目录,概览

    Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...

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

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

  9. [转]探究java IO之FileInputStream类

    使用FileInputStream类创建的InputStream对象可以用于从文件读取内容.两个常用的构造函数如下所示: ? 1 2 FileInputStream(String filePath) ...

随机推荐

  1. SQL-Oracle-创建表空间,用户,授权

    --创建表空间 create tablespace imark datafile 'E:\oracle\product\10.2.0\oradata\orcl\imark.dbf' size 500M ...

  2. 【C语言】编写函数实现字符串旋转

    //编写函数实现字符串旋转 #include <stdio.h> #include <assert.h> #include <string.h> void reve ...

  3. Android应用之——自己定义控件ToggleButton

    我们经常会看到非常多优秀的app上面都有一些非常美丽的控件,用户体验非常好.比方togglebutton就是一个非常好的样例,IOS系统以下那个精致的togglebutton现在在android以下也 ...

  4. UVA - 11021 - Tribles 递推概率

    GRAVITATION, n.“The tendency of all bodies to approach one another with a strengthproportion to the ...

  5. 引入jquery.js和jquery-1.10.2.min.js 发生冲突解决办法

    <html><head></head><body><body><div id = "a">a</div ...

  6. poj--3630--Phone List(字典树+前缀判断)

    Phone List Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit St ...

  7. QT-解除connect

    前言:解除关联. 一.新建工程 二.新建部件 在ui设计界面拖入一个line edit,一个label以及两个button按钮 右键“关联”按钮转到槽,选择clicked(),添加如下代码: void ...

  8. Spark RDD概念学习系列之transformation操作

    不多说,直接上干货! transformation操作 惰性求值 (1)RDD 的转化操作都是惰性求值的.这意味着在被调用行动操作之前Spark不会开始计算. (2)读取数据到RDD的操作也是惰性的. ...

  9. css3子级高度与父级同高,内容垂直居中

    .E-wrap{ overflow: hidden; position: relative; border: 1px solid #ccc; margin: 30px auto 0; width: 5 ...

  10. 安装wampserver遇到的问题及解决方案

    丢失api-ms-win-crt-runtime-l1-1-0.dll 安装完wampserver,启动服务器的时候遇到一些问题,提示说缺失dll文件,如下图所示: 网上一搜,很多人出现过丢失api- ...