8247918: Clarify Reader.skip behavior for end of stream

Reviewed-by: rriggs, naoto
This commit is contained in:
Brian Burkhalter 2021-02-19 17:21:11 +00:00
parent 8a1c712c2e
commit 7ffa1481c2
8 changed files with 108 additions and 69 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2021, 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
@ -397,14 +397,7 @@ public class BufferedReader extends Reader {
}
/**
* Skips characters.
*
* @param n The number of characters to skip
*
* @return The number of characters actually skipped
*
* @throws IllegalArgumentException If {@code n} is negative.
* @throws IOException If an I/O error occurs
* {@inheritDoc}
*/
public long skip(long n) throws IOException {
if (n < 0L) {

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2021, 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
@ -146,16 +146,19 @@ public class CharArrayReader extends Reader {
}
/**
* Skips characters. Returns the number of characters that were skipped.
* Skips characters. If the stream is already at its end before this method
* is invoked, then no characters are skipped and zero is returned.
*
* <p>The {@code n} parameter may be negative, even though the
* {@code skip} method of the {@link Reader} superclass throws
* an exception in this case. If {@code n} is negative, then
* this method does nothing and returns {@code 0}.
*
* @param n The number of characters to skip
* @return The number of characters actually skipped
* @throws IOException If the stream is closed, or an I/O error occurs
* @param n {@inheritDoc}
*
* @return {@inheritDoc}
*
* @throws IOException {@inheritDoc}
*/
public long skip(long n) throws IOException {
synchronized (lock) {

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2021, 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
@ -76,9 +76,11 @@ public abstract class FilterReader extends Reader {
}
/**
* Skips characters.
* {@inheritDoc}
*
* @throws IOException If an I/O error occurs
* @throws IllegalArgumentException If {@code n} is negative and the
* contained {@code Reader}'s {@code skip} method throws an
* IllegalArgumentException for a negative parameter
*/
public long skip(long n) throws IOException {
return in.skip(n);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2021, 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
@ -267,18 +267,7 @@ public class LineNumberReader extends BufferedReader {
private char skipBuffer[] = null;
/**
* Skip characters.
*
* @param n
* The number of characters to skip
*
* @return The number of characters actually skipped
*
* @throws IOException
* If an I/O error occurs
*
* @throws IllegalArgumentException
* If {@code n} is negative
* {@inheritDoc}
*/
public long skip(long n) throws IOException {
if (n < 0)

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2021, 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
@ -254,15 +254,7 @@ public class PushbackReader extends FilterReader {
}
/**
* Skips characters. This method will block until some characters are
* available, an I/O error occurs, or the end of the stream is reached.
*
* @param n The number of characters to skip
*
* @return The number of characters actually skipped
*
* @throws IllegalArgumentException If {@code n} is negative.
* @throws IOException If an I/O error occurs
* {@inheritDoc}
*/
public long skip(long n) throws IOException {
if (n < 0L)

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2021, 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
@ -269,6 +269,8 @@ public abstract class Reader implements Readable, Closeable {
/**
* Skips characters. This method will block until some characters are
* available, an I/O error occurs, or the end of the stream is reached.
* If the stream is already at its end before this method is invoked,
* then no characters are skipped and zero is returned.
*
* @param n The number of characters to skip
*

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2021, 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
@ -105,31 +105,35 @@ public class StringReader extends Reader {
}
/**
* Skips the specified number of characters in the stream. Returns
* the number of characters that were skipped.
* Skips characters. If the stream is already at its end before this method
* is invoked, then no characters are skipped and zero is returned.
*
* <p>The {@code ns} parameter may be negative, even though the
* <p>The {@code n} parameter may be negative, even though the
* {@code skip} method of the {@link Reader} superclass throws
* an exception in this case. Negative values of {@code ns} cause the
* an exception in this case. Negative values of {@code n} cause the
* stream to skip backwards. Negative return values indicate a skip
* backwards. It is not possible to skip backwards past the beginning of
* the string.
*
* <p>If the entire string has been read or skipped, then this method has
* no effect and always returns 0.
* no effect and always returns {@code 0}.
*
* @throws IOException If an I/O error occurs
* @param n {@inheritDoc}
*
* @return {@inheritDoc}
*
* @throws IOException {@inheritDoc}
*/
public long skip(long ns) throws IOException {
public long skip(long n) throws IOException {
synchronized (lock) {
ensureOpen();
if (next >= length)
return 0;
// Bound skip by beginning and end of the source
long n = Math.min(length - next, ns);
n = Math.max(-next, n);
next += n;
return n;
long r = Math.min(length - next, n);
r = Math.max(-next, r);
next += r;
return r;
}
}