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 /**
20  * Defines byte order constants.
21  */
22 public final class ByteOrder {
23     private static final ByteOrder NATIVE_ORDER;
24 
25     /**
26      * This constant represents big endian.
27      */
28     public static final ByteOrder BIG_ENDIAN;
29 
30     /**
31      * This constant represents little endian.
32      */
33     public static final ByteOrder LITTLE_ENDIAN;
34 
isLittleEndian()35     private static native boolean isLittleEndian();
36 
37     static {
38         boolean isLittleEndian = isLittleEndian();
39         BIG_ENDIAN = new ByteOrder("BIG_ENDIAN", isLittleEndian);
40         LITTLE_ENDIAN = new ByteOrder("LITTLE_ENDIAN", !isLittleEndian);
41         NATIVE_ORDER = isLittleEndian ? LITTLE_ENDIAN : BIG_ENDIAN;
42     }
43 
44     private final String name;
45 
46     /**
47      * This is the only thing that ByteOrder is really used for: to know whether we need to swap
48      * bytes to get this order, given bytes in native order. (That is, this is the opposite of
49      * the hypothetical "isNativeOrder".)
50      * @hide - needed in libcore.io too.
51      */
52     public final boolean needsSwap;
53 
ByteOrder(String name, boolean needsSwap)54     private ByteOrder(String name, boolean needsSwap) {
55         this.name = name;
56         this.needsSwap = needsSwap;
57     }
58 
59     /**
60      * Returns the current platform byte order.
61      *
62      * @return the byte order object, which is either LITTLE_ENDIAN or
63      *         BIG_ENDIAN.
64      */
nativeOrder()65     public static ByteOrder nativeOrder() {
66         return NATIVE_ORDER;
67     }
68 
69     /**
70      * Returns a string that describes this object.
71      *
72      * @return "BIG_ENDIAN" for {@link #BIG_ENDIAN ByteOrder.BIG_ENDIAN}
73      *         objects, "LITTLE_ENDIAN" for
74      *         {@link #LITTLE_ENDIAN ByteOrder.LITTLE_ENDIAN} objects.
75      */
76     @Override
toString()77     public String toString() {
78         return name;
79     }
80 }
81