001: /*
002: * FindBugs - Find bugs in Java programs
003: * Copyright (C) 2003,2004 University of Maryland
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018: */
019:
020: // Copyright (C) 2003 William Pugh <pugh@cs.umd.edu>
021: // http://www.cs.umd.edu/~pugh
022: //
023: // This library is free software; you can redistribute it and/or
024: // modify it under the terms of the GNU Lesser General Public
025: // License as published by the Free Software Foundation; either
026: // version 2.1 of the License, or (at your option) any later version.
027: //
028: // This library is distributed in the hope that it will be useful,
029: // but WITHOUT ANY WARRANTY; without even the implied warranty of
030: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
031: // Lesser General Public License for more details.
032: //
033: package edu.umd.cs.findbugs.io;
034:
035: import java.io.BufferedReader;
036: import java.io.EOFException;
037: import java.io.IOException;
038: import java.io.InputStream;
039: import java.io.InputStreamReader;
040: import java.io.OutputStream;
041: import java.io.Reader;
042: import java.io.StringWriter;
043: import java.io.Writer;
044:
045: public class IO {
046: static ThreadLocal<byte[]> myByteBuf = new ThreadLocal<byte[]>() {
047: @Override
048: protected byte[] initialValue() {
049: return new byte[4096];
050: }
051: };
052: static ThreadLocal<char[]> myCharBuf = new ThreadLocal<char[]>() {
053: @Override
054: protected char[] initialValue() {
055: return new char[4096];
056: }
057: };
058:
059: public static String readAll(InputStream in) throws IOException {
060: return readAll(new InputStreamReader(in));
061: }
062:
063: public static String readAll(Reader reader) throws IOException {
064: BufferedReader r = new BufferedReader(reader);
065: StringWriter w = new StringWriter();
066: copy(r, w);
067: return w.toString();
068: }
069:
070: public static long copy(InputStream in, OutputStream out)
071: throws IOException {
072: return copy(in, out, Long.MAX_VALUE);
073: }
074:
075: public static long copy(Reader in, Writer out) throws IOException {
076: return copy(in, out, Long.MAX_VALUE);
077: }
078:
079: public static long copy(InputStream in, OutputStream out,
080: long maxBytes)
081:
082: throws IOException {
083: long total = 0;
084:
085: int sz;
086:
087: byte buf[] = myByteBuf.get();
088:
089: while (maxBytes > 0
090: && (sz = in.read(buf, 0, (int) Math.min(maxBytes,
091: (long) buf.length))) > 0) {
092: total += sz;
093: maxBytes -= sz;
094: out.write(buf, 0, sz);
095: }
096: return total;
097: }
098:
099: public static long copy(Reader in, Writer out, long maxChars)
100:
101: throws IOException {
102: long total = 0;
103:
104: int sz;
105:
106: char buf[] = myCharBuf.get();
107:
108: while (maxChars > 0
109: && (sz = in.read(buf, 0, (int) Math.min(maxChars,
110: (long) buf.length))) > 0) {
111: total += sz;
112: maxChars -= sz;
113: out.write(buf, 0, sz);
114: }
115: return total;
116: }
117:
118: /**
119: * Close given InputStream, ignoring any resulting exception.
120: *
121: * @param inputStream the InputStream to close;
122: * may be null (in which case nothing happens)
123: */
124: public static void close(InputStream inputStream) {
125: if (inputStream == null) {
126: return;
127: }
128:
129: try {
130: inputStream.close();
131: } catch (IOException e) {
132: // Ignore
133: }
134: }
135:
136: /**
137: * Close given OutputStream, ignoring any resulting exception.
138: *
139: * @param outputStream the OutputStream to close;
140: * may be null (in which case nothing happens)
141: */
142: public static void close(OutputStream outputStream) {
143: if (outputStream == null) {
144: return;
145: }
146:
147: try {
148: outputStream.close();
149: } catch (IOException e) {
150: // Ignore
151: }
152: }
153:
154: /**
155: * Provide a skip fully method. Either skips the requested number of bytes or throws an IOException;
156: * @param in The input stream on which to perform the skip
157: * @param bytes Number of bytes to skip
158: * @throws EOFException if we reach EOF and still need to skip more bytes
159: * @throws IOException if in.skip throws an IOException
160: */
161: public static void skipFully(InputStream in, long bytes)
162: throws IOException {
163: if (bytes < 0)
164: throw new IllegalArgumentException("Can't skip " + bytes
165: + " bytes");
166: long remaining = bytes;
167: while (remaining > 0) {
168: long skipped = in.skip(remaining);
169: if (skipped <= 0)
170: throw new EOFException(
171: "Reached EOF while trying to skip a total of "
172: + bytes);
173: remaining -= skipped;
174: }
175:
176: }
177: }
|