
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_io_RandomAccessFile__
#define __java_io_RandomAccessFile__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace nio
      {
        namespace channels
        {
            class FileChannelImpl;
        }
      }
    }
  }
  namespace java
  {
    namespace nio
    {
      namespace channels
      {
          class FileChannel;
      }
    }
  }
}

class java::io::RandomAccessFile : public ::java::lang::Object
{

public:
  RandomAccessFile(::java::io::File *, ::java::lang::String *);
  RandomAccessFile(::java::lang::String *, ::java::lang::String *);
  virtual void close();
  virtual ::java::io::FileDescriptor * getFD();
  virtual jlong getFilePointer();
  virtual void setLength(jlong);
  virtual jlong length();
  virtual jint read();
  virtual jint read(JArray< jbyte > *);
  virtual jint read(JArray< jbyte > *, jint, jint);
  virtual jboolean readBoolean();
  virtual jbyte readByte();
  virtual jchar readChar();
  virtual jdouble readDouble();
  virtual jfloat readFloat();
  virtual void readFully(JArray< jbyte > *);
  virtual void readFully(JArray< jbyte > *, jint, jint);
  virtual jint readInt();
  virtual ::java::lang::String * readLine();
  virtual jlong readLong();
  virtual jshort readShort();
  virtual jint readUnsignedByte();
  virtual jint readUnsignedShort();
  virtual ::java::lang::String * readUTF();
  virtual void seek(jlong);
  virtual jint skipBytes(jint);
  virtual void write(jint);
  virtual void write(JArray< jbyte > *);
  virtual void write(JArray< jbyte > *, jint, jint);
  virtual void writeBoolean(jboolean);
  virtual void writeByte(jint);
  virtual void writeShort(jint);
  virtual void writeChar(jint);
  virtual void writeInt(jint);
  virtual void writeLong(jlong);
  virtual void writeFloat(jfloat);
  virtual void writeDouble(jdouble);
  virtual void writeBytes(::java::lang::String *);
  virtual void writeChars(::java::lang::String *);
  virtual void writeUTF(::java::lang::String *);
  virtual ::java::nio::channels::FileChannel * getChannel();
private:
  ::gnu::java::nio::channels::FileChannelImpl * __attribute__((aligned(__alignof__( ::java::lang::Object)))) ch;
  ::java::io::FileDescriptor * fd;
  ::java::io::DataOutputStream * out;
  ::java::io::DataInputStream * in;
public:
  static ::java::lang::Class class$;
};

#endif // __java_io_RandomAccessFile__
