jdk/src/java.base/share/classes/java/util/zip/CRC32.java
changeset 27737 0a3fb0529425
parent 25859 3317bb8137f4
child 31671 362e0c0acece
--- a/jdk/src/java.base/share/classes/java/util/zip/CRC32.java	Fri Nov 21 16:05:11 2014 +0100
+++ b/jdk/src/java.base/share/classes/java/util/zip/CRC32.java	Fri Nov 21 09:28:53 2014 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,9 +32,8 @@
  * A class that can be used to compute the CRC-32 of a data stream.
  *
  * <p> Passing a {@code null} argument to a method in this class will cause
- * a {@link NullPointerException} to be thrown.
+ * a {@link NullPointerException} to be thrown.</p>
  *
- * @see         Checksum
  * @author      David Connelly
  */
 public
@@ -51,9 +50,8 @@
     /**
      * Updates the CRC-32 checksum with the specified byte (the low
      * eight bits of the argument b).
-     *
-     * @param b the byte to update the checksum with
      */
+    @Override
     public void update(int b) {
         crc = update(crc, b);
     }
@@ -61,11 +59,12 @@
     /**
      * Updates the CRC-32 checksum with the specified array of bytes.
      *
-     * @throws  ArrayIndexOutOfBoundsException
-     *          if {@code off} is negative, or {@code len} is negative,
-     *          or {@code off+len} is greater than the length of the
-     *          array {@code b}
+     * @throws ArrayIndexOutOfBoundsException
+     *         if {@code off} is negative, or {@code len} is negative, or
+     *         {@code off+len} is negative or greater than the length of
+     *         the array {@code b}.
      */
+    @Override
     public void update(byte[] b, int off, int len) {
         if (b == null) {
             throw new NullPointerException();
@@ -77,27 +76,15 @@
     }
 
     /**
-     * Updates the CRC-32 checksum with the specified array of bytes.
+     * Updates the CRC-32 checksum with the bytes from the specified buffer.
      *
-     * @param b the array of bytes to update the checksum with
-     */
-    public void update(byte[] b) {
-        crc = updateBytes(crc, b, 0, b.length);
-    }
-
-    /**
-     * Updates the checksum with the bytes from the specified buffer.
+     * The checksum is updated with the remaining bytes in the buffer, starting
+     * at the buffer's position. Upon return, the buffer's position will be
+     * updated to its limit; its limit will not have been changed.
      *
-     * The checksum is updated using
-     * buffer.{@link java.nio.Buffer#remaining() remaining()}
-     * bytes starting at
-     * buffer.{@link java.nio.Buffer#position() position()}
-     * Upon return, the buffer's position will
-     * be updated to its limit; its limit will not have been changed.
-     *
-     * @param buffer the ByteBuffer to update the checksum with
      * @since 1.8
      */
+    @Override
     public void update(ByteBuffer buffer) {
         int pos = buffer.position();
         int limit = buffer.limit();
@@ -110,9 +97,12 @@
         } else if (buffer.hasArray()) {
             crc = updateBytes(crc, buffer.array(), pos + buffer.arrayOffset(), rem);
         } else {
-            byte[] b = new byte[rem];
-            buffer.get(b);
-            crc = updateBytes(crc, b, 0, b.length);
+            byte[] b = new byte[Math.min(buffer.remaining(), 4096)];
+            while (buffer.hasRemaining()) {
+                int length = Math.min(buffer.remaining(), b.length);
+                buffer.get(b, 0, length);
+                update(b, 0, length);
+            }
         }
         buffer.position(limit);
     }
@@ -120,6 +110,7 @@
     /**
      * Resets CRC-32 to initial value.
      */
+    @Override
     public void reset() {
         crc = 0;
     }
@@ -127,6 +118,7 @@
     /**
      * Returns CRC-32 value.
      */
+    @Override
     public long getValue() {
         return (long)crc & 0xffffffffL;
     }