// Only use when we know the seek in within the mapped segment. Throws an
  // IOException otherwise.
  public void seek(long pos) throws IOException {
    long inSegmentPos = pos - segmentOffset;
    if (inSegmentPos < 0 || inSegmentPos > buffer.capacity())
      throw new IOException(
          String.format(
              "Seek position %d is not within mmap segment (seg offs: %d, length: %d)",
              pos, segmentOffset, buffer.capacity()));

    position = (int) inSegmentPos;
  }
Example #2
0
  /**
   * Read the contents of a text file using a memory-mapped byte buffer.
   *
   * <p>A MappedByteBuffer, is simply a special ByteBuffer. MappedByteBuffer maps a region of a file
   * directly in memory. Typically, that region comprises the entire file, although it could map a
   * portion. You must, therefore, specify what part of the file to map. Moreover, as with the other
   * Buffer objects, no constructor exists; you must ask the java.nio.channels.FileChannel for its
   * map() method to get a MappedByteBuffer.
   *
   * <p>Direct buffers allocate their data directly in the runtime environment memory, bypassing the
   * JVM|OS boundary, usually doubling file copy speed. However, they generally cost more to
   * allocate.
   */
  private static String fastStreamCopy(String filename) {
    String s = "";
    FileChannel fc = null;
    try {
      fc = new FileInputStream(filename).getChannel();

      // int length = (int)fc.size();

      MappedByteBuffer byteBuffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
      // CharBuffer charBuffer =
      // Charset.forName("ISO-8859-1").newDecoder().decode(byteBuffer);

      // ByteBuffer byteBuffer = ByteBuffer.allocate(length);
      // ByteBuffer byteBuffer = ByteBuffer.allocateDirect(length);
      // CharBuffer charBuffer = byteBuffer.asCharBuffer();

      // CharBuffer charBuffer =
      // ByteBuffer.allocateDirect(length).asCharBuffer();
      /*
       * int size = charBuffer.length(); if (size > 0) { StringBuffer sb =
       * new StringBuffer(size); for (int count=0; count<size; count++)
       * sb.append(charBuffer.get()); s = sb.toString(); }
       *
       * if (length > 0) { StringBuffer sb = new StringBuffer(length); for
       * (int count=0; count<length; count++) {
       * sb.append(byteBuffer.get()); } s = sb.toString(); }
       */
      int size = byteBuffer.capacity();
      if (size > 0) {
        // Retrieve all bytes in the buffer
        byteBuffer.clear();
        byte[] bytes = new byte[size];
        byteBuffer.get(bytes, 0, bytes.length);
        s = new String(bytes);
      }

      fc.close();
    } catch (FileNotFoundException fnfx) {
      System.err.println("File not found: " + fnfx);
    } catch (IOException iox) {
      System.err.println("I/O problems: " + iox);
    } finally {
      if (fc != null) {
        try {
          fc.close();
        } catch (IOException ignore) {
          // ignore
        }
      }
    }
    return s;
  }
  /**
   * Regression for HARMONY-6315 - FileChannel.map throws IOException when called with size 0
   *
   * @throws IOException
   */
  public void testEmptyBuffer() throws IOException {
    // Map empty file
    FileInputStream fis = new FileInputStream(emptyFile);
    FileChannel fc = fis.getChannel();
    MappedByteBuffer mmb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());

    // check non-null
    assertNotNull("MappedByteBuffer created from empty file should not be null", mmb);

    // check capacity is 0
    int len = mmb.capacity();
    assertEquals("MappedByteBuffer created from empty file should have 0 capacity", 0, len);

    assertFalse(
        "MappedByteBuffer from empty file shouldn't be backed by an array ", mmb.hasArray());

    try {
      byte b = mmb.get();
      fail(
          "Calling MappedByteBuffer.get() on empty buffer should throw a BufferUnderflowException");
    } catch (BufferUnderflowException e) {
      // expected behaviour
    }

    // test expected exceptions thrown
    try {
      mmb = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size());
      fail("Expected NonWritableChannelException to be thrown");
    } catch (NonWritableChannelException e) {
      // expected behaviour
    }
    try {
      mmb = fc.map(FileChannel.MapMode.PRIVATE, 0, fc.size());
      fail("Expected NonWritableChannelException to be thrown");
    } catch (NonWritableChannelException e) {
      // expected behaviour
    }
    fc.close();
  }
  /**
   * A regression test for failing to correctly set capacity of underlying wrapped buffer from a
   * mapped byte buffer.
   */
  public void testasIntBuffer() throws IOException {
    // Map file
    FileInputStream fis = new FileInputStream(tmpFile);
    FileChannel fc = fis.getChannel();
    MappedByteBuffer mmb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
    int len = mmb.capacity();
    assertEquals("Got wrong number of bytes", 46, len); // $NON-NLS-1$

    // Read in our 26 bytes
    for (int i = 0; i < 26; i++) {
      byte b = mmb.get();
      assertEquals("Got wrong byte value", (byte) 'A' + i, b); // $NON-NLS-1$
    }

    // Now convert to an IntBuffer to read our ints
    IntBuffer ibuffer = mmb.asIntBuffer();
    for (int i = 0; i < 5; i++) {
      int val = ibuffer.get();
      assertEquals("Got wrong int value", i + 1, val); // $NON-NLS-1$
    }
    fc.close();
  }
 public boolean isEOF() throws IOException {
   return position == buffer.capacity();
 }
 protected long getPositionLimit() {
   return segmentOffset + buffer.capacity();
 }
 public long bytesRemaining() throws IOException {
   return buffer.capacity() - position;
 }