001 // Copyright 2006-2007 Regents of the University of California. May be used
002 // under the terms of the revised BSD license. See LICENSING for details.
003 package org.joe_e.charset;
004
005 import java.nio.charset.Charset;
006 import java.nio.ByteBuffer;
007 import java.io.InputStream;
008 import java.io.InputStreamReader;
009 import java.io.OutputStream;
010 import java.io.OutputStreamWriter;
011 import java.io.Reader;
012 import java.io.Writer;
013
014 /**
015 * ASCII I/O.
016 */
017 public final class ASCII {
018 private static final Charset charset = Charset.forName("US-ASCII");
019
020 private ASCII() {}
021
022 /**
023 * Encodes a string in US-ASCII.
024 * @param text The text to encode.
025 * @return The ASCII bytes.
026 */
027 static public byte[] encode(final String text) {
028 final ByteBuffer bytes = charset.encode(text);
029 final int len = bytes.limit();
030 final byte[] v = bytes.array();
031 if (len == v.length) { return v; }
032 final byte[] r = new byte[len];
033 System.arraycopy(v, bytes.arrayOffset(), r, 0, len);
034 return r;
035 }
036
037 /**
038 * Decodes a US-ASCII string. Each byte not corresponding to a US-ASCII
039 * character decodes to the Unicode replacement character U+FFFD. This
040 * method is equivalent to <code>decode(buffer, 0, buffer.length)</code>.
041 * @param buffer the ASCII-encoded string to decode
042 * @return The corresponding string
043 * @throws java.lang.IndexOutOfBoundsException
044 */
045 static public String decode(byte[] buffer) {
046 return decode(buffer, 0, buffer.length);
047 }
048
049 /**
050 * Decodes a US-ASCII string. Each byte not corresponding to a US-ASCII
051 * character decodes to the Unicode replacement character U+FFFD.
052 * @param buffer the ASCII-encoded string to decode
053 * @param off where to start decoding
054 * @param len how many bytes to decode
055 * @return the corresponding string
056 * @throws java.lang.IndexOutOfBoundsException
057 */
058 static public String decode(byte[] buffer, int off, int len) {
059 return charset.decode(ByteBuffer.wrap(buffer, off, len)).toString();
060 }
061
062 /**
063 * Constructs an ASCII reader.
064 * @param in The binary input stream
065 * @return the ASCII character reader.
066 */
067 static public Reader input(final InputStream in) {
068 return new InputStreamReader(in, charset);
069 }
070
071 /**
072 * Constructs an ASCII writer.
073 * @param out the output stream.
074 */
075 static public Writer output(final OutputStream out) {
076 return new OutputStreamWriter(out, charset);
077 }
078 }