1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18 package org.apache.commons.crypto.utils;
19
20 import java.io.Closeable;
21 import java.io.IOException;
22 import java.io.InputStream;
23
24 import org.apache.commons.crypto.stream.input.Input;
25
26 /**
27 * General utility methods for working with IO.
28 */
29 public final class IoUtils {
30
31 /**
32 * Closes the Closeable objects and <b>ignore</b> any {@link IOException} or
33 * null pointers. Must only be used for cleanup in exception handlers.
34 *
35 * @param closeables the objects to close.
36 */
37 public static void cleanup(final Closeable... closeables) {
38 if (closeables != null) {
39 for (final Closeable c : closeables) {
40 closeQuietly(c);
41 }
42 }
43 }
44
45 /**
46 * Closes the given {@link Closeable} quietly by ignoring IOException.
47 *
48 * @param closeable The resource to close.
49 * @since 1.1.0
50 */
51 public static void closeQuietly(final Closeable closeable) {
52 if (closeable != null) {
53 try {
54 closeable.close();
55 } catch (final IOException e) { // NOPMD
56 }
57 }
58 }
59
60 /**
61 * Does the readFully based on Input's positioned read. This does not change
62 * the current offset of the stream and is thread-safe.
63 *
64 * @param in the input source.
65 * @param position the given position.
66 * @param buffer the buffer to be read.
67 * @param length the maximum number of bytes to read.
68 * @param offset the start offset in array buffer.
69 * @throws IOException if an I/O error occurs.
70 */
71 public static void readFully(final Input in, final long position, final byte[] buffer,
72 final int offset, final int length) throws IOException {
73 int nread = 0;
74 while (nread < length) {
75 final int nbytes = in.read(position + nread, buffer, offset + nread,
76 length - nread);
77 if (nbytes < 0) {
78 throw new IOException(
79 "End of stream reached before reading fully.");
80 }
81 nread += nbytes;
82 }
83 }
84
85 /**
86 * Does the readFully based on the Input read.
87 *
88 * @param in the input stream of bytes.
89 * @param buf the buffer to be read.
90 * @param off the start offset in array buffer.
91 * @param len the maximum number of bytes to read.
92 * @throws IOException if an I/O error occurs.
93 */
94 public static void readFully(final InputStream in, final byte[] buf, int off, final int len)
95 throws IOException {
96 int toRead = len;
97 while (toRead > 0) {
98 final int ret = in.read(buf, off, toRead);
99 if (ret < 0) {
100 throw new IOException("Premature EOF from inputStream");
101 }
102 toRead -= ret;
103 off += ret;
104 }
105 }
106
107 /**
108 * The private constructor of {@link IoUtils}.
109 */
110 private IoUtils() {
111 }
112 }