Home | History | Annotate | Download | only in nio
      1 /* Licensed to the Apache Software Foundation (ASF) under one or more
      2  * contributor license agreements.  See the NOTICE file distributed with
      3  * this work for additional information regarding copyright ownership.
      4  * The ASF licenses this file to You under the Apache License, Version 2.0
      5  * (the "License"); you may not use this file except in compliance with
      6  * the License.  You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package java.nio;
     18 
     19 import java.io.FileDescriptor;
     20 import java.nio.channels.FileChannel;
     21 
     22 /**
     23  * @hide internal use only
     24  */
     25 public final class NioUtils {
     26     private NioUtils() {
     27     }
     28 
     29     /**
     30      * Gets the start address of a direct buffer.
     31      * <p>
     32      * This method corresponds to the JNI function:
     33      *
     34      * <pre>
     35      *    void* GetDirectBufferAddress(JNIEnv* env, jobject buf);
     36      * </pre>
     37      *
     38      * @param buf
     39      *            the direct buffer whose address shall be returned must not be
     40      *            <code>null</code>.
     41      * @return the address of the buffer given, or zero if the buffer is not a
     42      *         direct Buffer.
     43      */
     44     public static int getDirectBufferAddress(Buffer buffer) {
     45         return buffer.effectiveDirectAddress;
     46     }
     47 
     48     public static void freeDirectBuffer(ByteBuffer buffer) {
     49         if (buffer == null) {
     50             return;
     51         }
     52         if (buffer instanceof DirectByteBuffer) {
     53             ((DirectByteBuffer) buffer).free();
     54         } else if (buffer instanceof MappedByteBuffer) {
     55             ((MappedByteBufferAdapter) buffer).free();
     56         } else {
     57             throw new AssertionError();
     58         }
     59     }
     60 
     61     /**
     62      * Returns the int file descriptor from within the given FileChannel 'fc'.
     63      */
     64     public static FileDescriptor getFD(FileChannel fc) {
     65         return ((FileChannelImpl) fc).getFD();
     66     }
     67 
     68     /**
     69      * Helps bridge between io and nio.
     70      */
     71     public static FileChannel newFileChannel(Object stream, FileDescriptor fd, int mode) {
     72         return new FileChannelImpl(stream, fd, mode);
     73     }
     74 
     75     /**
     76      * Exposes the array backing a non-direct ByteBuffer, even if the ByteBuffer is read-only.
     77      * Normally, attempting to access the array backing a read-only buffer throws.
     78      */
     79     public static byte[] unsafeArray(ByteBuffer b) {
     80         return ((HeapByteBuffer) b).backingArray;
     81     }
     82 
     83     /**
     84      * Exposes the array offset for the array backing a non-direct ByteBuffer,
     85      * even if the ByteBuffer is read-only.
     86      */
     87     public static int unsafeArrayOffset(ByteBuffer b) {
     88         return ((HeapByteBuffer) b).offset;
     89     }
     90 }
     91