001 /*
002 * Copyright (C) 2007 Google Inc.
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
024 import java.io.IOException;
025 import java.io.InputStream;
026 import java.io.InputStreamReader;
027 import java.io.OutputStream;
028 import java.net.URL;
029 import java.nio.charset.Charset;
030 import java.util.List;
031
032 /**
033 * Provides utility methods for working with resources in the classpath.
034 * Note that even though these methods use {@link URL} parameters, they
035 * are usually not appropriate for HTTP or other non-classpath resources.
036 *
037 * <p>All method parameters must be non-null unless documented otherwise.
038 *
039 * @author Chris Nokleberg
040 * @author Ben Yu
041 * @since 1
042 */
043 @Beta
044 public final class Resources {
045 private Resources() {}
046
047 /**
048 * Returns a factory that will supply instances of {@link InputStream} that
049 * read from the given URL.
050 *
051 * @param url the URL to read from
052 * @return the factory
053 */
054 public static InputSupplier<InputStream> newInputStreamSupplier(
055 final URL url) {
056 checkNotNull(url);
057 return new InputSupplier<InputStream>() {
058 public InputStream getInput() throws IOException {
059 return url.openStream();
060 }
061 };
062 }
063
064 /**
065 * Returns a factory that will supply instances of
066 * {@link InputStreamReader} that read a URL using the given character set.
067 *
068 * @param url the URL to read from
069 * @param charset the character set used when reading the URL contents
070 * @return the factory
071 */
072 public static InputSupplier<InputStreamReader> newReaderSupplier(
073 URL url, Charset charset) {
074 return CharStreams.newReaderSupplier(newInputStreamSupplier(url), charset);
075 }
076
077 /**
078 * Reads all bytes from a URL into a byte array.
079 *
080 * @param url the URL to read from
081 * @return a byte array containing all the bytes from the URL
082 * @throws IOException if an I/O error occurs
083 */
084 public static byte[] toByteArray(URL url) throws IOException {
085 return ByteStreams.toByteArray(newInputStreamSupplier(url));
086 }
087
088 /**
089 * Reads all characters from a URL into a {@link String}, using the given
090 * character set.
091 *
092 * @param url the URL to read from
093 * @param charset the character set used when reading the URL
094 * @return a string containing all the characters from the URL
095 * @throws IOException if an I/O error occurs.
096 */
097 public static String toString(URL url, Charset charset) throws IOException {
098 return CharStreams.toString(newReaderSupplier(url, charset));
099 }
100
101 /**
102 * Streams lines from a URL, stopping when our callback returns false, or we
103 * have read all of the lines.
104 *
105 * @param url the URL to read from
106 * @param charset the character set used when reading the URL
107 * @param callback the LineProcessor to use to handle the lines
108 * @return the output of processing the lines
109 * @throws IOException if an I/O error occurs
110 */
111 public static <T> T readLines(URL url, Charset charset,
112 LineProcessor<T> callback) throws IOException {
113 return CharStreams.readLines(newReaderSupplier(url, charset), callback);
114 }
115
116 /**
117 * Reads all of the lines from a URL. The lines do not include
118 * line-termination characters, but do include other leading and trailing
119 * whitespace.
120 *
121 * @param url the URL to read from
122 * @param charset the character set used when writing the file
123 * @return a mutable {@link List} containing all the lines
124 * @throws IOException if an I/O error occurs
125 */
126 public static List<String> readLines(URL url, Charset charset)
127 throws IOException {
128 return CharStreams.readLines(newReaderSupplier(url, charset));
129 }
130
131 /**
132 * Copies all bytes from a URL to an output stream.
133 *
134 * @param from the URL to read from
135 * @param to the output stream
136 * @throws IOException if an I/O error occurs
137 */
138 public static void copy(URL from, OutputStream to) throws IOException {
139 ByteStreams.copy(newInputStreamSupplier(from), to);
140 }
141
142 /**
143 * Returns a {@code URL} pointing to {@code resourceName} if the resource is
144 * found in the class path. {@code Resources.class.getClassLoader()} is used
145 * to locate the resource.
146 *
147 * @throws IllegalArgumentException if resource is not found
148 */
149 public static URL getResource(String resourceName) {
150 URL url = Resources.class.getClassLoader().getResource(resourceName);
151 checkArgument(url != null, "resource %s not found.", resourceName);
152 return url;
153 }
154
155 /**
156 * Returns a {@code URL} pointing to {@code resourceName} that is relative to
157 * {@code contextClass}, if the resource is found in the class path.
158 *
159 * @throws IllegalArgumentException if resource is not found
160 */
161 public static URL getResource(Class<?> contextClass, String resourceName) {
162 URL url = contextClass.getResource(resourceName);
163 checkArgument(url != null, "resource %s relative to %s not found.",
164 resourceName, contextClass.getName());
165 return url;
166 }
167 }