001 /*
002 * Copyright (C) 2007 The Guava Authors
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package com.google.common.io;
018
019 import static com.google.common.base.Preconditions.checkArgument;
020 import static com.google.common.base.Preconditions.checkNotNull;
021
022 import com.google.common.annotations.Beta;
023 import com.google.common.base.Charsets;
024
025 import java.io.IOException;
026 import java.io.InputStream;
027 import java.io.InputStreamReader;
028 import java.io.OutputStream;
029 import java.net.URL;
030 import java.nio.charset.Charset;
031 import java.util.List;
032
033 /**
034 * Provides utility methods for working with resources in the classpath.
035 * Note that even though these methods use {@link URL} parameters, they
036 * are usually not appropriate for HTTP or other non-classpath resources.
037 *
038 * <p>All method parameters must be non-null unless documented otherwise.
039 *
040 * @author Chris Nokleberg
041 * @author Ben Yu
042 * @since 1.0
043 */
044 @Beta
045 public final class Resources {
046 private Resources() {}
047
048 /**
049 * Returns a factory that will supply instances of {@link InputStream} that
050 * read from the given URL.
051 *
052 * @param url the URL to read from
053 * @return the factory
054 */
055 public static InputSupplier<InputStream> newInputStreamSupplier(
056 final URL url) {
057 checkNotNull(url);
058 return new InputSupplier<InputStream>() {
059 @Override
060 public InputStream getInput() throws IOException {
061 return url.openStream();
062 }
063 };
064 }
065
066 /**
067 * Returns a factory that will supply instances of
068 * {@link InputStreamReader} that read a URL using the given character set.
069 *
070 * @param url the URL to read from
071 * @param charset the charset used to decode the input stream; see {@link
072 * Charsets} for helpful predefined constants
073 * @return the factory
074 */
075 public static InputSupplier<InputStreamReader> newReaderSupplier(
076 URL url, Charset charset) {
077 return CharStreams.newReaderSupplier(newInputStreamSupplier(url), charset);
078 }
079
080 /**
081 * Reads all bytes from a URL into a byte array.
082 *
083 * @param url the URL to read from
084 * @return a byte array containing all the bytes from the URL
085 * @throws IOException if an I/O error occurs
086 */
087 public static byte[] toByteArray(URL url) throws IOException {
088 return ByteStreams.toByteArray(newInputStreamSupplier(url));
089 }
090
091 /**
092 * Reads all characters from a URL into a {@link String}, using the given
093 * character set.
094 *
095 * @param url the URL to read from
096 * @param charset the charset used to decode the input stream; see {@link
097 * Charsets} for helpful predefined constants
098 * @return a string containing all the characters from the URL
099 * @throws IOException if an I/O error occurs.
100 */
101 public static String toString(URL url, Charset charset) throws IOException {
102 return CharStreams.toString(newReaderSupplier(url, charset));
103 }
104
105 /**
106 * Streams lines from a URL, stopping when our callback returns false, or we
107 * have read all of the lines.
108 *
109 * @param url the URL to read from
110 * @param charset the charset used to decode the input stream; see {@link
111 * Charsets} for helpful predefined constants
112 * @param callback the LineProcessor to use to handle the lines
113 * @return the output of processing the lines
114 * @throws IOException if an I/O error occurs
115 */
116 public static <T> T readLines(URL url, Charset charset,
117 LineProcessor<T> callback) throws IOException {
118 return CharStreams.readLines(newReaderSupplier(url, charset), callback);
119 }
120
121 /**
122 * Reads all of the lines from a URL. The lines do not include
123 * line-termination characters, but do include other leading and trailing
124 * whitespace.
125 *
126 * @param url the URL to read from
127 * @param charset the charset used to decode the input stream; see {@link
128 * Charsets} for helpful predefined constants
129 * @return a mutable {@link List} containing all the lines
130 * @throws IOException if an I/O error occurs
131 */
132 public static List<String> readLines(URL url, Charset charset)
133 throws IOException {
134 return CharStreams.readLines(newReaderSupplier(url, charset));
135 }
136
137 /**
138 * Copies all bytes from a URL to an output stream.
139 *
140 * @param from the URL to read from
141 * @param to the output stream
142 * @throws IOException if an I/O error occurs
143 */
144 public static void copy(URL from, OutputStream to) throws IOException {
145 ByteStreams.copy(newInputStreamSupplier(from), to);
146 }
147
148 /**
149 * Returns a {@code URL} pointing to {@code resourceName} if the resource is
150 * found in the class path. {@code Resources.class.getClassLoader()} is used
151 * to locate the resource.
152 *
153 * @throws IllegalArgumentException if resource is not found
154 */
155 public static URL getResource(String resourceName) {
156 URL url = Resources.class.getClassLoader().getResource(resourceName);
157 checkArgument(url != null, "resource %s not found.", resourceName);
158 return url;
159 }
160
161 /**
162 * Returns a {@code URL} pointing to {@code resourceName} that is relative to
163 * {@code contextClass}, if the resource is found in the class path.
164 *
165 * @throws IllegalArgumentException if resource is not found
166 */
167 public static URL getResource(Class<?> contextClass, String resourceName) {
168 URL url = contextClass.getResource(resourceName);
169 checkArgument(url != null, "resource %s relative to %s not found.",
170 resourceName, contextClass.getName());
171 return url;
172 }
173 }