--- old/src/java.base/share/classes/java/util/zip/Checksum.java 2014-10-16 18:37:35.603923982 -0700 +++ new/src/java.base/share/classes/java/util/zip/Checksum.java 2014-10-16 18:37:35.451923988 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 1999, 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 @@ -25,6 +25,8 @@ package java.util.zip; +import java.nio.ByteBuffer; + /** * An interface representing a data checksum. * @@ -41,6 +43,20 @@ /** * Updates the current checksum with the specified array of bytes. + * + * @implSpec + * This default implementation is equal to calling + * {@code update(b, 0, b.length)}. + * + * @param b the array of bytes to update the checksum with + * @since 1.9 + */ + default public void update(byte[] b) { + update(b, 0, b.length); + } + + /** + * Updates the current checksum with the specified array of bytes. * @param b the byte array to update the checksum with * @param off the start offset of the data * @param len the number of bytes to use for the update @@ -48,6 +64,58 @@ public void update(byte[] b, int off, int len); /** + * Updates the current checksum with the bytes from the specified buffer. + * + * 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. + * + * @implSpec + *
If buffer.{@link java.nio.Buffer#position() position()} <= + * buffer.{@link java.nio.Buffer#limit() limit()} the default implementation + * will assert or silently return if asserts are disabled, otherwise the + * default implementation will have the following behavior.
+ * For ByteBuffers backed by an accessible byte array. + *{@code + * update(buffer.array(), + * buffer.position() + buffer.arrayOffset(), + * buffer.limit() - buffer.position()); + * }+ * For ByteBuffers not backed by an accessible byte array. + *
{@code + * byte[] b = new byte[buffer.limit() - buffer.position()]; + * buffer.get(b); + * update(b, 0, b.length); + * }+ *
For best performance with DirectByteBuffer and other ByteBuffer + * implementations without a backing array implementers of this interface + * should override this method.
+ * + * @param buffer the ByteBuffer to update the checksum with + * @since 1.9 + */ + default public void update(ByteBuffer buffer) { + int pos = buffer.position(); + int limit = buffer.limit(); + assert (pos <= limit); + int rem = limit - pos; + if (rem <= 0) { + return; + } + if (buffer.hasArray()) { + update(buffer.array(), pos + buffer.arrayOffset(), rem); + } else { + byte[] b = new byte[rem]; + buffer.get(b); + update(b, 0, b.length); + } + buffer.position(limit); + } + + /** * Returns the current checksum value. * @return the current checksum value */