Hi Roger, > On Oct 25, 2018, at 7:15 AM, Roger Riggs <roger.ri...@oracle.com> wrote: > > The FIS skipping past of end of file is puzzling.
Quite so. > If the 'were beyond EOF' was considering the possibility that the file was > being > extended concurrently with the skip operation then it would not be random, > just a normal writer/reader race. The return value from skip would be > accurate > and still usable for skipNBytes. > > If the spec for skipNBytes describes its behavior in terms of the normal > behaviors > of skip(n) and read(n) then it will not making promises it can't keep > regardless of the subclass behavior. That sounds like a good idea. > FIS also says it can do negative seeks which seems in conflict with > InputStream. > The FIS.skip(-n) behavior raises the question about whether > InputStream.skipNBytes should > allow -n? Actually I think the specification [1] is inconsistent. On the one hand it states "If n is negative, the method will try to skip backwards.” and on the other “Throws: IOException <https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/IOException.html> - if n is negative ….”. It’s the throws clause that appears inaccurate, at least on macOS. Output of program below [2] is Position 0 Skipped 1024 / 1024 Position 1024 Skipped -512 / -512 Position 512 This is not actually in conflict with InputStream [3] which states "If n is negative, the skip method for class InputStream always returns 0, and no bytes are skipped. Subclasses may handle the negative value differently.” Ugly stuff. Thanks, Brian [1] https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/FileInputStream.html#skip(long) <https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/FileInputStream.html#skip(long)> [2] FISTest import java.io.FileInputStream; import java.nio.channels.FileChannel; public class FISTest { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream(args[0]); FileChannel fc = fis.getChannel(); System.out.format("Position %d%n", fc.position()); System.out.format("Skipped %d / %d%n", fis.skip(1024), 1024); System.out.format("Position %d%n", fc.position()); System.out.format("Skipped %d / %d%n", fis.skip(-512), -512); System.out.format("Position %d%n", fc.position()); fis.close(); } } [3] https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/InputStream.html#skip(long) <https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/InputStream.html#skip(long)>