src/share/classes/java/io/FileInputStream.java

Print this page
rev 6099 : [mq]: io-trace

@@ -25,10 +25,12 @@
 
 package java.io;
 
 import java.nio.channels.FileChannel;
 import sun.nio.ch.FileChannelImpl;
+import sun.misc.IoTrace;
+import sun.misc.IoTraceContext;
 
 
 /**
  * A <code>FileInputStream</code> obtains input bytes
  * from a file in a file system. What files

@@ -49,10 +51,13 @@
 class FileInputStream extends InputStream
 {
     /* File Descriptor - handle to the open file */
     private final FileDescriptor fd;
 
+    /* The path of the referenced file (null if the stream is created with a file descriptor) */
+    private final String path;
+
     private FileChannel channel = null;
 
     private final Object closeLock = new Object();
     private volatile boolean closed = false;
 

@@ -123,10 +128,11 @@
         if (name == null) {
             throw new NullPointerException();
         }
         fd = new FileDescriptor();
         fd.attach(this);
+        this.path = name;
         open(name);
     }
 
     /**
      * Creates a <code>FileInputStream</code> by using the file descriptor

@@ -159,10 +165,11 @@
         }
         if (security != null) {
             security.checkRead(fdObj);
         }
         fd = fdObj;
+        path = null;
 
         /*
          * FileDescriptor is being shared by streams.
          * Register this stream with FileDescriptor tracker.
          */

@@ -181,11 +188,22 @@
      *
      * @return     the next byte of data, or <code>-1</code> if the end of the
      *             file is reached.
      * @exception  IOException  if an I/O error occurs.
      */
-    public native int read() throws IOException;
+    public int read() throws IOException {
+        IoTraceContext traceContext = IoTrace.fileReadBegin(path);
+        int b = 0;
+        try {
+            b = read0();
+        } finally {
+            IoTrace.fileReadEnd(traceContext, b == -1 ? 0 : 1);
+        }
+        return b;
+    }
+
+    private native int read0() throws IOException;
 
     /**
      * Reads a subarray as a sequence of bytes.
      * @param b the data to be written
      * @param off the start offset in the data

@@ -204,11 +222,18 @@
      *             <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 {
-        return readBytes(b, 0, b.length);
+        IoTraceContext traceContext = IoTrace.fileReadBegin(path);
+        int bytesRead = 0;
+        try {
+            bytesRead = readBytes(b, 0, b.length);
+        } finally {
+            IoTrace.fileReadEnd(traceContext, bytesRead);
+        }
+        return bytesRead;
     }
 
     /**
      * Reads up to <code>len</code> bytes of data from this input stream
      * into an array of bytes. If <code>len</code> is not zero, the method

@@ -226,11 +251,18 @@
      * <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 {
-        return readBytes(b, off, len);
+        IoTraceContext traceContext = IoTrace.fileReadBegin(path);
+        int bytesRead = 0;
+        try {
+            bytesRead = readBytes(b, off, len);
+        } finally {
+            IoTrace.fileReadEnd(traceContext, bytesRead);
+        }
+        return bytesRead;
     }
 
     /**
      * Skips over and discards <code>n</code> bytes of data from the
      * input stream.

@@ -337,11 +369,11 @@
      * @spec JSR-51
      */
     public FileChannel getChannel() {
         synchronized (this) {
             if (channel == null) {
-                channel = FileChannelImpl.open(fd, true, false, this);
+                channel = FileChannelImpl.open(fd, path, true, false, this);
             }
             return channel;
         }
     }