Index: src/java/org/apache/lucene/store/FSDirectory.java
===================================================================
--- src/java/org/apache/lucene/store/FSDirectory.java	(revision 488722)
+++ src/java/org/apache/lucene/store/FSDirectory.java	(working copy)
@@ -25,6 +25,8 @@
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Hashtable;
+import java.nio.channels.FileChannel;
+import java.nio.ByteBuffer;
 
 import org.apache.lucene.index.IndexFileNameFilter;
 
@@ -500,19 +502,21 @@
     // remember if the file is open, so that we don't try to close it
     // more than once
     private boolean isOpen;
-    long position;
     final long length;
+    final FileChannel channel;
     
     public Descriptor(File file, String mode) throws IOException {
       super(file, mode);
       isOpen=true;
       length=length();
+      channel = this.getChannel();
     }
 
     public void close() throws IOException {
       if (isOpen) {
         isOpen=false;
         super.close();
+        // RandomAccessFile.close() will close the channel also
       }
     }
 
@@ -528,6 +532,7 @@
   private final Descriptor file;
   boolean isClone;
 
+
   public FSIndexInput(File path) throws IOException {
     file = new Descriptor(path, "r");
   }
@@ -535,20 +540,13 @@
   /** IndexInput methods */
   protected void readInternal(byte[] b, int offset, int len)
        throws IOException {
-    synchronized (file) {
-      long position = getFilePointer();
-      if (position != file.position) {
-        file.seek(position);
-        file.position = position;
-      }
-      int total = 0;
-      do {
-        int i = file.read(b, offset+total, len-total);
-        if (i == -1)
-          throw new IOException("read past EOF");
-        file.position += i;
-        total += i;
-      } while (total < len);
+    long pos = getFilePointer();
+    int total=0;
+    while (total<len) {
+      ByteBuffer bytebuf = ByteBuffer.wrap(b, offset+total, len-total);
+      int i = file.channel.read(bytebuf, pos+total);
+      if (i == -1) throw new IOException("read past EOF");
+      total += i;
     }
   }
 
