Merge from the pain train
[official-gcc.git] / libjava / java / io / DataOutputStream.java
blob9a2d172ac46701c68038d641b23b65383311e919
1 /* DataOutputStream.java -- Writes primitive Java datatypes to streams
2 Copyright (C) 1998, 2001, 2003, 2005 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA.
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 package java.io;
41 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
42 * "The Java Language Specification", ISBN 0-201-63451-1
43 * Status: Complete to version 1.1.
46 /**
47 * This class provides a mechanism for writing primitive Java datatypes
48 * to an <code>OutputStream</code> in a portable way. Data written to
49 * a stream using this class can be read back in using the
50 * <code>DataInputStream</code> class on any platform.
52 * @see DataInputStream
54 * @author Aaron M. Renn (arenn@urbanophile.com)
55 * @author Tom Tromey (tromey@cygnus.com)
57 public class DataOutputStream extends FilterOutputStream implements DataOutput
59 /**
60 * This is the total number of bytes that have been written to the
61 * stream by this object instance.
63 protected int written;
65 /**
66 * This method initializes an instance of <code>DataOutputStream</code> to
67 * write its data to the specified underlying <code>OutputStream</code>
69 * @param out The subordinate <code>OutputStream</code> to which this
70 * object will write
72 public DataOutputStream (OutputStream out)
74 super (out);
75 written = 0;
78 /**
79 * This method flushes any unwritten bytes to the underlying stream.
81 * @exception IOException If an error occurs.
83 public void flush () throws IOException
85 out.flush();
88 /**
89 * This method returns the total number of bytes that have been written to
90 * the underlying output stream so far. This is the value of the
91 * <code>written</code> instance variable
93 * @return The number of bytes written to the stream.
95 public final int size ()
97 return written;
101 * This method writes the specified byte (passed as an <code>int</code>)
102 * to the underlying output stream.
104 * @param value The <code>byte</code> to write, passed as an <code>int</code>.
106 * @exception IOException If an error occurs.
108 public synchronized void write (int value) throws IOException
110 out.write (value);
111 ++written;
115 * This method writes <code>len</code> bytes from the specified byte array
116 * <code>buf</code> starting at position <code>offset</code> into the
117 * buffer to the underlying output stream.
119 * @param buf The byte array to write from.
120 * @param offset The index into the byte array to start writing from.
121 * @param len The number of bytes to write.
123 * @exception IOException If an error occurs.
125 public synchronized void write (byte[] buf, int offset, int len)
126 throws IOException
128 out.write(buf, offset, len);
129 written += len;
133 * This method writes a Java boolean value to an output stream. If
134 * <code>value</code> is <code>true</code>, a byte with the value of
135 * 1 will be written, otherwise a byte with the value of 0 will be
136 * written.
138 * The value written can be read using the <code>readBoolean</code>
139 * method in <code>DataInput</code>.
141 * @param value The <code>boolean</code> value to write to the stream
143 * @exception IOException If an error occurs
145 * @see DataInput#readBoolean
147 public final void writeBoolean (boolean value) throws IOException
149 write (value ? 1 : 0);
153 * This method writes a Java byte value to an output stream. The
154 * byte to be written will be in the lowest 8 bits of the
155 * <code>int</code> value passed.
157 * The value written can be read using the <code>readByte</code> or
158 * <code>readUnsignedByte</code> methods in <code>DataInput</code>.
160 * @param value The <code>byte</code> to write to the stream, passed as
161 * the low eight bits of an <code>int</code>.
163 * @exception IOException If an error occurs
165 * @see DataInput#readByte
166 * @see DataInput#readUnsignedByte
168 public final void writeByte (int value) throws IOException
170 write (value & 0xff);
174 * This method writes a Java short value to an output stream. The
175 * char to be written will be in the lowest 16 bits of the <code>int</code>
176 * value passed. These bytes will be written "big endian". That is,
177 * with the high byte written first in the following manner:
178 * <p>
179 * <code>byte0 = (byte)((value & 0xFF00) >> 8);<br>
180 * byte1 = (byte)(value & 0x00FF);</code>
181 * <p>
183 * The value written can be read using the <code>readShort</code> and
184 * <code>readUnsignedShort</code> methods in <code>DataInput</code>.
186 * @param value The <code>short</code> value to write to the stream,
187 * passed as an <code>int</code>.
189 * @exception IOException If an error occurs
191 * @see DataInput#readShort
192 * @see DataInput#readUnsignedShort
194 public final synchronized void writeShort (int value) throws IOException
196 write ((byte) (0xff & (value >> 8)));
197 write ((byte) (0xff & value));
201 * This method writes a Java char value to an output stream. The
202 * char to be written will be in the lowest 16 bits of the <code>int</code>
203 * value passed. These bytes will be written "big endian". That is,
204 * with the high byte written first in the following manner:
205 * <p>
206 * <code>byte0 = (byte)((value & 0xFF00) >> 8);<br>
207 * byte1 = (byte)(value & 0x00FF);</code>
208 * <p>
210 * The value written can be read using the <code>readChar</code>
211 * method in <code>DataInput</code>.
213 * @param value The <code>char</code> value to write,
214 * passed as an <code>int</code>.
216 * @exception IOException If an error occurs
218 * @see DataInput#readChar
220 public final synchronized void writeChar (int value) throws IOException
222 write ((byte) (0xff & (value >> 8)));
223 write ((byte) (0xff & value));
227 * This method writes a Java int value to an output stream. The 4 bytes
228 * of the passed value will be written "big endian". That is, with
229 * the high byte written first in the following manner:
230 * <p>
231 * <code>byte0 = (byte)((value & 0xFF000000) >> 24);<br>
232 * byte1 = (byte)((value & 0x00FF0000) >> 16);<br>
233 * byte2 = (byte)((value & 0x0000FF00) >> 8);<br>
234 * byte3 = (byte)(value & 0x000000FF);</code>
235 * <p>
237 * The value written can be read using the <code>readInt</code>
238 * method in <code>DataInput</code>.
240 * @param value The <code>int</code> value to write to the stream
242 * @exception IOException If an error occurs
244 * @see DataInput#readInt
246 public final synchronized void writeInt (int value) throws IOException
248 write ((byte) (0xff & (value >> 24)));
249 write ((byte) (0xff & (value >> 16)));
250 write ((byte) (0xff & (value >> 8)));
251 write ((byte) (0xff & value));
255 * This method writes a Java long value to an output stream. The 8 bytes
256 * of the passed value will be written "big endian". That is, with
257 * the high byte written first in the following manner:
258 * <p>
259 * <code>byte0 = (byte)((value & 0xFF00000000000000L) >> 56);<br>
260 * byte1 = (byte)((value & 0x00FF000000000000L) >> 48);<br>
261 * byte2 = (byte)((value & 0x0000FF0000000000L) >> 40);<br>
262 * byte3 = (byte)((value & 0x000000FF00000000L) >> 32);<br>
263 * byte4 = (byte)((value & 0x00000000FF000000L) >> 24);<br>
264 * byte5 = (byte)((value & 0x0000000000FF0000L) >> 16);<br>
265 * byte6 = (byte)((value & 0x000000000000FF00L) >> 8);<br>
266 * byte7 = (byte)(value & 0x00000000000000FFL);</code>
267 * <p>
269 * The value written can be read using the <code>readLong</code>
270 * method in <code>DataInput</code>.
272 * @param value The <code>long</code> value to write to the stream
274 * @exception IOException If an error occurs
276 * @see DataInput#readLong
278 public final synchronized void writeLong (long value) throws IOException
280 write ((byte) (0xff & (value >> 56)));
281 write ((byte) (0xff & (value>> 48)));
282 write ((byte) (0xff & (value>> 40)));
283 write ((byte) (0xff & (value>> 32)));
284 write ((byte) (0xff & (value>> 24)));
285 write ((byte) (0xff & (value>> 16)));
286 write ((byte) (0xff & (value>> 8)));
287 write ((byte) (0xff & value));
291 * This method writes a Java <code>float</code> value to the stream. This
292 * value is written by first calling the method
293 * <code>Float.floatToIntBits</code>
294 * to retrieve an <code>int</code> representing the floating point number,
295 * then writing this <code>int</code> value to the stream exactly the same
296 * as the <code>writeInt()</code> method does.
298 * The value written can be read using the <code>readFloat</code>
299 * method in <code>DataInput</code>.
301 * @param value The <code>float</code> value to write to the stream
303 * @exception IOException If an error occurs
305 * @see writeInt
306 * @see DataInput#readFloat
307 * @see Float#floatToIntBits
309 public final void writeFloat (float value) throws IOException
311 writeInt (Float.floatToIntBits (value));
315 * This method writes a Java <code>double</code> value to the stream. This
316 * value is written by first calling the method
317 * <code>Double.doubleToLongBits</code>
318 * to retrieve an <code>long</code> representing the floating point number,
319 * then writing this <code>long</code> value to the stream exactly the same
320 * as the <code>writeLong()</code> method does.
322 * The value written can be read using the <code>readDouble</code>
323 * method in <code>DataInput</code>.
325 * @param value The <code>double</code> value to write to the stream
327 * @exception IOException If an error occurs
329 * @see writeLong
330 * @see DataInput#readDouble
331 * @see Double#doubleToLongBits
333 public final void writeDouble (double value) throws IOException
335 writeLong (Double.doubleToLongBits (value));
339 * This method writes all the bytes in a <code>String</code> out to the
340 * stream. One byte is written for each character in the
341 * <code>String</code>.
342 * The high eight bits of each character are discarded, thus this
343 * method is inappropriate for completely representing Unicode characters.
345 * @param value The <code>String</code> to write to the stream
347 * @exception IOException If an error occurs
349 public final void writeBytes (String value) throws IOException
351 int len = value.length();
352 for (int i = 0; i < len; ++i)
353 writeByte (value.charAt(i));
357 * This method writes all the characters of a <code>String</code> to an
358 * output stream as an array of <code>char</code>'s. Each character
359 * is written using the method specified in the <code>writeChar</code>
360 * method.
362 * @param value The <code>String</code> to write to the stream
364 * @exception IOException If an error occurs
366 * @see writeChar
368 public final void writeChars (String value) throws IOException
370 int len = value.length();
371 for (int i = 0; i < len; ++i)
372 writeChar (value.charAt(i));
376 * This method writes a Java <code>String</code> to the stream in a modified
377 * UTF-8 format. First, two bytes are written to the stream indicating the
378 * number of bytes to follow. Note that this is the number of bytes in the
379 * encoded <code>String</code> not the <code>String</code> length. Next
380 * come the encoded characters. Each character in the <code>String</code>
381 * is encoded as either one, two or three bytes. For characters in the
382 * range of <code>\u0001</code> to <\u007F>, one byte is used. The character
383 * value goes into bits 0-7 and bit eight is 0. For characters in the range
384 * of <code>\u0080</code> to <code>\u007FF</code>, two bytes are used. Bits
385 * 6-10 of the character value are encoded bits 0-4 of the first byte, with
386 * the high bytes having a value of "110". Bits 0-5 of the character value
387 * are stored in bits 0-5 of the second byte, with the high bits set to
388 * "10". This type of encoding is also done for the null character
389 * <code>\u0000</code>. This eliminates any C style NUL character values
390 * in the output. All remaining characters are stored as three bytes.
391 * Bits 12-15 of the character value are stored in bits 0-3 of the first
392 * byte. The high bits of the first bytes are set to "1110". Bits 6-11
393 * of the character value are stored in bits 0-5 of the second byte. The
394 * high bits of the second byte are set to "10". And bits 0-5 of the
395 * character value are stored in bits 0-5 of byte three, with the high bits
396 * of that byte set to "10".
398 * The value written can be read using the <code>readUTF</code>
399 * method in <code>DataInput</code>.
401 * @param value The <code>String</code> to write to the output in UTF format
403 * @exception IOException If an error occurs
405 * @see DataInput#readUTF
407 public final synchronized void writeUTF(String value) throws IOException
409 int len = value.length();
410 int sum = 0;
412 for (int i = 0; i < len && sum <= 65535; ++i)
414 char c = value.charAt(i);
415 if (c >= '\u0001' && c <= '\u007f')
416 sum += 1;
417 else if (c == '\u0000' || (c >= '\u0080' && c <= '\u07ff'))
418 sum += 2;
419 else
420 sum += 3;
423 if (sum > 65535)
424 throw new UTFDataFormatException ();
426 writeShort (sum);
428 for (int i = 0; i < len; ++i)
430 char c = value.charAt(i);
431 if (c >= '\u0001' && c <= '\u007f')
432 write (c);
433 else if (c == '\u0000' || (c >= '\u0080' && c <= '\u07ff'))
435 write (0xc0 | (0x1f & (c >> 6)));
436 write (0x80 | (0x3f & c));
438 else
440 // JSL says the first byte should be or'd with 0xc0, but
441 // that is a typo. Unicode says 0xe0, and that is what is
442 // consistent with DataInputStream.
443 write (0xe0 | (0x0f & (c >> 12)));
444 write (0x80 | (0x3f & (c >> 6)));
445 write (0x80 | (0x3f & c));
450 } // class DataOutputStream