aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/io/OutputStreamWriter.java
diff options
context:
space:
mode:
authorTom Tromey <tromey@gcc.gnu.org>1999-04-07 14:42:40 +0000
committerTom Tromey <tromey@gcc.gnu.org>1999-04-07 14:42:40 +0000
commitee9dd3721be68b9fa63dea9aa5a1d86e66958cde (patch)
treed96801a16fdf03a5682ef98730fe333a46eef944 /libjava/java/io/OutputStreamWriter.java
parent140fa895c6b859f827fc4437b91775a82cd105fb (diff)
downloadgcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.zip
gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.tar.gz
gcc-ee9dd3721be68b9fa63dea9aa5a1d86e66958cde.tar.bz2
Initial revision
From-SVN: r26263
Diffstat (limited to 'libjava/java/io/OutputStreamWriter.java')
-rw-r--r--libjava/java/io/OutputStreamWriter.java155
1 files changed, 155 insertions, 0 deletions
diff --git a/libjava/java/io/OutputStreamWriter.java b/libjava/java/io/OutputStreamWriter.java
new file mode 100644
index 0000000..e529474
--- /dev/null
+++ b/libjava/java/io/OutputStreamWriter.java
@@ -0,0 +1,155 @@
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.io;
+import gnu.gcj.convert.UnicodeToBytes;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date April 17, 1998.
+ */
+/* Written using "Java Class Libraries", 2nd edition, plus online
+ * API docs for JDK 1.2 beta from http://www.javasoft.com.
+ * Status: Believed complete and correct, but only supports 8859_1.
+ */
+
+public class OutputStreamWriter extends Writer
+{
+ BufferedOutputStream out;
+
+ UnicodeToBytes converter;
+
+ /* Temporary buffer. */
+ private char[] work;
+ private int wcount;
+
+ public String getEncoding() { return converter.getName(); }
+
+ private OutputStreamWriter(OutputStream out, UnicodeToBytes encoder)
+ {
+ super(out);
+ this.out = out instanceof BufferedOutputStream ? (BufferedOutputStream) out
+ : new BufferedOutputStream(out, 2048);
+ this.converter = encoder;
+ }
+
+ public OutputStreamWriter(OutputStream out, String enc)
+ throws UnsupportedEncodingException
+ {
+ this(out, UnicodeToBytes.getEncoder(enc));
+ }
+
+ public OutputStreamWriter(OutputStream out)
+ {
+ this(out, UnicodeToBytes.getDefaultEncoder());
+ }
+
+ public void close() throws IOException
+ {
+ synchronized (lock)
+ {
+ flush();
+ if (out != null)
+ {
+ out.close();
+ out = null;
+ }
+ work = null;
+ }
+ }
+
+ public void flush() throws IOException
+ {
+ synchronized (lock)
+ {
+ if (wcount > 0)
+ {
+ writeChars(work, 0, wcount);
+ wcount = 0;
+ }
+ out.flush();
+ }
+ }
+
+ public void write(char[] buf, int offset, int count)
+ throws IOException
+ {
+ synchronized (lock)
+ {
+ if (wcount > 0)
+ {
+ writeChars(work, 0, wcount);
+ wcount = 0;
+ }
+ writeChars(buf, offset, count);
+ }
+ }
+
+ private void writeChars(char[] buf, int offset, int count)
+ throws IOException
+ {
+ while (count > 0)
+ {
+ if (out.count != 0)
+ {
+ out.flush();
+ if (out.count != 0)
+ throw new IOException("unable to flush output byte buffer");
+ }
+ converter.setOutput(out.buf, out.count);
+ int converted = converter.write(buf, offset, count);
+ offset += converted;
+ count -= converted;
+ out.count = converter.count;
+ }
+ }
+
+ public void write(String str, int offset, int count)
+ throws IOException
+ {
+ synchronized (lock)
+ {
+ if (work == null)
+ work = new char[100];
+ int wlength = work.length;
+ while (count > 0)
+ {
+ int size = count;
+ if (wcount + size > wlength)
+ {
+ if (2*wcount > wlength)
+ {
+ writeChars(work, 0, wcount);
+ wcount = 0;
+ }
+ if (wcount + size > wlength)
+ size = wlength - wcount;
+ }
+ str.getChars(offset, offset+size, work, wcount);
+ offset += size;
+ count -= size;
+ wcount += size;
+ }
+ }
+ }
+
+ public void write(int ch) throws IOException
+ {
+ synchronized (lock)
+ {
+ if (work == null)
+ work = new char[100];
+ if (wcount >= work.length)
+ {
+ writeChars(work, 0, wcount);
+ wcount = 0;
+ }
+ work[wcount++] = (char) ch;
+ }
+ }
+}