< prev index next >
src/java.base/share/classes/java/io/FileInputStream.java
Print this page
@@ -60,10 +60,13 @@
private volatile FileChannel channel;
private final AtomicBoolean closed = new AtomicBoolean(false);
+ private boolean direct = false;
+
+ private int pageSize = -1;
/**
* Creates a <code>FileInputStream</code> by
* opening a connection to an actual file,
* the file named by the path name <code>name</code>
* in the file system. A new <code>FileDescriptor</code>
@@ -94,10 +97,45 @@
}
/**
* Creates a <code>FileInputStream</code> by
* opening a connection to an actual file,
+ * the file named by the path name <code>name</code>
+ * in the file system. If the second parameter is
+ * <code>true</code>, bytes are directly read from
+ * storage media. A new <code>FileDescriptor</code>
+ * object is created to represent this file connection.
+ * <p>
+ * First, if there is a security
+ * manager, its <code>checkRead</code> method
+ * is called with the <code>name</code> argument
+ * as its argument.
+ * <p>
+ * If the named file does not exist, is a directory rather than a regular
+ * file, or for some other reason cannot be opened for reading then a
+ * <code>FileNotFoundException</code> is thrown.
+ *
+ * @param name the system-dependent file name.
+ * @param direct if <code>true</code>, then bytes will be read
+ * directly to storage media
+ * @exception FileNotFoundException if the file does not exist,
+ * is a directory rather than a regular file,
+ * or for some other reason cannot be opened for
+ * reading.
+ * @exception SecurityException if a security manager exists and its
+ * <code>checkRead</code> method denies read access
+ * to the file.
+ * @see java.lang.SecurityManager#checkRead(java.lang.String)
+ * @since 1.9
+ */
+ public FileInputStream(String name, boolean direct) throws FileNotFoundException {
+ this(name != null ? new File(name): null, direct);
+ }
+
+ /**
+ * Creates a <code>FileInputStream</code> by
+ * opening a connection to an actual file,
* the file named by the <code>File</code>
* object <code>file</code> in the file system.
* A new <code>FileDescriptor</code> object
* is created to represent this file connection.
* <p>
@@ -119,25 +157,11 @@
* <code>checkRead</code> method denies read access to the file.
* @see java.io.File#getPath()
* @see java.lang.SecurityManager#checkRead(java.lang.String)
*/
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.attach(this);
- path = name;
- open(name);
+ this(file, false);
}
/**
* Creates a <code>FileInputStream</code> by using the file descriptor
* <code>fdObj</code>, which represents an existing connection to an
@@ -179,22 +203,74 @@
*/
fd.attach(this);
}
/**
+ * Creates a <code>FileInputStream</code> by opening a connection to an
+ * actual file with O_DIRECT option, the file named by the <code>
+ * File</code> object <code>file </code> in the file system. A new <code>
+ * FileDescriptor</code> object is created to represent this file connection.
+ * <p>
+ * First, if there is a security manager, its <code>checkRead</code>
+ * method is called with the path represented by the <code>file</code>
+ * argument as its argument.
+ * <p>
+ * If the named file does not exist, is a directory rather than a regular
+ * file, or for some other reason cannot be opened for reading then a
+ * <code>FileNotFoundException</code> is thrown.
+ * @param file the file to be opened for reading.
+ * @param direct if <code>true</code>, then bytes will be read
+ * directly to storage media
+ * @exception FileNotFoundException if the file does not exist, is a
+ * directory rather than a regular file, or for some
+ * other reason cannot be opened for reading.
+ * @exception SecurityException if a security manager exists
+ */
+ public FileInputStream(File file, boolean direct) throws FileNotFoundException {
+ this.direct = direct;
+ if (direct) {
+ getPageSize();
+ }
+ 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.attach(this);
+ path = name;
+ open(name);
+ }
+
+ /**
* Opens the specified file for reading.
* @param name the name of the file
*/
- private native void open0(String name) throws FileNotFoundException;
+ private native void open0(String name, boolean direct) throws FileNotFoundException;
// wrap native call to allow instrumentation
/**
* Opens the specified file for reading.
* @param name the name of the file
*/
private void open(String name) throws FileNotFoundException {
- open0(name);
+ open0(name, direct);
+ }
+
+ private native int getPageSize0();
+
+ private int getPageSize() {
+ if (pageSize == -1) {
+ pageSize = getPageSize0();
+ }
+ return this.pageSize;
}
/**
* Reads a byte of data from this input stream. This method blocks
* if no input is yet available.
@@ -217,10 +293,19 @@
* @exception IOException If an I/O error has occurred.
*/
private native int readBytes(byte b[], int off, int len) throws IOException;
/**
+ * Reads a subarray as a sequence of bytes with DirectIO.
+ * @param b the data to be written
+ * @param off the start offset in the data
+ * @param len the number of bytes that are written
+ * @exception IOException If an I/O error has occurred.
+ */
+ private native int readBytesD(byte b[], int off, int len) throws IOException;
+
+ /**
* Reads up to <code>b.length</code> bytes of data from this input
* stream into an array of bytes. This method blocks until some input
* is available.
*
* @param b the buffer into which the data is read.
@@ -228,10 +313,12 @@
* <code>-1</code> if there is no more data because the end of
* the file has been reached.
* @exception IOException if an I/O error occurs.
*/
public int read(byte b[]) throws IOException {
+ if (direct)
+ return readBytesD(b, 0, b.length);
return readBytes(b, 0, b.length);
}
/**
* Reads up to <code>len</code> bytes of data from this input stream
@@ -250,10 +337,12 @@
* <code>len</code> is negative, or <code>len</code> is greater than
* <code>b.length - off</code>
* @exception IOException if an I/O error occurs.
*/
public int read(byte b[], int off, int len) throws IOException {
+ if (direct)
+ return readBytesD(b, off, len);
return readBytes(b, off, len);
}
/**
* Skips over and discards <code>n</code> bytes of data from the
< prev index next >