跟我学IO(FileInputStream类)

FileInputStream 从文件系统中的某个文件中获得输入字节。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。

FileInputStream 从文件系统中的某个文件中获得输入字节。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。 

构造FileInputStream输入流的方式如下:

1、通过文件对象File来构造。如:FileInputStream(File file)

// 构建一个file
File file = new File("document/stream_test.txt");
// 根据file对象创建文件输入流
FileInputStream input = new FileInputStream(file);

2、直接使用文件在系统中的URI进行创建

// 根据URI创建输入流
FileInputStream input = new FileInputStream("document/stream_test.txt");

3、通过文件描述对象来创建输入流

FileDescriptor fd = new FileDescriptor();
FileInputStream input = new FileInputStream(input);

FileInputStream.java源码分析:

public class FileInputStream extends InputStream {
    // 文件描述符对象
    private FileDescriptor fd;
    // 文件通道
    private FileChannel channel = null;

    public FileInputStream(String name) throws FileNotFoundException {
        // 内部也是用的File对象来获取输入流
        this(name != null ? new File(name) : null);
    }

    public FileInputStream(File file) throws FileNotFoundException {
        String name = (file != null ? file.getPath() : null);
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkRead(name);
        }
        if (name == null) {
            throw new NullPointerException();
        }
        fd = new FileDescriptor();
        open(name);
    }

    public FileInputStream(FileDescriptor fdObj) {
        SecurityManager security = System.getSecurityManager();
        if (fdObj == null) {
            throw new NullPointerException();
        }
        if (security != null) {
            security.checkRead(fdObj);
        }
        fd = fdObj;
    }

    public int read(byte b[]) throws IOException {
        return readBytes(b, 0, b.length);
    }

    public int read(byte b[], int off, int len) throws IOException {
        return readBytes(b, off, len);
    }
    
    // 关闭文件流
    public void close() throws IOException {
        if (channel != null)
            channel.close();
        close0();
    }

    // 获取文件描述对象
    public final FileDescriptor getFD() throws IOException {
	if (fd != null)
            return fd;
	throw new IOException();
    }

    // 获取文件通道,这个通道用于建立文件NIO操作
    public FileChannel getChannel() {
        synchronized (this) {
            if (channel == null)
                channel = FileChannelImpl.open(fd, true, false, this);
            return channel;
        }
    }

    // 初始化
    static {
        initIDs();
    }

    protected void finalize() throws IOException {
        if (fd != null) {
            if (fd != fd.in) {
                close();
            }
        }
    }

    // 本地方法(即通过C/C++来实现)
    private native void open(String name) throws FileNotFoundException;
    public native int read() 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;
}

从上面的源码可以看出,读取文件使用的是本地方法readBytes。这就说明java底层并不是用java代码直接操作文件,而是通过本地代码,如:C语言等进行文件操作。

实例:根据文件的URI获取文件输入流,然后输出文件内容到控制台。

FileInputStream input = null;
try {
    // 这个路径是根据当前路径的相对路劲
    File file = new File("document/stream_test.txt");
    input = new FileInputStream(file);
    int read = -1;
    while( (read = input.read()) != -1 ){
        System.out.print( (char)read );
    }
} catch(Exception e) {
    e.printStackTrace();
} finally {
    if ( null != input ) {
        try {
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            input = null;
        }
    }
}

实例:根据文件对象创建一个文件输入流,然后在控制台输出文件内容。

FileInputStream input = null;
try {
    input = new FileInputStream("document/stream_test.txt");
    int read = -1;
    while( (read = input.read()) != -1 ){
        System.out.print( (char)read );
    }
} catch(Exception e) {
    e.printStackTrace();
} finally {
    if ( null != input ) {
        try {
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            input = null;
        }
    }
}
在年轻人的颈项上,没有什么东西能比事业心这颗灿烂的宝珠更迷人的了。 —— 哈菲兹
1 不喜欢
说说我的看法 -
全部评论(
没有评论
目录
热门标签
热门文章
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号