blob: 6b8b2ef8cb0f12123c302f1119a1ad0409826195 [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.io.nio;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
import org.eclipse.jetty.io.AbstractBuffer;
import org.eclipse.jetty.io.Buffer;
public class RandomAccessFileBuffer extends AbstractBuffer implements Buffer
{
final RandomAccessFile _file;
final FileChannel _channel;
final int _capacity;
public RandomAccessFileBuffer(File file)
throws FileNotFoundException
{
super(READWRITE,true);
assert file.length()<=Integer.MAX_VALUE;
_file = new RandomAccessFile(file,"rw");
_channel=_file.getChannel();
_capacity=Integer.MAX_VALUE;
setGetIndex(0);
setPutIndex((int)file.length());
}
public RandomAccessFileBuffer(File file,int capacity)
throws FileNotFoundException
{
super(READWRITE,true);
assert capacity>=file.length();
assert file.length()<=Integer.MAX_VALUE;
_capacity=capacity;
_file = new RandomAccessFile(file,"rw");
_channel=_file.getChannel();
setGetIndex(0);
setPutIndex((int)file.length());
}
public RandomAccessFileBuffer(File file,int capacity,int access)
throws FileNotFoundException
{
super(access,true);
assert capacity>=file.length();
assert file.length()<=Integer.MAX_VALUE;
_capacity=capacity;
_file = new RandomAccessFile(file,access==READWRITE?"rw":"r");
_channel=_file.getChannel();
setGetIndex(0);
setPutIndex((int)file.length());
}
public byte[] array()
{
return null;
}
public int capacity()
{
return _capacity;
}
@Override
public void clear()
{
try
{
synchronized (_file)
{
super.clear();
_file.setLength(0);
}
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
@Override
public byte peek()
{
synchronized (_file)
{
try
{
if (_get!=_file.getFilePointer())
_file.seek(_get);
return _file.readByte();
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
}
public byte peek(int index)
{
synchronized (_file)
{
try
{
_file.seek(index);
return _file.readByte();
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
}
public int peek(int index, byte[] b, int offset, int length)
{
synchronized (_file)
{
try
{
_file.seek(index);
return _file.read(b,offset,length);
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
}
public void poke(int index, byte b)
{
synchronized (_file)
{
try
{
_file.seek(index);
_file.writeByte(b);
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
}
@Override
public int poke(int index, byte[] b, int offset, int length)
{
synchronized (_file)
{
try
{
_file.seek(index);
_file.write(b,offset,length);
return length;
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
}
public int writeTo(WritableByteChannel channel,int index, int length)
throws IOException
{
synchronized (_file)
{
return (int)_channel.transferTo(index,length,channel);
}
}
}