You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2005/12/01 07:04:00 UTC

svn commit: r350181 [95/198] - in /incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core: ./ depends/ depends/files/ depends/jars/ depends/libs/ depends/libs/linux.IA32/ depends/libs/win.IA32/ depends/oss/ depends/oss/linux.IA32/ depends/oss/win.I...

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileDescriptor.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileDescriptor.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileDescriptor.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileDescriptor.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,88 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io; 
+
+
+/**
+ * FileDescriptor is the lowest level representation of a File, Device, or
+ * Socket. You can create any of the IO classes which take a FileDescriptor as
+ * an argument by querying an open Socket or File for the FileDescriptor.
+ * <p>
+ * The FileDescriptor class also contains static fields representing Standard
+ * Input, Output and Error. You can use these directly if desired but it is
+ * recommended you go through System.in, System.out, and System.err streams
+ * respectively.
+ * <p>
+ * Applications should not create new FileDescriptors.
+ * 
+ * @see FileInputStream#getFD()
+ * @see FileOutputStream#getFD()
+ * @see RandomAccessFile#getFD()
+ */
+public final class FileDescriptor {
+	/** FileDescriptor representing Standard In */
+	public static final FileDescriptor in = new FileDescriptor();
+
+	/** FileDescriptor representing Standard Out */
+	public static final FileDescriptor out = new FileDescriptor();
+
+	/** FileDescriptor representing Standard Error */
+	public static final FileDescriptor err = new FileDescriptor();
+
+	/**
+	 * Represents a link to any underlying OS resources for this FileDescriptor.
+	 * A value of -1 indicates that this FileDescriptor is invalid.
+	 */
+	long descriptor = -1;
+
+	private static native void oneTimeInitialization();
+
+	static {
+		in.descriptor = 0;
+		out.descriptor = 1;
+		err.descriptor = 2;
+
+		oneTimeInitialization();
+	}
+
+	/**
+	 * Constructs a new FileDescriptor containing an invalid handle. This
+	 * constructor does nothing interesting. Provided for signature
+	 * compatibility.
+	 * 
+	 */
+	public FileDescriptor() {
+		super();
+	}
+
+	/**
+	 * Ensures that data which is buffered within the underlying implementation
+	 * is written out to the appropriate device before returning.
+	 * 
+	 * @throws SyncFailedException
+	 *             when the operation fails
+	 */
+	public native void sync() throws SyncFailedException;
+
+	/**
+	 * Answers a boolean indicating whether or not this FileDescriptor is valid.
+	 * 
+	 * @return <code>true</code> if this FileDescriptor is valid,
+	 *         <code>false</code> otherwise
+	 */
+	public native boolean valid();
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileFilter.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileFilter.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileFilter.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileFilter.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,32 @@
+/* Copyright 1998, 2002 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+/**
+ * FileFilter is an interface for filtering abstract Files
+ *
+ */
+public abstract interface FileFilter {
+
+/**
+ * Answers a boolean indicating whether or not a specific File should be included in a pathname list.
+ *
+ * @param		pathname	the abstract File to check.
+ * @return 		<code>true</code> if the File should be includes, <code>false</code> otherwise.
+ */
+public abstract boolean accept(File pathname);
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileInputStream.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileInputStream.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileInputStream.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileInputStream.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,266 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+import java.nio.channels.FileChannel;
+
+/**
+ * FileInputStream is a class for reading bytes from a file. This class may also
+ * be used with other InputStreams, ie: BufferedInputStream, to read data from a
+ * file with buffering.
+ * 
+ * @see FileOutputStream
+ */
+public class FileInputStream extends InputStream {
+	/**
+	 * The FileDescriptor representing this FileInputStream.
+	 */
+	FileDescriptor fd;
+
+	// The unique file channel associated with this FileInputStream (lazily
+	// initialized).
+	private FileChannel channel;
+
+	// Fill in the JNI id caches
+	private static native void oneTimeInitialization();
+
+	static {
+		oneTimeInitialization();
+	}
+
+	/**
+	 * Constructs a new FileInputStream on the File <code>file</code>. If the
+	 * file does not exist, the <code>FileNotFoundException</code> is thrown.
+	 * 
+	 * @param file
+	 *            the File on which to stream reads.
+	 * 
+	 * @throws FileNotFoundException
+	 *             If the <code>file</code> is not found.
+	 * 
+	 * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+	 * @see java.lang.SecurityManager#checkRead(String)
+	 * @see java.lang.SecurityManager#checkRead(String, Object)
+	 */
+	public FileInputStream(File file) throws FileNotFoundException {
+		super();
+		SecurityManager security = System.getSecurityManager();
+		if (security != null)
+			security.checkRead(file.getPath());
+		fd = new FileDescriptor();
+		if (openImpl(file.properPath(true)) != 0)
+			throw new FileNotFoundException(file.getPath());
+	}
+
+	/**
+	 * Constructs a new FileInputStream on the FileDescriptor <code>fd</code>.
+	 * The file must already be open, therefore no
+	 * <code>FileNotFoundException</code> will be thrown.
+	 * 
+	 * @param fd
+	 *            the FileDescriptor on which to stream reads.
+	 * 
+	 * @see java.lang.SecurityManager#checkRead(FileDescriptor)
+	 * @see java.lang.SecurityManager#checkRead(String)
+	 * @see java.lang.SecurityManager#checkRead(String, Object)
+	 */
+	public FileInputStream(FileDescriptor fd) {
+		super();
+		if (fd != null) {
+			SecurityManager security = System.getSecurityManager();
+			if (security != null)
+				security.checkRead(fd);
+			this.fd = fd;
+		} else
+			throw new NullPointerException();
+	}
+
+	/**
+	 * Constructs a new FileInputStream on the file named <code>fileName</code>.
+	 * If the file does not exist, the <code>FileNotFoundException</code> is
+	 * thrown. The <code>fileName</code> may be absolute or relative to the
+	 * System property <code>"user.dir"</code>.
+	 * 
+	 * @param fileName
+	 *            the file on which to stream reads.
+	 * 
+	 * @throws FileNotFoundException
+	 *             If the <code>fileName</code> is not found.
+	 */
+	public FileInputStream(String fileName) throws FileNotFoundException {
+		SecurityManager security = System.getSecurityManager();
+		if (security != null)
+			security.checkRead(fileName);
+		fd = new FileDescriptor();
+		if (openImpl(new File(fileName).properPath(true)) != 0)
+			throw new FileNotFoundException(fileName);
+	}
+
+	/**
+	 * Answers a int representing then number of bytes that are available before
+	 * this InputStream will block. This method always returns the size of the
+	 * file minus the current position.
+	 * 
+	 * @return the number of bytes available before blocking.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs in this stream.
+	 */
+	public native int available() throws IOException;
+
+	/**
+	 * Close the FileInputStream.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to close this FileInputStream.
+	 */
+	public void close() throws IOException {
+		closeImpl();
+	}
+
+	private native void closeImpl() throws IOException;
+
+	/**
+	 * This method ensures that all resources for this file are released when it
+	 * is about to be garbage collected.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to finalize this
+	 *             FileInputStream.
+	 */
+	protected void finalize() throws IOException {
+		if (this.fd != null)
+			close();
+	}
+
+	/**
+	 * Answers the FileChannel equivalent to this input stream.
+	 * <p>
+	 * The file channel is read-only and has an initial position within the file
+	 * that is the same as the current position of the FileInputStream within
+	 * the file. All changes made to the underlying file descriptor state via
+	 * the channel are visible by the input stream and vice versa.
+	 * </p>
+	 * 
+	 * @return the file channel representation for this FileInputStream.
+	 */
+	public synchronized FileChannel getChannel() {
+		if (channel == null) {
+			channel = FileChannelFactory.getFileChannel(fd.descriptor,
+					FileChannelFactory.O_RDONLY);
+		}
+		return channel;
+	}
+
+	/**
+	 * Answers the FileDescriptor representing the operating system resource for
+	 * this FileInputStream.
+	 * 
+	 * @return the FileDescriptor for this FileInputStream.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to get the FileDescriptor of
+	 *             this FileInputStream.
+	 */
+	public final FileDescriptor getFD() throws IOException {
+		if (fd != null)
+			return fd;
+		throw new IOException();
+	}
+
+	private native int openImpl(byte[] fileName);
+
+	/**
+	 * Reads a single byte from this FileInputStream and returns the result as
+	 * an int. The low-order byte is returned or -1 of the end of stream was
+	 * encountered.
+	 * 
+	 * @return the byte read or -1 if end of stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public int read() throws IOException {
+		if (fd != null)
+			return readByteImpl(getFD().descriptor);
+		throw new IOException();
+	}
+
+	private native int readByteImpl(long descriptor) throws IOException;
+
+	/**
+	 * Reads bytes from the FileInputStream and stores them in byte array
+	 * <code>buffer</code>. Answer the number of bytes actually read or -1 if
+	 * no bytes were read and end of stream was encountered.
+	 * 
+	 * @param buffer
+	 *            the byte array in which to store the read bytes.
+	 * @return the number of bytes actually read or -1 if end of stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public int read(byte[] buffer) throws IOException {
+		return read(buffer, 0, buffer.length);
+	}
+
+	/**
+	 * Reads at most <code>count</code> bytes from the FileInputStream and
+	 * stores them in byte array <code>buffer</code> starting at
+	 * <code>offset</code>. Answer the number of bytes actually read or -1 if
+	 * no bytes were read and end of stream was encountered.
+	 * 
+	 * @param buffer
+	 *            the byte array in which to store the read bytes.
+	 * @param offset
+	 *            the offset in <code>buffer</code> to store the read bytes.
+	 * @param count
+	 *            the maximum number of bytes to store in <code>buffer</code>.
+	 * @return the number of bytes actually read or -1 if end of stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public int read(byte[] buffer, int offset, int count) throws IOException {
+		if (fd != null)
+			return readImpl(buffer, offset, count, getFD().descriptor);
+		throw new IOException();
+	}
+
+	private native int readImpl(byte[] buffer, int offset, int count,
+			long descriptor) throws IOException;
+
+	/**
+	 * Skips <code>count</code> number of bytes in this FileInputStream.
+	 * Subsequent <code>read()</code>'s will not return these bytes unless
+	 * <code>reset()</code> is used. This method may perform multiple reads to
+	 * read <code>count</code> bytes. This default implementation reads
+	 * <code>count</code> bytes into a temporary buffer.
+	 * 
+	 * @param count
+	 *            the number of bytes to skip.
+	 * @return the number of bytes actually skipped.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public native long skip(long count) throws IOException;
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileNotFoundException.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileNotFoundException.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileNotFoundException.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileNotFoundException.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,44 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io; 
+
+
+/**
+ * This IO exception is thrown when a file specified by a program cannot be
+ * found.
+ * 
+ */
+public class FileNotFoundException extends IOException {
+
+	/**
+	 * Constructs a new instance of this class with its walkback filled in.
+	 */
+	public FileNotFoundException() {
+		super();
+	}
+
+	/**
+	 * Constructs a new instance of this class with its walkback and message
+	 * filled in.
+	 * 
+	 * @param detailMessage
+	 *            The detail message for the exception.
+	 */
+	public FileNotFoundException(String detailMessage) {
+		super(detailMessage);
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileOutputStream.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileOutputStream.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileOutputStream.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileOutputStream.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,295 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+import java.nio.channels.FileChannel;
+
+/**
+ * FileOutputStream is a class whose underlying stream is represented by a file
+ * in the operating system. The bytes that are written to this stream are passed
+ * directly to the underlying operating system equivalent function. Since
+ * overhead may be high in writing to the OS, FileOutputStreams are usually
+ * wrapped with a BufferedOutputStream to reduce the number of times the OS is
+ * called.
+ * <p>
+ * <code>BufferedOutputStream buf = new BufferedOutputStream(new FileOutputStream("aFile.txt"));</code>
+ * 
+ * @see FileInputStream
+ */
+public class FileOutputStream extends OutputStream {
+
+	/**
+	 * The FileDescriptor representing this FileOutputStream.
+	 */
+	FileDescriptor fd;
+
+	// The unique file channel associated with this FileInputStream (lazily
+	// initialized).
+	private FileChannel channel;
+
+	// Fill in the JNI id caches
+	private static native void oneTimeInitialization();
+
+	static {
+		oneTimeInitialization();
+	}
+
+	/**
+	 * Constructs a new FileOutputStream on the File <code>file</code>. If
+	 * the file exists, it is written over. See the constructor which can append
+	 * to the file if so desired.
+	 * 
+	 * @param file
+	 *            the File on which to stream reads.
+	 * 
+	 * @throws FileNotFoundException
+	 *             If the <code>file</code> cannot be opened for writing.
+	 * 
+	 * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
+	 */
+	public FileOutputStream(File file) throws FileNotFoundException {
+		this(file, false);
+	}
+
+	/**
+	 * Constructs a new FileOutputStream on the File <code>file</code>. If
+	 * the file exists, it is written over. The parameter <code>append</code>
+	 * determines whether or not the file is opened and appended to or just
+	 * opened empty.
+	 * 
+	 * @param file
+	 *            the File on which to stream reads.
+	 * @param append
+	 *            a boolean indicating whether or not to append to an existing
+	 *            file.
+	 * 
+	 * @throws FileNotFoundException
+	 *             If the <code>file</code> cannot be opened for writing.
+	 * 
+	 * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
+	 * @see java.lang.SecurityManager#checkWrite(String)
+	 */
+	public FileOutputStream(File file, boolean append)
+			throws FileNotFoundException {
+		super();
+		SecurityManager security = System.getSecurityManager();
+		if (security != null)
+			security.checkWrite(file.getPath());
+		fd = new FileDescriptor();
+		if (openImpl(file.properPath(true), append) != 0)
+			throw new FileNotFoundException(file.getPath());
+
+	}
+
+	/**
+	 * Constructs a new FileOutputStream on the FileDescriptor <code>fd</code>.
+	 * The file must already be open, therefore no <code>FileIOException</code>
+	 * will be thrown.
+	 * 
+	 * @param fd
+	 *            the FileDescriptor on which to stream writes.
+	 * 
+	 * @see java.lang.SecurityManager#checkWrite(FileDescriptor)
+	 */
+	public FileOutputStream(FileDescriptor fd) {
+		super();
+		if (fd != null) {
+			SecurityManager security = System.getSecurityManager();
+			if (security != null)
+				security.checkWrite(fd);
+			this.fd = fd;
+		} else
+			throw new NullPointerException(com.ibm.oti.util.Msg
+					.getString("K006c")); //$NON-NLS-1$
+	}
+
+	/**
+	 * Constructs a new FileOutputStream on the file named <code>fileName</code>.
+	 * If the file exists, it is written over. See the constructor which can
+	 * append to the file if so desired. The <code>fileName</code> may be
+	 * absolute or relative to the System property <code>"user.dir"</code>.
+	 * 
+	 * @param filename
+	 *            the file on which to stream writes.
+	 * 
+	 * @throws FileNotFoundException
+	 *             If the <code>filename</code> cannot be opened for writing.
+	 */
+	public FileOutputStream(String filename) throws FileNotFoundException {
+		this(filename, false);
+	}
+
+	/**
+	 * Constructs a new FileOutputStream on the file named <code>filename</code>.
+	 * If the file exists, it is written over. The parameter <code>append</code>
+	 * determines whether or not the file is opened and appended to or just
+	 * opened empty. The <code>filename</code> may be absolute or relative to
+	 * the System property <code>"user.dir"</code>.
+	 * 
+	 * @param filename
+	 *            the file on which to stream writes.
+	 * @param append
+	 *            a boolean indicating whether or not to append to an existing
+	 *            file.
+	 * 
+	 * @throws FileNotFoundException
+	 *             If the <code>filename</code> cannot be opened for writing.
+	 */
+	public FileOutputStream(String filename, boolean append)
+			throws FileNotFoundException {
+		super();
+		SecurityManager security = System.getSecurityManager();
+		if (security != null)
+			security.checkWrite(filename);
+		fd = new FileDescriptor();
+		File f = new File(filename);
+		if (openImpl(f.properPath(true), append) != 0)
+			throw new FileNotFoundException(filename);
+
+	}
+
+	/**
+	 * Close the FileOutputStream. This implementation closes the underlying OS
+	 * resources allocated to represent this stream.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to close this FileOutputStream.
+	 */
+	public void close() throws IOException {
+		closeImpl();
+	}
+
+	private native void closeImpl() throws IOException;
+
+	/**
+	 * Frees any resources allocated to represent this FileOutputStream before
+	 * it is garbage collected. This method is called from the Java Virtual
+	 * Machine.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to finalize this
+	 *             FileOutputStream.
+	 */
+	protected void finalize() throws IOException {
+		if (fd != null)
+			close();
+	}
+
+	/**
+	 * Answers the FileChannel equivalent to this output stream.
+	 * <p>
+	 * The file channel is write-only and has an initial position within the
+	 * file that is the same as the current position of this FileOutputStream
+	 * within the file. All changes made to the underlying file descriptor state
+	 * via the channel are visible by the output stream and vice versa.
+	 * </p>
+	 * 
+	 * @return the file channel representation for this FileOutputStream.
+	 */
+	public synchronized FileChannel getChannel() {
+		if (channel == null) {
+			channel = FileChannelFactory.getFileChannel(fd.descriptor,
+					FileChannelFactory.O_WRONLY);
+		}
+		return channel;
+	}
+
+	/**
+	 * Answers a FileDescriptor which represents the lowest level representation
+	 * of a OS stream resource.
+	 * 
+	 * @return a FileDescriptor representing this FileOutputStream.
+	 * 
+	 * @throws IOException
+	 *             If the Stream is already closed and there is no
+	 *             FileDescriptor.
+	 */
+	public final FileDescriptor getFD() throws IOException {
+		if (fd != null)
+			return fd;
+		throw new IOException();
+	}
+
+	private native int openImpl(byte[] fileName, boolean openAppend);
+
+	/**
+	 * Writes the entire contents of the byte array <code>buffer</code> to
+	 * this FileOutputStream.
+	 * 
+	 * @param buffer
+	 *            the buffer to be written
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to write to this
+	 *             FileOutputStream.
+	 */
+	public void write(byte[] buffer) throws IOException {
+		write(buffer, 0, buffer.length);
+	}
+
+	/**
+	 * Writes <code>count</code> <code>bytes</code> from the byte array
+	 * <code>buffer</code> starting at <code>offset</code> to this
+	 * FileOutputStream.
+	 * 
+	 * @param buffer
+	 *            the buffer to be written
+	 * @param offset
+	 *            offset in buffer to get bytes
+	 * @param count
+	 *            number of bytes in buffer to write
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to write to this
+	 *             FileOutputStream.
+	 * @throws IndexOutOfBoundsException
+	 *             If offset or count are outside of bounds.
+	 * @throws NullPointerException
+	 *             If buffer is <code>null</code>.
+	 */
+	public void write(byte[] buffer, int offset, int count) throws IOException {
+		if (fd == null)
+			throw new IOException();
+		writeImpl(buffer, offset, count, getFD().descriptor);
+	}
+
+	private native void writeImpl(byte[] buffer, int offset, int count,
+			long descriptor) throws IOException;
+
+	/**
+	 * Writes the specified byte <code>oneByte</code> to this
+	 * FileOutputStream. Only the low order byte of <code>oneByte</code> is
+	 * written.
+	 * 
+	 * @param oneByte
+	 *            the byte to be written
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to write to this
+	 *             FileOutputStream.
+	 */
+	public void write(int oneByte) throws IOException {
+		if (fd != null) {
+			writeByteImpl(oneByte, getFD().descriptor);
+		} else
+			throw new IOException();
+	}
+
+	private native void writeByteImpl(int oneByte, long descriptor)
+			throws IOException;
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilePermission.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilePermission.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilePermission.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilePermission.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,347 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+import java.security.AccessController;
+import java.security.Permission;
+import java.security.PrivilegedAction;
+
+/**
+ * The class FilePermission is responsible for granting access to files or
+ * directories. The FilePermission is made up of a pathname and a set of actions
+ * which are valid for the pathname.
+ * <P>
+ * The <code>File.separatorChar</code> must be used in all pathnames when
+ * constructing a FilePermission. The following descriptions will assume the
+ * char is </code>/</code>. A pathname which ends in "/*", implies all the
+ * files and directories contained in that directory. If the pathname ends in
+ * "/-", it indicates all the files and directories in that directory
+ * <b>recursively</b>.
+ * 
+ */
+public final class FilePermission extends Permission implements Serializable {
+	static final long serialVersionUID = 7930732926638008763L;
+
+	// canonical path of this permission
+	private transient String canonPath;
+
+	// list of actions permitted for socket permission in order
+	private static final String[] actionList = { "read", "write", "execute", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			"delete" }; //$NON-NLS-1$
+
+	// "canonicalized" action list
+	private String actions;
+
+	// the numeric representation of this action list
+	// for implies() to check if one action list is the subset of another.
+	transient int mask = -1;
+
+	// global include all permission?
+	private transient boolean includeAll = false;
+
+	private transient boolean allDir = false;
+
+	private transient boolean allSubdir = false;
+
+	/**
+	 * Constructs a new FilePermission with the path and actions specified.
+	 * 
+	 * 
+	 * @param path
+	 *            the path to apply the actions to.
+	 * @param actions
+	 *            the actions for the <code>path<code>. May be any
+	 *							combination of read, write, execute, or delete.
+	 */
+	public FilePermission(String path, String actions) {
+		super(path);
+		init(path, actions);
+	}
+
+	private void init(final String path, String pathActions) {
+		if (pathActions != null && pathActions != "") { //$NON-NLS-1$
+			if (path != null) {
+				if (path.equals("<<ALL FILES>>")) { //$NON-NLS-1$
+					includeAll = true;
+				} else {
+					canonPath = (String) AccessController
+							.doPrivileged(new PrivilegedAction() {
+								public Object run() {
+									try {
+										return new File(path)
+												.getCanonicalPath();
+									} catch (IOException e) {
+										return path;
+									}
+								}
+							});
+					int plength = canonPath.length();
+					if (plength >= 1) {
+						if (canonPath.endsWith("*")) { //$NON-NLS-1$
+							if (plength == 1
+									|| (canonPath.charAt(plength - 2)) == File.separatorChar)
+								allDir = true;
+						} else if (canonPath.endsWith("-")) { //$NON-NLS-1$
+							if (plength == 1
+									|| (canonPath.charAt(plength - 2)) == File.separatorChar)
+								allSubdir = true;
+						}
+					}
+				}
+				this.actions = toCanonicalActionString(pathActions);
+			} else
+				throw new NullPointerException(com.ibm.oti.util.Msg
+						.getString("K006e")); //$NON-NLS-1$
+		} else
+			throw new IllegalArgumentException(com.ibm.oti.util.Msg
+					.getString("K006d")); //$NON-NLS-1$
+	}
+
+	/**
+	 * Answer the string representing this permissions actions. It must be of
+	 * the form "read,write,execute,delete", all lower case and in the correct
+	 * order if there is more than one action.
+	 * 
+	 * @param action
+	 *            the action name
+	 * @return the string representing this permission's actions
+	 */
+	private String toCanonicalActionString(String action) {
+		actions = action.trim().toLowerCase();
+
+		// get the numerical representation of the action list
+		mask = getMask(actions);
+
+		// convert the mask to a canonical action list.
+		int len = actionList.length;
+		// the test mask - shift the 1 to the leftmost position of the
+		// actionList
+		int highestBitMask = 1 << (len - 1);
+
+		// if a bit of mask is set, append the corresponding action to result
+		StringBuffer result = new StringBuffer();
+		boolean addedItem = false;
+		for (int i = 0; i < len; i++) {
+			if ((highestBitMask & mask) != 0) {
+				if (addedItem)
+					result.append(","); //$NON-NLS-1$
+				result.append(actionList[i]);
+				addedItem = true;
+			}
+			highestBitMask = highestBitMask >> 1;
+		}
+		return result.toString();
+	}
+
+	/**
+	 * Answers the numerical representation of the argument.
+	 * 
+	 * @param actionNames
+	 *            the action names
+	 * @return the action mask
+	 */
+	private int getMask(String actionNames) {
+		int actionInt = 0, head = 0, tail = 0;
+		do {
+			tail = actionNames.indexOf(",", head); //$NON-NLS-1$
+			String action = tail > 0 ? actionNames.substring(head, tail).trim()
+					: actionNames.substring(head).trim();
+			if (action.equals("read")) //$NON-NLS-1$
+				actionInt |= 8;
+			else if (action.equals("write")) //$NON-NLS-1$
+				actionInt |= 4;
+			else if (action.equals("execute")) //$NON-NLS-1$
+				actionInt |= 2;
+			else if (action.equals("delete")) //$NON-NLS-1$
+				actionInt |= 1;
+			else
+				throw new java.lang.IllegalArgumentException(
+						com.ibm.oti.util.Msg.getString("K006f", action)); //$NON-NLS-1$
+			head = tail + 1;
+		} while (tail > 0);
+		return actionInt;
+	}
+
+	/**
+	 * Answers the actions associated with the receiver.
+	 * 
+	 * @return the actions associated with the receiver.
+	 */
+	public String getActions() {
+		return actions;
+	}
+
+	/**
+	 * Check to see if this permission is equal to another. The two are equal if
+	 * <code>obj</code> is a FilePermission, they have the same path, and they
+	 * have the same actions.
+	 * 
+	 * @param obj
+	 *            the object to check equality with.
+	 * @return <code>true</code> if the two are equal, <code>false</code>
+	 *         otherwise.
+	 */
+	public boolean equals(Object obj) {
+		if (obj instanceof FilePermission) {
+			FilePermission fp = (FilePermission) obj;
+			if (fp.actions != actions)
+				if (fp.actions == null || !fp.actions.equals(actions))
+					return false;
+
+			/* Matching actions and both are <<ALL FILES>> ? */
+			if (fp.includeAll || includeAll)
+				return fp.includeAll == includeAll;
+			return fp.canonPath.equals(canonPath);
+		}
+		return false;
+	}
+
+	/**
+	 * Indicates whether the argument permission is implied by the receiver.
+	 * 
+	 * @param p
+	 *            java.security.Permission the permission to check.
+	 * @return <code>true</code> if the argument permission is implied by the
+	 *         receiver, and <code>false</code> if it is not.
+	 */
+	public boolean implies(Permission p) {
+		int match = impliesMask(p);
+		return match != 0 && match == ((FilePermission) p).mask;
+	}
+
+	/**
+	 * Answers an int describing what masks are implied by a specific
+	 * permission.
+	 * 
+	 * @param p
+	 *            the permission
+	 * @return the mask applied to the given permission
+	 */
+	int impliesMask(Permission p) {
+		if (!(p instanceof FilePermission))
+			return 0;
+		FilePermission fp = (FilePermission) p;
+		int matchedMask = mask & fp.mask;
+		// Can't match any bits?
+		if (matchedMask == 0)
+			return 0;
+
+		// Is this permission <<ALL FILES>>
+		if (includeAll)
+			return matchedMask;
+
+		// We can't imply all files
+		if (fp.includeAll)
+			return 0;
+
+		// Scan the length of p checking all match possibilities
+		// \- implies everything except \
+		int thisLength = canonPath.length();
+		if (allSubdir && thisLength == 2
+				&& !fp.canonPath.equals(File.separator))
+			return matchedMask;
+
+		boolean includeDir = false;
+		boolean lastIsSlash = false;
+		int pLength = fp.canonPath.length();
+		for (int i = 0; i < pLength; i++) {
+			char pChar = fp.canonPath.charAt(i);
+			// Is p longer than this permissions canonLength?
+			if (i >= thisLength) {
+				// If not includeDir then is has to be a mismatch.
+				if (!includeDir)
+					return 0;
+				/**
+				 * If we have * for this and the separator is not the last char
+				 * it is invalid. IE: this is '/a/*' and p is '/a/b/c' we should
+				 * fail on the separator after the b.
+				 */
+				if (pChar == File.separatorChar && (i != pLength - 1))
+					return 0;
+			} else {
+				// Can safely get cChar since it's in range.
+				char cChar = canonPath.charAt(i);
+				// Is this permission include all? (must have matched up until
+				// this point).
+				if (lastIsSlash && cChar == '-') {
+					// Checked at constructor for separator/-
+					if (!allSubdir)
+						return 0;
+					// If we've already seen '*' return 0, can't group - and *.
+					if (includeDir)
+						return 0;
+					return matchedMask;
+				}
+				// Is this permission include a dir? Continue the check
+				// afterwards.
+				if (lastIsSlash && cChar == '*') {
+					/* Checked at constructor for File.separator/* */
+					if (!allDir)
+						return 0;
+					// Cannot have two *'s in a row.
+					if (includeDir)
+						return 0;
+					// * does not match -
+					if (fp.allSubdir)
+						return 0;
+					// Set the fact that we have seen a * in this permission.
+					includeDir = true;
+					continue;
+				}
+				// Are the characters matched?
+				if (cChar != pChar)
+					return 0;
+				// Is is a separator char? Needed for /* and /-
+				lastIsSlash = cChar == File.separatorChar;
+			}
+		}
+		// Must have matched upto this point or it's a valid file in an include
+		// all directory
+		return pLength == thisLength || includeDir ? matchedMask : 0;
+	}
+
+	/**
+	 * Answers a new PermissionCollection in which to place FilePermission
+	 * Objects.
+	 * 
+	 * @return A new PermissionCollection suitable for storing FilePermission
+	 *         objects.
+	 */
+	public java.security.PermissionCollection newPermissionCollection() {
+		return new FilePermissionCollection();
+	}
+
+	/**
+	 * Answers an int representing the hash code value for this FilePermission.
+	 * 
+	 * @return int the hash code value for this FilePermission.
+	 */
+	public int hashCode() {
+		return (canonPath == null ? getName().hashCode() : canonPath.hashCode())
+				+ mask;
+	}
+
+	private void writeObject(ObjectOutputStream stream) throws IOException {
+		stream.defaultWriteObject();
+	}
+
+	private void readObject(ObjectInputStream stream) throws IOException,
+			ClassNotFoundException {
+		stream.defaultReadObject();
+		init(getName(), actions);
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilePermissionCollection.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilePermissionCollection.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilePermissionCollection.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilePermissionCollection.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,88 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io; 
+
+
+import java.security.Permission;
+import java.util.Vector;
+
+/**
+ * FilePermissionCollection is a class which holds a collection of
+ * FilePermission objects and can answer a boolean indicating whether or not a
+ * specific permissions is implied by a FilePermissionCollection.
+ * 
+ */
+final class FilePermissionCollection extends java.security.PermissionCollection
+		implements Serializable {
+	static final long serialVersionUID = 2202956749081564585L;
+
+	Vector permissions = new Vector();
+
+	/**
+	 * Construct a new FilePermissionCollection.
+	 */
+	public FilePermissionCollection() {
+		super();
+	}
+
+	/**
+	 * Add a permission Object to the permission collection.
+	 * 
+	 * @see java.security.PermissionCollection#add(java.security.Permission)
+	 */
+	public void add(Permission permission) {
+		if (!isReadOnly()) {
+			if (permission instanceof FilePermission)
+				permissions.addElement(permission);
+			else
+				throw new java.lang.IllegalArgumentException(permission
+						.toString());
+		} else
+			throw new IllegalStateException();
+	}
+
+	/**
+	 * Answers an enumeration for the collection of permissions.
+	 * 
+	 * @see java.security.PermissionCollection#elements()
+	 */
+	public java.util.Enumeration elements() {
+		return permissions.elements();
+	}
+
+	/**
+	 * Answers a boolean indicating whether or not this permissions collection
+	 * implies a specific <code>permission</code>.
+	 * 
+	 * @see java.security.PermissionCollection#implies(java.security.Permission)
+	 */
+	public boolean implies(Permission permission) {
+		if (permission instanceof FilePermission) {
+			FilePermission fp = (FilePermission) permission;
+			int matchedMask = 0;
+			int i = 0;
+			while (i < permissions.size()
+					&& ((matchedMask & fp.mask) != fp.mask)) {
+				// Cast will not fail since we added it
+				matchedMask |= ((FilePermission) permissions.elementAt(i))
+						.impliesMask(permission);
+				i++;
+			}
+			return ((matchedMask & fp.mask) == fp.mask);
+		}
+		return false;
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileReader.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileReader.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileReader.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileReader.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,71 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+/**
+ * FileReader is class for turning a file into a character Stream. Data read
+ * from the source is converted into characters. The encoding is assumed to
+ * 8859_1. The FileReader contains a buffer of bytes read from the source and
+ * converts these into characters as needed. The buffer size is 8K.
+ * 
+ * @see FileWriter
+ */
+public class FileReader extends InputStreamReader {
+
+	/**
+	 * Construct a new FileReader on the given File <code>file</code>. If the
+	 * <code>file</code> specified cannot be found, throw a
+	 * FileNotFoundException.
+	 * 
+	 * @param file
+	 *            a File to be opened for reading characters from.
+	 * 
+	 * @throws FileNotFoundException
+	 *             if the file cannot be opened for reading.
+	 */
+	public FileReader(File file) throws FileNotFoundException {
+		super(new FileInputStream(file));
+	}
+
+	/**
+	 * Construct a new FileReader on the given FileDescriptor <code>fd</code>.
+	 * Since a previously opened FileDescriptor is passed as an argument, no
+	 * FileNotFoundException is thrown.
+	 * 
+	 * @param fd
+	 *            the previously opened file descriptor.
+	 */
+	public FileReader(FileDescriptor fd) {
+		super(new FileInputStream(fd));
+	}
+
+	/**
+	 * Construct a new FileReader on the given file named <code>filename</code>.
+	 * If the <code>filename</code> specified cannot be found, throw a
+	 * FileNotFoundException.
+	 * 
+	 * @param filename
+	 *            an absolute or relative path specifying the file to open.
+	 * 
+	 * @throws FileNotFoundException
+	 *             if the filename cannot be opened for reading.
+	 */
+	public FileReader(String filename) throws FileNotFoundException {
+		super(new FileInputStream(filename));
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileWriter.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileWriter.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileWriter.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FileWriter.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,100 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io; 
+
+
+/**
+ * FileWriter is a class for writing characters out to a file. The default
+ * character encoding, 8859_1 is currently used to convert characters to bytes
+ * in the file.
+ * 
+ * @see FileReader
+ */
+public class FileWriter extends OutputStreamWriter {
+
+	/**
+	 * Creates a FileWriter using the File <code>file</code>.
+	 * 
+	 * @param file
+	 *            the non-null File to write bytes to.
+	 * 
+	 * @throws IOException
+	 *             If the given file is not found
+	 */
+	public FileWriter(File file) throws IOException {
+		super(new FileOutputStream(file));
+	}
+
+	/**
+	 * Creates a FileWriter using the File <code>file</code>. The parameter
+	 * <code>append</code> determines whether or not the file is opened and
+	 * appended to or just opened empty.
+	 * 
+	 * @param file
+	 *            the non-null File to write bytes to.
+	 * @param append
+	 *            should the file be appened to or opened empty.
+	 * 
+	 * @throws IOException
+	 *             If the given file is not found
+	 */
+	public FileWriter(File file, boolean append) throws IOException {
+		super(new FileOutputStream(file, append));
+	}
+
+	/**
+	 * Creates a FileWriter using the existing FileDescriptor <code>fd</code>.
+	 * 
+	 * @param fd
+	 *            the non-null FileDescriptor to write bytes to.
+	 */
+	public FileWriter(FileDescriptor fd) {
+		super(new FileOutputStream(fd));
+	}
+
+	/**
+	 * Creates a FileWriter using the platform dependent <code>filename</code>.
+	 * See the class description for how characters are converted to bytes.
+	 * 
+	 * @param filename
+	 *            the non-null name of the file to write bytes to.
+	 * 
+	 * @throws IOException
+	 *             If the given file is not found
+	 */
+	public FileWriter(String filename) throws IOException {
+		super(new FileOutputStream(new File(filename)));
+	}
+
+	/**
+	 * Creates a FileWriter using the platform dependent <code>filename</code>.
+	 * See the class description for how characters are converted to bytes. The
+	 * parameter <code>append</code> determines whether or not the file is
+	 * opened and appended to or just opened empty.
+	 * 
+	 * @param filename
+	 *            the non-null name of the file to write bytes to.
+	 * @param append
+	 *            should the file be appened to or opened empty.
+	 * 
+	 * @throws IOException
+	 *             If the given file is not found
+	 */
+	public FileWriter(String filename, boolean append) throws IOException {
+		super(new FileOutputStream(filename, append));
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilenameFilter.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilenameFilter.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilenameFilter.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilenameFilter.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,38 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+/**
+ * FilenameFilter is an interface which declares methods for filtering file names
+ * in the <code>list</code> method of File.
+ *
+ * @see			File
+ * @see			File#list(FilenameFilter)
+ */
+public interface FilenameFilter {
+
+/**
+ * Answers a boolean if a specific filename matches a filter.
+ *
+ * @param		dir			the directory in which the <code>filename</code> was found.
+ * @param		filename	the name of the file in <code>dir</dir> to test.
+ * @return 		boolean		<code>true</code> if the filename matches the filter and can be included
+ *							in the list, <code>false</code> otherwise.
+ */
+public abstract boolean accept(File dir, String filename);
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterInputStream.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterInputStream.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterInputStream.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterInputStream.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,188 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io; 
+
+
+/**
+ * FilteredInputStream is a class which takes an input stream and
+ * <em>filters</em> the input in some way. The filtered view may be a buffered
+ * view or one which uncompresses data before returning bytes read.
+ * FilterInputStreams are meant for byte streams.
+ * 
+ * @see FilterOutputStream
+ */
+public class FilterInputStream extends InputStream {
+
+	/**
+	 * The target InputStream which is being filtered.
+	 */
+	protected InputStream in;
+
+	/**
+	 * Constructs a new FilterInputStream on the InputStream <code>in</code>.
+	 * All reads are now filtered through this stream.
+	 * 
+	 * @param in
+	 *            The non-null InputStream to filter reads on.
+	 */
+	protected FilterInputStream(InputStream in) {
+		super();
+		this.in = in;
+	}
+
+	/**
+	 * Answers a int representing the number of bytes that are available before
+	 * this FilterInputStream will block. This method returns the number of
+	 * bytes available in the target stream.
+	 * 
+	 * @return the number of bytes available before blocking.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs in this stream.
+	 */
+	public int available() throws IOException {
+		return in.available();
+	}
+
+	/**
+	 * Close this FilterInputStream. This implementation closes the target
+	 * stream.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to close this stream.
+	 */
+	public void close() throws IOException {
+		in.close();
+	}
+
+	/**
+	 * Set a Mark position in this FilterInputStream. The parameter
+	 * <code>readLimit</code> indicates how many bytes can be read before a
+	 * mark is invalidated. Sending reset() will reposition the Stream back to
+	 * the marked position provided <code>readLimit</code> has not been
+	 * surpassed.
+	 * <p>
+	 * This implementation sets a mark in the target stream.
+	 * 
+	 * @param readlimit
+	 *            the number of bytes to be able to read before invalidating the
+	 *            mark.
+	 */
+	public synchronized void mark(int readlimit) {
+		in.mark(readlimit);
+	}
+
+	/**
+	 * Answers a boolean indicating whether or not this FilterInputStream
+	 * supports mark() and reset(). This implementation answers whether or not
+	 * the target stream supports marking.
+	 * 
+	 * @return <code>true</code> if mark() and reset() are supported,
+	 *         <code>false</code> otherwise.
+	 */
+	public boolean markSupported() {
+		return in.markSupported();
+	}
+
+	/**
+	 * Reads a single byte from this FilterInputStream and returns the result as
+	 * an int. The low-order byte is returned or -1 of the end of stream was
+	 * encountered. This implementation returns a byte from the target stream.
+	 * 
+	 * @return the byte read or -1 if end of stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public int read() throws IOException {
+		return in.read();
+	}
+
+	/**
+	 * Reads bytes from this FilterInputStream and stores them in byte array
+	 * <code>buffer</code>. Answer the number of bytes actually read or -1 if
+	 * no bytes were read and end of stream was encountered. This implementation
+	 * reads bytes from the target stream.
+	 * 
+     * @param buffer
+	 *            the byte array in which to store the read bytes.
+	 * @return the number of bytes actually read or -1 if end of stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public int read(byte[] buffer) throws IOException {
+		return read(buffer, 0, buffer.length);
+	}
+
+	/**
+	 * Reads at most <code>count</code> bytes from this FilterInputStream and
+	 * stores them in byte array <code>buffer</code> starting at
+	 * <code>offset</code>. Answer the number of bytes actually read or -1 if
+	 * no bytes were read and end of stream was encountered. This implementation
+	 * reads bytes from the target stream.
+	 * 
+	 * @param buffer
+	 *            the byte array in which to store the read bytes.
+	 * @param offset
+	 *            the offset in <code>buffer</code> to store the read bytes.
+	 * @param count
+	 *            the maximum number of bytes to store in <code>buffer</code>.
+	 * @return the number of bytes actually read or -1 if end of stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public int read(byte[] buffer, int offset, int count) throws IOException {
+		return in.read(buffer, offset, count);
+	}
+
+	/**
+	 * Reset this FilterInputStream to the last marked location. If the
+	 * <code>readlimit</code> has been passed or no <code>mark</code> has
+	 * been set, throw IOException. This implementation resets the target
+	 * stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public synchronized void reset() throws IOException {
+		in.reset();
+	}
+
+	/**
+	 * Skips <code>count</code> number of bytes in this InputStream.
+	 * Subsequent <code>read()</code>'s will not return these bytes unless
+	 * <code>reset()</code> is used. This implementation skips
+	 * <code>count</code> number of bytes in the target stream.
+	 * 
+	 * @param count
+	 *            the number of bytes to skip.
+	 * @return the number of bytes actually skipped.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public long skip(long count) throws IOException {
+		return in.skip(count);
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterOutputStream.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterOutputStream.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterOutputStream.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterOutputStream.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,137 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io; 
+
+
+/**
+ * FilteredOutputStream is a class which takes an output stream and
+ * <em>filters</em> the output in some way. The filtered view may be a
+ * buffered output or one which compresses data before actually writing the
+ * bytes. FilterOutputStreams are meant for byte streams.
+ * 
+ * @see FilterInputStream
+ */
+public class FilterOutputStream extends OutputStream {
+
+	/**
+	 * The target OutputStream for this filter.
+	 */
+	protected OutputStream out;
+
+	/**
+	 * Constructs a new FilterOutputStream on the OutputStream <code>out</code>.
+	 * All writes are now filtered through this stream.
+	 * 
+	 * @param out
+	 *            the target OutputStream to filter writes on.
+	 */
+	public FilterOutputStream(OutputStream out) {
+		this.out = out;
+	}
+
+	/**
+	 * Close this FilterOutputStream. This implementation closes the target
+	 * stream.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to close this stream.
+	 */
+	public void close() throws IOException {
+		try {
+			flush();
+		} catch (IOException e) {
+		}
+		/* Make sure we clean up this stream if exception fires */
+		out.close();
+	}
+
+	/**
+	 * Flush this FilterOutputStream to ensure all pending data is sent out to
+	 * the target OutputStream. This implementation flushes the target
+	 * OutputStream.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to flush this
+	 *             FilterOutputStream.
+	 */
+	public void flush() throws IOException {
+		out.flush();
+	}
+
+	/**
+	 * Writes the entire contents of the byte array <code>buffer</code> to
+	 * this FilterOutputStream. This implementation writes the
+	 * <code>buffer</code> to the target stream.
+	 * 
+	 * @param buffer
+	 *            the buffer to be written
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to write to this
+	 *             FilterOutputStream.
+	 */
+	public void write(byte buffer[]) throws IOException {
+		write(buffer, 0, buffer.length);
+	}
+
+	/**
+	 * Writes <code>count</code> <code>bytes</code> from the byte array
+	 * <code>buffer</code> starting at <code>offset</code> to this
+	 * FilterOutputStream. This implementation writes the <code>buffer</code>
+	 * to the target OutputStream.
+	 * 
+	 * @param buffer
+	 *            the buffer to be written
+	 * @param offset
+	 *            offset in buffer to get bytes
+	 * @param count
+	 *            number of bytes in buffer to write
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to write to this
+	 *             FilterOutputStream.
+	 * @throws IndexOutOfBoundsException
+	 *             If offset or count are outside of bounds.
+	 */
+	public void write(byte buffer[], int offset, int count) throws IOException {
+		// avoid int overflow, check null buffer
+		if (offset <= buffer.length && 0 <= offset && 0 <= count
+				&& count <= buffer.length - offset) {
+			for (int i = 0; i < count; i++)
+				// Call write() instead of out.write() since subclasses could
+				// override the write() method.
+				write(buffer[offset + i]);
+		} else
+			throw new ArrayIndexOutOfBoundsException(com.ibm.oti.util.Msg
+					.getString("K002f")); //$NON-NLS-1$
+	}
+
+	/**
+	 * Writes the specified byte <code>oneByte</code> to this
+	 * FilterOutputStream. Only the low order byte of <code>oneByte</code> is
+	 * written. This implementation writes the byte to the target OutputStream.
+	 * 
+	 * @param oneByte
+	 *            the byte to be written
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to write to this
+	 *             FilterOutputStream.
+	 */
+	public void write(int oneByte) throws IOException {
+		out.write(oneByte);
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterReader.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterReader.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterReader.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterReader.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,192 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+/**
+ * FilterReader is a class which takes a Reader and <em>filters</em> the input
+ * in some way. The filtered view may be a buffered view or one which
+ * uncompresses data before returning characters read.
+ * 
+ * @see FilterWriter
+ */
+public abstract class FilterReader extends Reader {
+
+	/**
+	 * The target Reader which is being filtered.
+	 */
+	protected Reader in;
+
+	/**
+	 * Constructs a new FilterReader on the Reader <code>in</code>. All reads
+	 * are now filtered through this Reader.
+	 * 
+	 * @param in
+	 *            The non-null Reader to filter reads on.
+	 */
+	protected FilterReader(Reader in) {
+		super(in);
+		this.in = in;
+	}
+
+	/**
+	 * Close this FilterReader. This implementation closes the target Reader.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to close this Reader.
+	 */
+	public void close() throws IOException {
+		synchronized (lock) {
+			in.close();
+		}
+	}
+
+	/**
+	 * Set a Mark position in this FilterReader. The parameter
+	 * <code>readLimit</code> indicates how many characters can be read before
+	 * a mark is invalidated. Sending reset() will reposition the Reader back to
+	 * the marked position provided <code>readLimit</code> has not been
+	 * surpassed.
+	 * <p>
+	 * This implementation sets a mark in the target Reader.
+	 * 
+	 * @param readlimit
+	 *            the number of characters to be able to read before
+	 *            invalidating the mark.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting mark this Reader.
+	 */
+	public synchronized void mark(int readlimit) throws IOException {
+		synchronized (lock) {
+			in.mark(readlimit);
+		}
+	}
+
+	/**
+	 * Answers a boolean indicating whether or not this FilterReader supports
+	 * mark() and reset(). This implementation answers whether or not the target
+	 * Reader supports marking.
+	 * 
+	 * @return indicates whether or not mark() and reset() are supported.
+	 */
+	public boolean markSupported() {
+		synchronized (lock) {
+			return in.markSupported();
+		}
+	}
+
+	/**
+	 * Reads a single char from this FilterReader and returns the result as an
+	 * int. The 2 lowest order bytes are returned or -1 of the end of reader was
+	 * encountered. This implementation returns a char from the target Reader.
+	 * 
+	 * @return The byte read or -1 if end of reader.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to read from this Reader.
+	 */
+	public int read() throws IOException {
+		synchronized (lock) {
+			return in.read();
+		}
+	}
+
+	/**
+	 * Reads at most <code>count</code> chars from this FilterReader and
+	 * stores them in char array <code>buffer</code> starting at offset
+	 * <code>offset</code>. Answer the number of chars actually read or -1 if
+	 * no chars were read and end of reader was encountered. This implementation
+	 * reads chars from the target reader.
+	 * 
+	 * @param buffer
+	 *            the char array in which to store the read chars.
+	 * @param offset
+	 *            the offset in <code>buffer</code> to store the read chars.
+	 * @param count
+	 *            the maximum number of chars to store in <code>buffer</code>.
+	 * @return the number of chars actually read or -1 if end of reader.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to read from this Reader.
+	 */
+	public int read(char[] buffer, int offset, int count) throws IOException {
+		synchronized (lock) {
+			return in.read(buffer, offset, count);
+		}
+	}
+
+	/**
+	 * Answers a <code>boolean</code> indicating whether or not this Reader is
+	 * ready to be read without blocking. If the result is <code>true</code>,
+	 * the next <code>read()</code> will not block. If the result is
+	 * <code>false</code> this Reader may or may not block when
+	 * <code>read()</code> is sent.
+	 * 
+	 * @return <code>true</code> if the receiver will not block when
+	 *         <code>read()</code> is called, <code>false</code> if unknown
+	 *         or blocking will occur.
+	 * 
+	 * @throws IOException
+	 *             If the Reader is already closed or some other IO error
+	 *             occurs.
+	 */
+
+	public boolean ready() throws IOException {
+		synchronized (lock) {
+			return in.ready();
+		}
+	}
+
+	/**
+	 * Reset this Readers position to the last <code>mark()</code> location.
+	 * Invocations of <code>read()/skip()</code> will occur from this new
+	 * location. If this Reader was not marked, the implementation of
+	 * <code>reset()</code> is implementation specific. See the comment for
+	 * the specific Reader subclass for implementation details. The default
+	 * action is to throw <code>IOException</code>.
+	 * 
+	 * @throws IOException
+	 *             if a problem occured or the target Reader does not support
+	 *             <code>mark()/reset()</code>.
+	 */
+	public void reset() throws IOException {
+		synchronized (lock) {
+			in.reset();
+		}
+	}
+
+	/**
+	 * Skips <code>count</code> number of characters in this Reader.
+	 * Subsequent <code>read()</code>'s will not return these characters
+	 * unless <code>reset()</code> is used. The default implementation is to
+	 * skip chars in the filtered Reader.
+	 * 
+	 * @param count
+	 *            the maximum number of characters to skip.
+	 * @return the number of characters actually skipped.
+	 * 
+	 * @throws IOException
+	 *             If the Reader is already closed or some other IO error
+	 *             occurs.
+	 */
+	public long skip(long count) throws IOException {
+		synchronized (lock) {
+			return in.skip(count);
+		}
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterWriter.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterWriter.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterWriter.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/FilterWriter.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,134 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+/**
+ * FilterWriter is a class which takes a Writer and <em>filters</em> the
+ * output in some way. The filtered view may be a buffered output or one which
+ * compresses data before actually writing the bytes.
+ * 
+ * @see FilterWriter
+ */
+public abstract class FilterWriter extends Writer {
+
+	/**
+	 * The Writer being filtered.
+	 */
+	protected Writer out;
+
+	/**
+	 * Constructs a new FilterWriter on the Writer <code>out</code>. All
+	 * writes are now filtered through this Writer.
+	 * 
+	 * @param out
+	 *            the target Writer to filter writes on.
+	 */
+	protected FilterWriter(Writer out) {
+		super(out);
+		this.out = out;
+	}
+
+	/**
+	 * Close this FilterWriter. Closes the Writer <code>out</code> by default.
+	 * This will close any downstream Writers as well. Any additional processing
+	 * required by concrete subclasses should be provided in their own
+	 * <code>close</code> implementation.
+	 * 
+	 * @throws java.io.IOException
+	 *             If an error occurs attempting to close this FilterWriter.
+	 */
+	public void close() throws IOException {
+		synchronized (lock) {
+			out.close();
+		}
+	}
+
+	/**
+	 * Flush this FilteredWriter to ensure all pending data is sent out to the
+	 * target Writer. This implementation flushes the target Writer.
+	 * 
+	 * @throws java.io.IOException
+	 *             If an error occurs attempting to flush this FilterWriter.
+	 */
+	public void flush() throws IOException {
+		synchronized (lock) {
+			out.flush();
+		}
+	}
+
+	/**
+	 * Writes <code>count</code> <code>chars</code> from the char array
+	 * <code>buffer</code> starting at offset <code>index</code> to this
+	 * FilterWriter. This implementation writes the <code>buffer</code> to the
+	 * target Writer.
+	 * 
+	 * @param buffer
+	 *            the buffer to be written
+	 * @param offset
+	 *            offset in buffer to get chars
+	 * @param count
+	 *            number of chars in buffer to write
+	 * 
+	 * @throws java.io.IOException
+	 *             If an error occurs attempting to write to this FilterWriter.
+	 */
+	public void write(char buffer[], int offset, int count) throws IOException {
+		synchronized (lock) {
+			out.write(buffer, offset, count);
+		}
+	}
+
+	/**
+	 * Writes the specified char <code>oneChar</code> to this FilterWriter.
+	 * Only the 2 low order bytes of <code>oneChar</code> is written. This
+	 * implementation writes the char to the target Writer.
+	 * 
+	 * @param oneChar
+	 *            the char to be written
+	 * 
+	 * @throws java.io.IOException
+	 *             If an error occurs attempting to write to this FilterWriter.
+	 */
+	public void write(int oneChar) throws IOException {
+		synchronized (lock) {
+			out.write(oneChar);
+		}
+	}
+
+	/**
+	 * Writes <code>count</code> <code>chars</code> from the String
+	 * <code>str</code> starting at offset <code>index</code> to this
+	 * FilterWriter. This implementation writes the <code>str</code> to the
+	 * target Writer.
+	 * 
+	 * @param str
+	 *            the String to be written.
+	 * @param offset
+	 *            offset in str to get chars.
+	 * @param count
+	 *            number of chars in str to write.
+	 * 
+	 * @throws java.io.IOException
+	 *             If an error occurs attempting to write to this FilterWriter.
+	 */
+	public void write(String str, int offset, int count) throws IOException {
+		synchronized (lock) {
+			out.write(str, offset, count);
+		}
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/IOException.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/IOException.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/IOException.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/IOException.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,45 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io;
+
+
+/**
+ * This IO exception is thrown when a program encounters some sort I/O error.
+ * Details may be specified in the constructor or by one of the subclasses.
+ * 
+
+ */
+public class IOException extends Exception {
+
+	/**
+	 * Constructs a new instance of this class with its walkback filled in.
+	 */
+	public IOException() {
+		super();
+	}
+
+	/**
+	 * Constructs a new instance of this class with its walkback and message
+	 * filled in.
+	 * 
+	 * @param detailMessage
+	 *            The detail message for the exception.
+	 */
+	public IOException(String detailMessage) {
+		super(detailMessage);
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/InputStream.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/InputStream.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/InputStream.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/io/InputStream.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,211 @@
+/* Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.io; 
+
+
+/**
+ * InputStream is an abstract class for all byte input streams. It provides
+ * basic method implementations for reading bytes from a stream.
+ * 
+ * @see OutputStream
+ */
+public abstract class InputStream extends Object {
+
+	private static byte[] skipBuf;
+
+	/**
+	 * This constructor does nothing interesting. Provided for signature
+	 * compatibility.
+	 */
+	public InputStream() {
+		/* empty */
+	}
+
+	/**
+	 * Answers a int representing then number of bytes that are available before
+	 * this InputStream will block. This method always returns 0. Subclasses
+	 * should override and indicate the correct number of bytes available.
+	 * 
+	 * @return the number of bytes available before blocking.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs in this InputStream.
+	 */
+	public int available() throws IOException {
+		return 0;
+	}
+
+	/**
+	 * Close the InputStream. Concrete implementations of this class should free
+	 * any resources during close. This implementation does nothing.
+	 * 
+	 * @throws IOException
+	 *             If an error occurs attempting to close this InputStream.
+	 */
+	public void close() throws IOException {
+		/* empty */
+	}
+
+	/**
+	 * Set a Mark position in this InputStream. The parameter
+	 * <code>readLimit</code> indicates how many bytes can be read before a
+	 * mark is invalidated. Sending reset() will reposition the Stream back to
+	 * the marked position provided <code>readLimit</code> has not been
+	 * surpassed.
+	 * <p>
+	 * This default implementation does nothing and concrete subclasses must
+	 * provide their own implementations.
+	 * 
+	 * @param readlimit
+	 *            the number of bytes to be able to read before invalidating the
+	 *            mark.
+	 */
+	public void mark(int readlimit) {
+		/* empty */
+	}
+
+	/**
+	 * Answers a boolean indicating whether or not this InputStream supports
+	 * mark() and reset(). This class provides a default implementation which
+	 * answers false.
+	 * 
+	 * @return <code>true</code> if mark() and reset() are supported,
+	 *         <code>false</code> otherwise.
+	 */
+	public boolean markSupported() {
+		return false;
+	}
+
+	/**
+	 * Reads a single byte from this InputStream and returns the result as an
+	 * int. The low-order byte is returned or -1 of the end of stream was
+	 * encountered. This abstract implementation must be provided by concrete
+	 * subclasses.
+	 * 
+	 * @return the byte read or -1 if end of stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public abstract int read() throws IOException;
+
+	/**
+	 * Reads bytes from the Stream and stores them in byte array <code>b</code>.
+	 * Answer the number of bytes actually read or -1 if no bytes were read and
+	 * end of stream was encountered.
+	 * 
+	 * @param b
+	 *            the byte array in which to store the read bytes.
+	 * @return the number of bytes actually read or -1 if end of stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public int read(byte b[]) throws IOException {
+		return read(b, 0, b.length);
+	}
+
+	/**
+	 * Reads at most <code>length</code> bytes from the Stream and stores them
+	 * in byte array <code>b</code> starting at <code>offset</code>. Answer
+	 * the number of bytes actually read or -1 if no bytes were read and end of
+	 * stream was encountered.
+	 * 
+	 * @param b
+	 *            the byte array in which to store the read bytes.
+	 * @param offset
+	 *            the offset in <code>b</code> to store the read bytes.
+	 * @param length
+	 *            the maximum number of bytes to store in <code>b</code>.
+	 * @return the number of bytes actually read or -1 if end of stream.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public int read(byte b[], int offset, int length) throws IOException {
+		// avoid int overflow, check null b
+		if (offset <= b.length && 0 <= offset && 0 <= length
+				&& length <= b.length - offset) {
+			for (int i = 0; i < length; i++) {
+				int c;
+				try {
+					if ((c = read()) == -1)
+						return i == 0 ? -1 : i;
+				} catch (IOException e) {
+					if (i != 0)
+						return i;
+					throw e;
+				}
+				b[offset + i] = (byte) c;
+			}
+			return length;
+		}
+		throw new ArrayIndexOutOfBoundsException();
+	}
+
+	/**
+	 * Reset this InputStream to the last marked location. If the
+	 * <code>readlimit</code> has been passed or no <code>mark</code> has
+	 * been set, throw IOException. This implementation throws IOException and
+	 * concrete subclasses should provide proper implementations.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public synchronized void reset() throws IOException {
+		throw new IOException();
+	}
+
+	/**
+	 * Skips <code>n</code> number of bytes in this InputStream. Subsequent
+	 * <code>read()</code>'s will not return these bytes unless
+	 * <code>reset()</code> is used. This method may perform multiple reads to
+	 * read <code>n</code> bytes. This default implementation reads
+	 * <code>n</code> bytes into a temporary buffer. Concrete subclasses
+	 * should provide their own implementation.
+	 * 
+	 * @param n
+	 *            the number of bytes to skip.
+	 * @return the number of bytes actually skipped.
+	 * 
+	 * @throws IOException
+	 *             If the stream is already closed or another IOException
+	 *             occurs.
+	 */
+	public long skip(long n) throws IOException {
+		if (n <= 0)
+			return 0;
+		long skipped = 0;
+		int toRead = n < 4096 ? (int) n : 4096;
+		if (skipBuf == null || skipBuf.length < toRead)
+			skipBuf = new byte[toRead];
+		while (skipped < n) {
+			int read = read(skipBuf, 0, toRead);
+			if (read == -1)
+				return skipped;
+			skipped += read;
+			if (read < toRead)
+				return skipped;
+			if (n - skipped < toRead)
+				toRead = (int) (n - skipped);
+		}
+		return skipped;
+	}
+}