/* FileDescriptor.java -- Opaque file handle class
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004
Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package java.io;
import gnu.classpath.Configuration;
/**
* This class represents an opaque file handle as a Java class. It should
* be used only to pass to other methods that expect an object of this
* type. No system specific information can be obtained from this object.
*
* @author Aaron M. Renn (arenn@urbanophile.com)
* @author Tom Tromey (tromey@cygnus.com)
* @date September 24, 1998
*/
public final class FileDescriptor
{
/**
* A FileDescriptor
representing the system standard input
* stream. This will usually be accessed through the
* System.in
variable.
*/
public static final FileDescriptor in = new FileDescriptor();
/**
* A FileDescriptor
representing the system standard output
* stream. This will usually be accessed through the
* System.out
variable.
*/
public static final FileDescriptor out = new FileDescriptor();
/**
* A FileDescriptor
representing the system standard error
* stream. This will usually be accessed through the
* System.err
variable.
*/
public static final FileDescriptor err = new FileDescriptor();
static
{
if (Configuration.INIT_LOAD_LIBRARY)
{
System.loadLibrary("javaio");
}
nativeInit();
}
// These are WHENCE values for seek.
static final int SET = 0;
static final int CUR = 1;
static final int END = 2;
// These are mode values for open().
static final int READ = 1;
static final int WRITE = 2;
static final int APPEND = 4;
// EXCL is used only when making a temp file.
static final int EXCL = 8;
static final int SYNC = 16;
static final int DSYNC = 32;
/**
* This is the actual native file descriptor value
*/
private long nativeFd = -1L;
/**
* This method is used to initialize an invalid FileDescriptor object.
*/
public FileDescriptor()
{
}
private FileDescriptor(long nativeFd)
{
this.nativeFd = nativeFd;
}
FileDescriptor(String path, int mode) throws FileNotFoundException
{
open(path, mode);
}
/**
* This method forces all data that has not yet been physically written to
* the underlying storage medium associated with this
* FileDescriptor
* to be written out. This method will not return until all data has
* been fully written to the underlying device. If the device does not
* support this functionality or if an error occurs, then an exception
* will be thrown.
*/
public void sync() throws SyncFailedException
{
if (nativeFd == -1L)
throw new SyncFailedException("Invalid FileDescriptor");
nativeSync(nativeFd);
}
/**
* This methods tests whether or not this object represents a valid open
* native file handle.
*
* @return true
if this object represents a valid
* native file handle, false
otherwise
*/
public boolean valid()
{
if (nativeFd == -1L)
return false;
return nativeValid(nativeFd);
}
/**
* Opens the specified file in the specified mode. This can be done
* in one of the specified modes:
*
true
to ensure that there is no
* seeking past the end of the file, false
otherwise.
*
* @return The new file position, or -1 if end of file.
*
* @exception IOException If an error occurs
*/
long seek(long offset, int whence, boolean stopAtEof) throws IOException
{
if (nativeFd == -1L)
throw new IOException("Invalid FileDescriptor");
if ((whence != SET) && (whence != CUR) && (whence != END))
throw new IllegalArgumentException("Invalid whence value: " + whence);
return nativeSeek(nativeFd, offset, whence, stopAtEof);
}
/**
* Returns the current position of the file pointer in the file
*
* @param fd The native file descriptor
*
* @exception IOException If an error occurs
*/
long getFilePointer() throws IOException
{
if (nativeFd == -1L)
throw new IOException("Invalid FileDescriptor");
return nativeGetFilePointer(nativeFd);
}
/**
* Returns the length of the file in bytes
*
* @return The length of the file in bytes
*
* @exception IOException If an error occurs
*/
long getLength() throws IOException
{
if (nativeFd == -1L)
throw new IOException("Invalid FileDescriptor");
return nativeGetLength(nativeFd);
}
/**
* Sets the length of the file to the specified number of bytes
* This can result in truncation or extension.
*
* @param len The new length of the file
*
* @exception IOException If an error occurs
*/
void setLength(long len) throws IOException
{
if (nativeFd == -1L)
throw new IOException("Invalid FileDescriptor");
if (len < 0)
throw new IllegalArgumentException("Length cannot be less than zero " +
len);
nativeSetLength(nativeFd, len);
}
// Don't do anything crazy with this
long getNativeFd()
{
return nativeFd;
}
private void setNativeFd(long nativeFd)
{
this.nativeFd = nativeFd;
}
protected void finalize() throws Throwable
{
close();
}
/*
* Native FileDescriptor provider interface
*
* Platform implementors must implement these methods. Note that this
* class guarantees that valid data will be passed to these methods,
* so basic error checking on input values can be skipped.
*/
/**
* This method is called in the class initializer to do any require
* native library initialization. It is also responsible for initializing
* the in, out, and err variables.
*/
private static native void nativeInit();
/**
* Opens the specified file in the specified mode. This can be done
* in one of the specified modes:
* true
to ensure that there is no
* seeking past the end of the file, false
otherwise.
*
* @return The new file position, or -1 if end of file.
*
* @exception IOException If an error occurs
*/
private native long nativeSeek(long fd, long offset, int whence,
boolean stopAtEof)
throws IOException;
/**
* Returns the current position of the file pointer in the file
*
* @param fd The native file descriptor
*
* @exception IOException If an error occurs
*/
private native long nativeGetFilePointer(long fd) throws IOException;
/**
* Returns the length of the file in bytes
*
* @param fd The native file descriptor
*
* @return The length of the file in bytes
*
* @exception IOException If an error occurs
*/
private native long nativeGetLength(long fd) throws IOException;
/**
* Sets the length of the file to the specified number of bytes
* This can result in truncation or extension.
*
* @param fd The native file descriptor
* @param len The new length of the file
*
* @exception IOException If an error occurs
*/
private native void nativeSetLength(long fd, long len) throws IOException;
/**
* Tests a file descriptor for validity
*
* @param fd The native file descriptor
*
* @return true
if the fd is valid, false
* otherwise
*/
private native boolean nativeValid(long fd);
/**
* Flushes any buffered contents to disk
*
* @param fd The native file descriptor
*
* @exception IOException If an error occurs
*/
private native void nativeSync(long fd) throws SyncFailedException;
}