1 package org.jboss.netty.channel; 2 3 import java.io.IOException; 4 import java.nio.channels.FileChannel; 5 import java.nio.channels.WritableByteChannel; 6 7 import org.jboss.netty.logging.InternalLogger; 8 import org.jboss.netty.logging.InternalLoggerFactory; 9 10 public class DefaultFileRegion implements FileRegion { 11 12 private static final InternalLogger logger = InternalLoggerFactory.getInstance(DefaultFileRegion.class); 13 14 private final FileChannel file; 15 private final long position; 16 private final long count; 17 18 public DefaultFileRegion(FileChannel file, long position, long count) { 19 this.file = file; 20 this.position = position; 21 this.count = count; 22 } 23 24 public long getPosition() { 25 return position; 26 } 27 28 public long getCount() { 29 return count; 30 } 31 32 public long transferTo(WritableByteChannel target, long position) throws IOException { 33 long count = this.count - position; 34 if (count < 0 || position < 0) { 35 throw new IllegalArgumentException( 36 "position out of range: " + position + 37 " (expected: 0 - " + (this.count - 1) + ")"); 38 } 39 if (count == 0) { 40 return 0L; 41 } 42 43 return file.transferTo(this.position + position, count, target); 44 } 45 46 public void releaseExternalResources() { 47 try { 48 file.close(); 49 } catch (IOException e) { 50 logger.warn("Failed to close a file.", e); 51 } 52 } 53 }