1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.io.channels;
19
20 import java.io.IOException;
21 import java.nio.ByteBuffer;
22 import java.nio.channels.FileChannel;
23
24
25
26
27 class FixedReadSizeFileChannelProxy extends FileChannelProxy {
28
29 final int readSize;
30
31 FixedReadSizeFileChannelProxy(final FileChannel fileChannel, final int readSize) {
32 super(fileChannel);
33 if (readSize < 1) {
34 throw new IllegalArgumentException("readSize: " + readSize);
35 }
36 this.readSize = readSize;
37 }
38
39 @Override
40 public int read(final ByteBuffer dst) throws IOException {
41 final int saveLimit = dst.limit();
42 dst.limit(Math.min(dst.position() + readSize, dst.capacity()));
43 if (!dst.hasRemaining()) {
44 throw new IllegalStateException("Programming error.");
45 }
46 final int numRead = super.read(dst);
47 if (numRead > readSize) {
48 throw new IllegalStateException(String.format("numRead %,d > readSize %,d", numRead, readSize));
49 }
50 dst.limit(saveLimit);
51 return numRead;
52 }
53
54 @Override
55 public int read(final ByteBuffer dst, final long position) throws IOException {
56 final int saveLimit = dst.limit();
57 dst.limit(Math.min(dst.position() + readSize, dst.capacity()));
58 if (!dst.hasRemaining()) {
59 throw new IllegalStateException("Programming error.");
60 }
61 final int numRead = super.read(dst, position);
62 if (numRead > readSize) {
63 throw new IllegalStateException(String.format("numRead %,d > readSize %,d", numRead, readSize));
64 }
65 dst.limit(saveLimit);
66 return numRead;
67 }
68
69 @Override
70 public long read(final ByteBuffer[] dsts, final int offset, final int length) throws IOException {
71 throw new UnsupportedOperationException();
72 }
73 }