28package com.jogamp.common.nio;
30import java.io.IOException;
31import java.io.OutputStream;
32import java.nio.ByteBuffer;
33import java.nio.channels.FileChannel;
34import java.nio.channels.FileChannel.MapMode;
36import com.jogamp.common.nio.MappedByteBufferInputStream.CacheMode;
37import com.jogamp.common.nio.MappedByteBufferInputStream.FileResizeOp;
55 if( FileChannel.MapMode.READ_ONLY == parent.getMapMode() ) {
56 throw new IOException(
"FileChannel map-mode is read-only");
75 final FileChannel.MapMode mmode,
77 final int sliceShift,
final FileResizeOp fileResizeOp)
throws IOException {
97 public final synchronized void setLength(
final long newTotalSize)
throws IOException {
111 public final synchronized long length() {
118 public final synchronized long remaining() throws IOException {
125 public final synchronized long position() throws IOException {
133 return parent.
position(newPosition);
139 public final synchronized long skip(
final long n )
throws IOException {
140 return parent.
skip(n);
144 public final synchronized void flush() throws IOException {
145 parent.
flush(
true );
152 public final synchronized void flush(
final boolean metaData)
throws IOException {
153 parent.
flush(metaData);
157 public final synchronized void close() throws IOException {
162 public final synchronized void write(
final int b)
throws IOException {
164 final long totalRem = parent.
remaining();
165 if ( totalRem < 1 ) {
169 final int currRem = slice.remaining();
170 if ( 0 == currRem ) {
171 if (
null == ( slice = parent.
nextSlice() ) ) {
173 System.err.println(
"EOT write: "+parent.
currentSlice());
174 parent.dbgDump(
"EOT write:", System.err);
176 throw new IOException(
"EOT");
179 slice.put( (
byte)(b & 0xFF) );
182 if(
null != slice ) {
183 parent.syncSlice(slice);
188 public final synchronized void write(
final byte b[],
final int off,
final int len)
throws IOException {
191 throw new NullPointerException();
192 }
else if( off < 0 ||
195 off + len > b.length ||
198 throw new IndexOutOfBoundsException(
"offset "+off+
", length "+len+
", b.length "+b.length);
199 }
else if( 0 == len ) {
202 final long totalRem = parent.
remaining();
203 if ( totalRem < len ) {
207 ByteBuffer slice =
null;
208 while( written < len ) {
210 int currRem = slice.remaining();
211 if ( 0 == currRem ) {
212 if (
null == ( slice = parent.
nextSlice() ) ) {
214 System.err.println(
"EOT write: offset "+off+
", length "+len+
", b.length "+b.length);
215 System.err.println(
"EOT write: written "+written+
" / "+len+
", currRem "+currRem);
216 System.err.println(
"EOT write: "+parent.
currentSlice());
217 parent.dbgDump(
"EOT write:", System.err);
219 throw new InternalError(
"EOT");
221 currRem = slice.remaining();
223 final int currLen = Math.min( len - written, currRem );
224 slice.put( b, off + written, currLen );
228 if(
null != slice ) {
229 parent.syncSlice(slice);
241 public final synchronized void write(
final ByteBuffer b,
final int len)
throws IOException {
244 throw new NullPointerException();
245 }
else if (len < 0 || len > b.remaining()) {
246 throw new IndexOutOfBoundsException(
"length "+len+
", b "+b);
247 }
else if( 0 == len ) {
250 final long totalRem = parent.
remaining();
251 if ( totalRem < len ) {
255 ByteBuffer slice =
null;
256 while( written < len ) {
258 int currRem = slice.remaining();
259 if ( 0 == currRem ) {
260 if (
null == ( slice = parent.
nextSlice() ) ) {
262 System.err.println(
"EOT write: length "+len+
", b "+b);
263 System.err.println(
"EOT write: written "+written+
" / "+len+
", currRem "+currRem);
264 System.err.println(
"EOT write: "+parent.
currentSlice());
265 parent.dbgDump(
"EOT write:", System.err);
267 throw new InternalError(
"EOT");
269 currRem = slice.remaining();
271 final int currLen = Math.min( len - written, currRem );
273 if( slice.hasArray() && b.hasArray() ) {
274 System.arraycopy(b.array(), b.arrayOffset() + b.position(),
275 slice.array(), slice.arrayOffset() + slice.position(),
277 b.position( b.position() + currLen );
278 slice.position( slice.position() + currLen );
279 }
else if( currLen == currRem ) {
282 final int _limit = b.limit();
293 if(
null != slice ) {
294 parent.syncSlice(slice);
313 throw new NullPointerException();
314 }
else if (len < 0 || len > b.remaining()) {
315 throw new IndexOutOfBoundsException(
"length "+len+
", b "+b);
316 }
else if( 0 == len ) {
319 final long totalRem = parent.
remaining();
320 if ( totalRem < len ) {
324 ByteBuffer slice =
null;
325 while( written < len ) {
327 int currRem = slice.remaining();
328 if ( 0 == currRem ) {
329 if (
null == ( slice = parent.
nextSlice() ) ) {
331 System.err.println(
"EOT write: length "+len+
", b "+b);
332 System.err.println(
"EOT write: written "+written+
" / "+len+
", currRem "+currRem);
333 System.err.println(
"EOT write: "+parent.
currentSlice());
334 parent.dbgDump(
"EOT write:", System.err);
336 throw new InternalError(
"EOT");
338 currRem = slice.remaining();
340 final int currLen = b.read(slice, (
int)Math.min( len - written, currRem ));
342 throw new InternalError(
"Unexpected InputStream EOT");
347 if(
null != slice ) {
348 parent.syncSlice(slice);
An OutputStream implementation based on an underlying FileChannel's memory mapped ByteBuffer.
final synchronized void setLength(final long newTotalSize)
See MappedByteBufferInputStream#setLength(long).
final synchronized long remaining()
See MappedByteBufferInputStream#remaining().
final synchronized MappedByteBufferInputStream position(final long newPosition)
See MappedByteBufferInputStream#position(long).
final synchronized long length()
See MappedByteBufferInputStream#length().
final synchronized boolean getSynchronous()
See MappedByteBufferInputStream#getSynchronous().
final synchronized void flush(final boolean metaData)
See MappedByteBufferInputStream#flush(boolean).
MappedByteBufferOutputStream(final FileChannel fileChannel, final FileChannel.MapMode mmode, final CacheMode cmode, final int sliceShift, final FileResizeOp fileResizeOp)
Creates a new instance using the given FileChannel.
final synchronized void flush()
final synchronized void write(final MappedByteBufferInputStream b, final long len)
Perform similar to write(ByteBuffer, int) with MappedByteBufferInputStream instead of byte array.
final synchronized void close()
final synchronized void write(final byte b[], final int off, final int len)
final synchronized void write(final ByteBuffer b, final int len)
Perform similar to write(byte[], int, int) with ByteBuffer instead of byte array.
final synchronized long skip(final long n)
See MappedByteBufferInputStream#skip(long).
final synchronized long position()
See MappedByteBufferInputStream#position().
final synchronized void setSynchronous(final boolean s)
See MappedByteBufferInputStream#setSynchronous(boolean).
final synchronized void notifyLengthChange(final long newTotalSize)
See MappedByteBufferInputStream#notifyLengthChange(long).
final synchronized void write(final int b)