source: trunk/src/gcc/libjava/java/io/CharArrayWriter.java@ 435

Last change on this file since 435 was 2, checked in by bird, 23 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 8.7 KB
Line 
1/* CharArrayWriter.java -- Write chars to a buffer
2 Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
3
4This file is part of GNU Classpath.
5
6GNU Classpath is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU Classpath is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Classpath; see the file COPYING. If not, write to the
18Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
1902111-1307 USA.
20
21Linking this library statically or dynamically with other modules is
22making a combined work based on this library. Thus, the terms and
23conditions of the GNU General Public License cover the whole
24combination.
25
26As a special exception, the copyright holders of this library give you
27permission to link this library with independent modules to produce an
28executable, regardless of the license terms of these independent
29modules, and to copy and distribute the resulting executable under
30terms of your choice, provided that you also meet, for each linked
31independent module, the terms and conditions of the license of that
32module. An independent module is a module which is not derived from
33or based on this library. If you modify this library, you may extend
34this exception to your version of the library, but you are not
35obligated to do so. If you do not wish to do so, delete this
36exception statement from your version. */
37
38
39package java.io;
40
41/**
42 * This class allows data to be written to a char array buffer and
43 * and then retrieved by an application. The internal char array
44 * buffer is dynamically resized to hold all the data written. Please
45 * be aware that writing large amounts to data to this stream will
46 * cause large amounts of memory to be allocated.
47 * <p>
48 * The size of the internal buffer defaults to 32 and it is resized
49 * in increments of 1024 chars. This behavior can be over-ridden by using the
50 * following two properties:
51 * <p>
52 * <ul>
53 * <li><xmp>gnu.java.io.CharArrayWriter.initialBufferSize</xmp>
54 * <li><xmp>gnu.java.io.CharArrayWriter.bufferIncrementSize</xmp>
55 * </ul>
56 * <p>
57 * There is a constructor that specified the initial buffer size and
58 * that is the preferred way to set that value because it it portable
59 * across all Java class library implementations.
60 * <p>
61 *
62 * @author Aaron M. Renn ([email protected])
63 * @author Tom Tromey <[email protected]>
64 */
65public class CharArrayWriter extends Writer
66{
67 /**
68 * The default initial buffer size
69 */
70 private static final int DEFAULT_INITIAL_BUFFER_SIZE = 32;
71
72 /**
73 * This method initializes a new <code>CharArrayWriter</code> with
74 * the default buffer size of 32 chars. If a different initial
75 * buffer size is desired, see the constructor
76 * <code>CharArrayWriter(int size)</code>.
77 */
78 public CharArrayWriter ()
79 {
80 this (DEFAULT_INITIAL_BUFFER_SIZE);
81 }
82
83 /**
84 * This method initializes a new <code>CharArrayWriter</code> with
85 * a specified initial buffer size.
86 *
87 * @param size The initial buffer size in chars
88 */
89 public CharArrayWriter (int size)
90 {
91 super ();
92 buf = new char[size];
93 }
94
95 /**
96 * Closes the stream. This method is guaranteed not to free the contents
97 * of the internal buffer, which can still be retrieved.
98 */
99 public void close ()
100 {
101 closed = true;
102 }
103
104 /**
105 * This method flushes all buffered chars to the stream.
106 */
107 public void flush () throws IOException
108 {
109 synchronized (lock)
110 {
111 if (closed)
112 throw new IOException ("Stream closed");
113 }
114 }
115
116 /**
117 * This method discards all of the chars that have been written to the
118 * internal buffer so far by setting the <code>count</code> variable to
119 * 0. The internal buffer remains at its currently allocated size.
120 */
121 public void reset ()
122 {
123 synchronized (lock)
124 {
125 count = 0;
126 // Allow this to reopen the stream.
127 // FIXME - what does the JDK do?
128 closed = false;
129 }
130 }
131
132 /**
133 * This method returns the number of chars that have been written to
134 * the buffer so far. This is the same as the value of the protected
135 * <code>count</code> variable. If the <code>reset</code> method is
136 * called, then this value is reset as well. Note that this method does
137 * not return the length of the internal buffer, but only the number
138 * of chars that have been written to it.
139 *
140 * @return The number of chars in the internal buffer
141 *
142 * @see reset
143 */
144 public int size ()
145 {
146 return count;
147 }
148
149 /**
150 * This method returns a char array containing the chars that have been
151 * written to this stream so far. This array is a copy of the valid
152 * chars in the internal buffer and its length is equal to the number of
153 * valid chars, not necessarily to the the length of the current
154 * internal buffer. Note that since this method allocates a new array,
155 * it should be used with caution when the internal buffer is very large.
156 */
157 public char[] toCharArray ()
158 {
159 synchronized (lock)
160 {
161 char[] nc = new char[count];
162 System.arraycopy(buf, 0, nc, 0, count);
163 return nc;
164 }
165 }
166
167 /**
168 * Returns the chars in the internal array as a <code>String</code>. The
169 * chars in the buffer are converted to characters using the system default
170 * encoding. There is an overloaded <code>toString()</code> method that
171 * allows an application specified character encoding to be used.
172 *
173 * @return A <code>String</code> containing the data written to this
174 * stream so far
175 */
176 public String toString ()
177 {
178 synchronized (lock)
179 {
180 return new String (buf, 0, count);
181 }
182 }
183
184 /**
185 * This method writes the writes the specified char into the internal
186 * buffer.
187 *
188 * @param oneChar The char to be read passed as an int
189 */
190 public void write (int oneChar) throws IOException
191 {
192 synchronized (lock)
193 {
194 if (closed)
195 throw new IOException ("Stream closed");
196
197 resize (1);
198 buf[count++] = (char) oneChar;
199 }
200 }
201
202 /**
203 * This method writes <code>len</code> chars from the passed in array
204 * <code>buf</code> starting at index <code>offset</code> into that buffer
205 *
206 * @param buffer The char array to write data from
207 * @param offset The index into the buffer to start writing data from
208 * @param len The number of chars to write
209 */
210 public void write (char[] buffer, int offset, int len) throws IOException
211 {
212 synchronized (lock)
213 {
214 if (closed)
215 throw new IOException ("Stream closed");
216
217 if (len >= 0)
218 resize (len);
219 System.arraycopy(buffer, offset, buf, count, len);
220 count += len;
221 }
222 }
223
224 /**
225 * This method writes <code>len</code> chars from the passed in
226 * <code>String</code> <code>buf</code> starting at index
227 * <code>offset</code> into the internal buffer.
228 *
229 * @param str The <code>String</code> to write data from
230 * @param offset The index into the string to start writing data from
231 * @param len The number of chars to write
232 */
233 public void write (String str, int offset, int len) throws IOException
234 {
235 synchronized (lock)
236 {
237 if (closed)
238 throw new IOException ("Stream closed");
239
240 if (len >= 0)
241 resize (len);
242 str.getChars(offset, offset + len, buf, count);
243 count += len;
244 }
245 }
246
247 /**
248 * This method writes all the chars that have been written to this stream
249 * from the internal buffer to the specified <code>Writer</code>.
250 *
251 * @param out The <code>Writer</code> to write to
252 *
253 * @exception IOException If an error occurs
254 */
255 public void writeTo (Writer out) throws IOException
256 {
257 synchronized (lock)
258 {
259 out.write(buf, 0, count);
260 }
261 }
262
263 /**
264 * This private method makes the buffer bigger when we run out of room
265 * by allocating a larger buffer and copying the valid chars from the
266 * old array into it. This is obviously slow and should be avoided by
267 * application programmers by setting their initial buffer size big
268 * enough to hold everything if possible.
269 */
270 private final void resize (int len)
271 {
272 if (count + len >= buf.length)
273 {
274 int newlen = buf.length * 2;
275 if (count + len > newlen)
276 newlen = count + len;
277 char[] newbuf = new char[newlen];
278 System.arraycopy(buf, 0, newbuf, 0, count);
279 buf = newbuf;
280 }
281 }
282
283 /**
284 * The internal buffer where the data written is stored
285 */
286 protected char[] buf;
287
288 /**
289 * The number of chars that have been written to the buffer
290 */
291 protected int count;
292
293 /**
294 * True if the stream has been closed.
295 */
296 private boolean closed;
297}
Note: See TracBrowser for help on using the repository browser.