//package org.javacore.io;
//
//import java.io.File;
//import java.io.FileDescriptor;
//import java.io.FileNotFoundException;
//import java.io.IOException;
//import java.io.InputStream;
//import java.nio.channels.FileChannel;
//
//import sun.misc.IoTrace;
//import sun.nio.ch.FileChannelImpl;
//
///**
// * FileInputStream 从文件系统的文件中获取输入字节流。文件取决于主机系统。
// * 比如读取图片等的原始字节流。如果读取字符流,考虑使用 FiLeReader。
// */
//public class SFileInputStream extends InputStream
//{
// /* 文件描述符类---此处用于打开文件的句柄 */
// private final FileDescriptor fd;
//
// /* 引用文件的路径 */
// private final String path;
//
// /* 文件通道,NIO部分 */
// private FileChannel channel = null;
//
// private final Object closeLock = new Object();
// private volatile boolean closed = false;
//
// private static final ThreadLocal<Boolean> runningFinalize =
// new ThreadLocal<>();
//
// private static boolean isRunningFinalize() {
// Boolean val;
// if ((val = runningFinalize.get()) != null)
// return val.booleanValue();
// return false;
// }
//
// /* 通过文件路径名来创建FileInputStream */
// public FileInputStream(String name) throws FileNotFoundException {
// this(name != null ? new File(name) : null);
// }
//
// /* 通过文件来创建FileInputStream */
// 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();
// }
// if (file.isInvalid()) {
// throw new FileNotFoundException("Invalid file path");
// }
// fd = new FileDescriptor();
// fd.incrementAndGetUseCount();
// this.path = name;
// open(name);
// }
//
// /* 通过文件描述符类来创建FileInputStream */
// public FileInputStream(FileDescriptor fdObj) {
// SecurityManager security = System.getSecurityManager();
// if (fdObj == null) {
// throw new NullPointerException();
// }
// if (security != null) {
// security.checkRead(fdObj);
// }
// fd = fdObj;
// path = null;
// fd.incrementAndGetUseCount();
// }
//
// /* 打开文件,为了下一步读取文件内容。native方法 */
// private native void open(String name) throws FileNotFoundException;
//
// /* 从此输入流中读取一个数据字节 */
// public int read() throws IOException {
// Object traceContext = IoTrace.fileReadBegin(path);
// int b = 0;
// try {
// b = read0();
// } finally {
// IoTrace.fileReadEnd(traceContext, b == -1 ? 0 : 1);
// }
// return b;
// }
//
// /* 从此输入流中读取一个数据字节。native方法 */
// private native int read0() throws IOException;
//
// /* 从此输入流中读取多个字节到byte数组中。native方法 */
// private native int readBytes(byte b[], int off, int len) throws IOException;
//
// /* 从此输入流中读取多个字节到byte数组中。 */
// public int read(byte b[]) throws IOException {
// Object traceContext = IoTrace.fileReadBegin(path);
// int bytesRead = 0;
// try {
// bytesRead = readBytes(b, 0, b.length);
// } finally {
// IoTrace.fileReadEnd(traceContext, bytesRead == -1 ? 0 : bytesRead);
// }
// return bytesRead;
// }
//
// /* 从此输入流中读取最多len个字节到byte数组中。 */
// public int read(byte b[], int off, int len) throws IOException {
// Object traceContext = IoTrace.fileReadBegin(path);
// int bytesRead = 0;
// try {
// bytesRead = readBytes(b, off, len);
// } finally {
// IoTrace.fileReadEnd(traceContext, bytesRead == -1 ? 0 : bytesRead);
// }
// return bytesRead;
// }
//
//
// public native long skip(long n) throws IOException;
//
// /* 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。 */
// public native int available() throws IOException;
//
// /* 关闭此文件输入流并释放与此流有关的所有系统资源。 */
// public void close() throws IOException {
// synchronized (closeLock) {
// if (closed) {
// return;
// }
// closed = true;
// }
// if (channel != null) {
// fd.decrementAndGetUseCount();
// channel.close();
// }
//
// int useCount = fd.decrementAndGetUseCount();
//
// if ((useCount <= 0) || !isRunningFinalize()) {
// close0();
// }
// }
//
// public final FileDescriptor getFD() throws IOException {
// if (fd != null) return fd;
// throw new IOException();
// }
//
// /* 获取此文件输入流的唯一FileChannel对象 */
// public FileChannel getChannel() {
// synchronized (this) {
// if (channel == null) {
// channel = FileChannelImpl.open(fd, path, true, false, this);
// fd.incrementAndGetUseCount();
// }
// return channel;
// }
// }
//
// private static native void initIDs();
//
// private native void close0() throws IOException;
//
// static {
// initIDs();
// }
//
// protected void finalize() throws IOException {
// if ((fd != null) && (fd != FileDescriptor.in)) {
// runningFinalize.set(Boolean.TRUE);
// try {
// close();
// } finally {
// runningFinalize.set(Boolean.FALSE);
// }
// }
// }
//}