On Thu, 20 Jul 2023 13:57:04 GMT, Glavo <d...@openjdk.org> wrote: >> Also... `Integer::toString` seems to be `@IntrinsicCandidate` ? > >> Also... `Integer::toString` seems to be `@IntrinsicCandidate` ? > > It's just a bytecode intrinsics, it is only replaced when used in a > fluent-chain of StringBuilder/Buffer.
Also, note that ByteBuffer exposes its backing array (at least if the buffer is not read only) via ByteBuffer::array. This does no copy. So in all the various stream implementations, I believe we can really just use a ByteBuffer instead of an array - and use ByteBuffer::array when we really need an array. This makes it very easy to migrate some of the classes that use ByteArray. Here's the patch for DataInputStream: diff --git a/src/java.base/share/classes/java/io/DataInputStream.java b/src/java.base/share/classes/java/io/DataInputStream.java index 7192b30d5f2..b5b013cdd50 100644 --- a/src/java.base/share/classes/java/io/DataInputStream.java +++ b/src/java.base/share/classes/java/io/DataInputStream.java @@ -27,6 +27,8 @@ package java.io; import jdk.internal.util.ByteArray; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.Objects; /** @@ -59,7 +61,7 @@ public class DataInputStream extends FilterInputStream implements DataInput { super(in); } - private final byte[] readBuffer = new byte[8]; + private final ByteBuffer readBuffer = ByteBuffer.allocate(8); // BIG_ENDIAN /** * working arrays initialized on demand by readUTF @@ -316,8 +318,8 @@ public class DataInputStream extends FilterInputStream implements DataInput { * @see java.io.FilterInputStream#in */ public final short readShort() throws IOException { - readFully(readBuffer, 0, 2); - return ByteArray.getShort(readBuffer, 0); + readFully(readBuffer.array(), 0, 2); + return readBuffer.getShort(0); } /** @@ -338,8 +340,8 @@ public class DataInputStream extends FilterInputStream implements DataInput { * @see java.io.FilterInputStream#in */ public final int readUnsignedShort() throws IOException { - readFully(readBuffer, 0, 2); - return ByteArray.getUnsignedShort(readBuffer, 0); + readFully(readBuffer.array(), 0, 2); + return Short.toUnsignedInt(readBuffer.getShort(0)); } /** @@ -360,8 +362,8 @@ public class DataInputStream extends FilterInputStream implements DataInput { * @see java.io.FilterInputStream#in */ public final char readChar() throws IOException { - readFully(readBuffer, 0, 2); - return ByteArray.getChar(readBuffer, 0); + readFully(readBuffer.array(), 0, 2); + return readBuffer.getChar(0); } /** @@ -382,8 +384,8 @@ public class DataInputStream extends FilterInputStream implements DataInput { * @see java.io.FilterInputStream#in */ public final int readInt() throws IOException { - readFully(readBuffer, 0, 4); - return ByteArray.getInt(readBuffer, 0); + readFully(readBuffer.array(), 0, 4); + return readBuffer.getInt(0); } /** @@ -404,8 +406,8 @@ public class DataInputStream extends FilterInputStream implements DataInput { * @see java.io.FilterInputStream#in */ public final long readLong() throws IOException { - readFully(readBuffer, 0, 8); - return ByteArray.getLong(readBuffer, 0); + readFully(readBuffer.array(), 0, 8); + return readBuffer.getLong(0); } /** @@ -427,8 +429,8 @@ public class DataInputStream extends FilterInputStream implements DataInput { * @see java.lang.Float#intBitsToFloat(int) */ public final float readFloat() throws IOException { - readFully(readBuffer, 0, 4); - return ByteArray.getFloat(readBuffer, 0); + readFully(readBuffer.array(), 0, 4); + return readBuffer.getFloat(0); } /** @@ -450,8 +452,8 @@ public class DataInputStream extends FilterInputStream implements DataInput { * @see java.lang.Double#longBitsToDouble(long) */ public final double readDouble() throws IOException { - readFully(readBuffer, 0, 8); - return ByteArray.getDouble(readBuffer, 0); + readFully(readBuffer.array(), 0, 8); + return readBuffer.getDouble(0); } private char[] lineBuffer; It is very mechanical, and seems to pass all the jdk_io tests. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/14636#discussion_r1269527839