< prev index next >

src/java.base/share/classes/sun/text/normalizer/ICUBinary.java

Print this page

        

*** 84,99 **** public InputStream run() { return root.getResourceAsStream(itemPath); } })) { ! BufferedInputStream b=new BufferedInputStream(is, 4096 /* data buffer size */); ! DataInputStream inputStream = new DataInputStream(b); ! byte[] bb = new byte[130000]; ! int n = inputStream.read(bb); ! ByteBuffer bytes = ByteBuffer.wrap(bb, 0, n); ! return bytes; } catch (IOException e) { throw new UncheckedIOException(e); } } --- 84,134 ---- public InputStream run() { return root.getResourceAsStream(itemPath); } })) { ! // is.available() may return 0, or 1, or the total number of bytes in the stream, ! // or some other number. ! // Do not try to use is.available() == 0 to find the end of the stream! ! byte[] bytes; ! int avail = is.available(); ! if (avail > 32) { ! // There are more bytes available than just the ICU data header length. ! // With luck, it is the total number of bytes. ! bytes = new byte[avail]; ! } else { ! bytes = new byte[128]; // empty .res files are even smaller ! } ! // Call is.read(...) until one returns a negative value. ! int length = 0; ! for(;;) { ! if (length < bytes.length) { ! int numRead = is.read(bytes, length, bytes.length - length); ! if (numRead < 0) { ! break; // end of stream ! } ! length += numRead; ! } else { ! // See if we are at the end of the stream before we grow the array. ! int nextByte = is.read(); ! if (nextByte < 0) { ! break; ! } ! int capacity = 2 * bytes.length; ! if (capacity < 128) { ! capacity = 128; ! } else if (capacity < 0x4000) { ! capacity *= 2; // Grow faster until we reach 16kB. ! } ! // TODO Java 6 replace new byte[] and arraycopy(): bytes = Arrays.copyOf(bytes, capacity); ! byte[] newBytes = new byte[capacity]; ! System.arraycopy(bytes, 0, newBytes, 0, length); ! bytes = newBytes; ! bytes[length++] = (byte) nextByte; ! } ! } ! return ByteBuffer.wrap(bytes, 0, length); } catch (IOException e) { throw new UncheckedIOException(e); } }
< prev index next >