Java IO(三) 之 FileInputStream

前言:

对于文件系统中的文件,都可以使用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流在本系列文章中会一一讲解。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 22:11:31

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

系统学习 Java IO (三)----FileInputStream/FileOutputStream & RandomAccessFile

目录:系统学习 Java IO---- 目录,概览 FileInputStream 这是一个简单的FileInputStream示例: InputStream input = new FileInputStream("D:\\input.txt"); int data = input.read(); while(data != -1) { //do something with data... doSomethingWithData(data); data = input.read()

java IO(三):字符流

*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-template_comment, .diff .hljs-header, .hljs-javadoc { color: #998; font-style: italic; } .hljs-keyword, .css .rule .hljs-keyword, .h

Java IO流 之 FileInputStream

http://www.verejava.com/?id=1699463753077 package com.io; import java.io.*; public class TestInputStream2 { public static void main(String[] args) { try { //建立了跟文件 english.txt 的连接 InputStream is=new FileInputStream(new File("res/english.txt"));

Java IO流 之 FileInputStream 读取文件

http://www.verejava.com/?id=1699461971466 package com.io; import java.io.*; public class TestInputStream { public static void main(String[] args) { InputStream is=null; try { //建立了跟文件 english.txt 的连接 is=new FileInputStream(new File("res/english.txt&q

Java IO(三)--输入流和输出流简介

I/O流分类: InputStream和Read的子类都有read(),用来读取单个字节或字节数组 OutputStream和write的子类都有write(),用来写入单个字节或字节数组 一般都是通过装饰器Decorator模式叠加多个对象提供所期望的功能.创建单一的流,却需要创建多个对象 InputStream: InputStream为字节输入流,一般都是通过其子类实现功能,是所有字节输入流的基类 public abstract class InputStream implements C

Java IO: FileInputStream

原文链接 作者: Jakob Jenkov 译者: 李璟([email protected]) FileInputStream可以以字节流的形式读取文件内容.FileInputStream是InputStream的子类,这意味着你可以把FileInputStream当做InputStream使用(FileInputStream与InputStream的行为类似). 这是一个FileInputStream的例子: 01 InputStream input = new FileInputStream

Java IO基础知识(上)

Java IO概述 IO是整个人机交互的核心问题,因为IO是计算机获取和交换数据的主要渠道. 整个IO的流程就是 源数据--->程序--->目的地 IO的分类 基于字符操作的IO接口:Reader,Writer 基于字节操作的IO接口:InputStream,OutputStream 基于磁盘操作的IO接口:File 基于网络操作的IO接口:Socket(不在java.io包下面,但是socket的本质也是io操作) 一个程序需要InputStream或者Reader从数据源读取数据,需要Ou

Java基础---IO(三)--IO包中的其他类

第一讲     对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStream 二.特有方法 ObjectInputStream: Object readObject();//从ObjcetInputStream中读取对象 ObjectOutputStream: void writeObject(Objcet obj);//将指定对象写入ObjcetOutputStream

黑马程序员——Java基础---IO(三)--File类、Properties类、打印流、序列流(合并流)

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作,因此是对流操作的一种补充 3)File类的实例是不可变的:也就是说,一旦创建,