I also find this API a little problematic. It leaves too much freedom to the specific implementations:
1) It's not clear what happens in case of end of stream
2) It's not clear whether when the stream is non-empty, repeatedly calling skip will eventually return a positive number or not.
Assuming that you know that n isn't beyond the end of stream, and assuming that (2) holds, then the following code may be helpful:
public static void skipSecure(InputStream is, long n) throws IOException {
while (n >= 0) {
long skipped = is.skip(n);
n -= skipped;
}
}