comparison src/fschmidt/util/java/IoUtils.java @ 68:00520880ad02

add fschmidt source
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 05 Oct 2025 17:24:15 -0600
parents
children
comparison
equal deleted inserted replaced
67:9d0fefce6985 68:00520880ad02
1 /*
2 Copyright (c) 2008 Franklin Schmidt <fschmidt@gmail.com>
3
4 Permission is hereby granted, free of charge, to any person obtaining a copy
5 of this software and associated documentation files (the "Software"), to deal
6 in the Software without restriction, including without limitation the rights
7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 copies of the Software, and to permit persons to whom the Software is
9 furnished to do so, subject to the following conditions:
10
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 THE SOFTWARE.
21 */
22
23 package fschmidt.util.java;
24
25 import java.io.BufferedInputStream;
26 import java.io.BufferedOutputStream;
27 import java.io.ByteArrayInputStream;
28 import java.io.ByteArrayOutputStream;
29 import java.io.File;
30 import java.io.FileInputStream;
31 import java.io.FileOutputStream;
32 import java.io.IOException;
33 import java.io.InputStream;
34 import java.io.InputStreamReader;
35 import java.io.OutputStream;
36 import java.io.OutputStreamWriter;
37 import java.io.Reader;
38 import java.io.Writer;
39 import java.net.HttpURLConnection;
40 import java.net.MalformedURLException;
41 import java.net.URL;
42 import java.nio.charset.Charset;
43 import java.util.Collections;
44 import java.util.Enumeration;
45 import java.util.Iterator;
46 import java.util.NoSuchElementException;
47 import java.util.jar.JarEntry;
48 import java.util.jar.JarFile;
49
50
51 public final class IoUtils {
52 private IoUtils() {} // never
53
54 private static final int bufSize = 8192;
55
56 public static String readAll(Reader in)
57 throws IOException
58 {
59 char[] a = new char[bufSize];
60 StringBuilder buf = new StringBuilder();
61 int n;
62 while( (n=in.read(a)) != -1 ) {
63 buf.append(a,0,n);
64 }
65 return buf.toString();
66 }
67
68 public static void copyAll(InputStream in,OutputStream out)
69 throws IOException
70 {
71 byte[] a = new byte[bufSize];
72 int n;
73 while( (n=in.read(a)) != -1 ) {
74 out.write(a,0,n);
75 }
76 }
77
78 public static int copyAllAndCount(InputStream in,OutputStream out)
79 throws IOException
80 {
81 byte[] a = new byte[bufSize];
82 int n;
83 int count = 0;
84 while( (n=in.read(a)) != -1 ) {
85 out.write(a,0,n);
86 count += n;
87 }
88 return count;
89 }
90
91 public static void copyAvailable(InputStream in,OutputStream out)
92 throws IOException
93 {
94 byte[] a = new byte[bufSize];
95 while( in.available() > 0 ) {
96 out.write(a,0,in.read(a));
97 }
98 }
99
100 public static byte[] readAll(InputStream in)
101 throws IOException
102 {
103 ByteArrayOutputStream out = new ByteArrayOutputStream();
104 copyAll(in,out);
105 return out.toByteArray();
106 }
107
108 public static void writeAll(byte[] a,OutputStream out)
109 throws IOException
110 {
111 copyAll(new ByteArrayInputStream(a),out);
112 }
113
114 public static byte[] readAll(File file)
115 throws IOException
116 {
117 int len = (int)file.length();
118 ByteArrayOutputStream out = new ByteArrayOutputStream(len) {
119 public byte[] toByteArray() {
120 return buf;
121 }
122 };
123 FileInputStream in = new FileInputStream(file);
124 copyAll(in,out);
125 in.close();
126 return out.toByteArray();
127 }
128
129 public static void writeAll(byte[] a,File file)
130 throws IOException
131 {
132 FileOutputStream fos = new FileOutputStream(file);
133 writeAll(a,fos);
134 fos.close();
135 }
136
137 public static String readPage(String url)
138 throws IOException
139 {
140 return new UrlCall(url).get();
141 }
142
143 public static String read(URL url)
144 throws IOException
145 {
146 return new UrlCall(url).get();
147 }
148
149 public static String post(String urlS,String postS)
150 throws IOException
151 {
152 return new UrlCall(urlS).post(postS);
153 }
154
155 public static String hideNull(String s) {
156 return s==null ? "" : s;
157 }
158
159 public static boolean delete(File file) {
160 if( file.isDirectory() ) {
161 File[] files = file.listFiles();
162 for( int i=0; i<files.length; i++ ) {
163 delete(files[i]);
164 }
165 }
166 return file.delete();
167 }
168
169 public static URL getUrlFromResource(String resourceName) {
170 /*
171 ClassLoader loader = IoUtils.class.getClassLoader();
172 return loader.getResource(resourceName);
173 */
174 return ClassLoader.getSystemResource(resourceName);
175 }
176
177 public static String getContentFromResource(String resourceName)
178 throws IOException
179 {
180 URL url = getUrlFromResource(resourceName);
181 return url==null ? null : read(url);
182 }
183
184 public static String read(File file)
185 throws IOException
186 {
187 Reader in = newFileReader(file);
188 String s = readAll(in);
189 in.close();
190 return s;
191 }
192
193 public static void write(File file,String s)
194 throws IOException
195 {
196 Writer out = newFileWriter(file);
197 out.write(s);
198 out.close();
199 }
200
201 public static Reader newFileReader(File file)
202 throws IOException
203 {
204 return new InputStreamReader(new FileInputStream(file),Charset.forName("utf-8"));
205 }
206
207 public static Reader newFileReader(String file)
208 throws IOException
209 {
210 return new InputStreamReader(new FileInputStream(file),Charset.forName("utf-8"));
211 }
212
213 public static Writer newFileWriter(File file)
214 throws IOException
215 {
216 return new OutputStreamWriter(new FileOutputStream(file),Charset.forName("utf-8"));
217 }
218
219 public static Writer newFileWriter(String file)
220 throws IOException
221 {
222 return new OutputStreamWriter(new FileOutputStream(file),Charset.forName("utf-8"));
223 }
224
225 public static int hashCode(InputStream in)
226 throws IOException
227 {
228 int h = 0;
229 int c;
230 while( (c=in.read()) != -1 ) {
231 h = 31*h + c;
232 }
233 return h;
234 }
235
236 public static int hashCode(File file)
237 throws IOException
238 {
239 InputStream in = new BufferedInputStream(new FileInputStream(file));
240 int r = hashCode(in);
241 in.close();
242 return r;
243 }
244
245 public static int compare(InputStream in1,InputStream in2)
246 throws IOException
247 {
248 while(true) {
249 int c1 = in1.read();
250 int c2 = in2.read();
251 if( c1 == -1 && c2 == -1 )
252 return 0;
253 if( c1 != c2 )
254 return c1 - c2;
255 }
256 }
257
258 public static int compare(File file1,File file2)
259 throws IOException
260 {
261 InputStream in1 = new BufferedInputStream(new FileInputStream(file1));
262 InputStream in2 = new BufferedInputStream(new FileInputStream(file2));
263 int r = compare(in1,in2);
264 in2.close();
265 in1.close();
266 return r;
267 }
268
269 public static void copy(File file1,File file2)
270 throws IOException
271 {
272 InputStream in = new BufferedInputStream(new FileInputStream(file1));
273 OutputStream out = new BufferedOutputStream(new FileOutputStream(file2));
274 copyAll(in,out);
275 out.close();
276 in.close();
277 }
278
279 public static Iterable<URL> getResources(Class classInJarOrDir) {
280 String classFile = classInJarOrDir.getName().replace('.','/') + ".class";
281 return getResources(classFile);
282 }
283
284 public static Iterable<URL> getResources(String fileName) {
285 URL classUrl = ClassLoader.getSystemResource(fileName);
286 String protocol = classUrl.getProtocol();
287 if( protocol.equals("file") ) {
288 File f = new File(classUrl.getFile()).getParentFile();
289 for( int i = -1; (i = fileName.indexOf('/',i+1)) != -1; ) {
290 f = f.getParentFile();
291 }
292 return new FileIterator(f);
293 }
294 if( protocol.equals("jar") ) {
295 String s = classUrl.getFile();
296 if( !s.startsWith("file:") )
297 throw new RuntimeException("jar isn't file: "+classUrl);
298 File f = new File(s.substring(5,s.indexOf('!')));
299 try {
300 JarFile jar = new JarFile(f);
301 return new JarIterator(jar);
302 } catch(IOException e) {
303 throw new RuntimeException(e);
304 }
305 }
306 throw new RuntimeException("can't handle protocol: "+protocol);
307 }
308
309 private static class FileIterator implements Iterator<URL>, Iterable<URL> {
310 private final File[] files;
311 private Iterator<URL> childIter = Collections.<URL>emptyList().iterator();
312 private URL next;
313 private int i = -1;
314
315 FileIterator(File dir) {
316 this.files = dir.listFiles();
317 }
318
319 public Iterator<URL> iterator() {
320 return this;
321 }
322
323 public boolean hasNext() {
324 if( next!=null )
325 return true;
326 if( childIter.hasNext() ) {
327 next = childIter.next();
328 return true;
329 }
330 while( ++i < files.length ) {
331 File f = files[i];
332 if( f.isFile() ) {
333 try {
334 next = f.toURL();
335 } catch(MalformedURLException e) {
336 throw new RuntimeException(e);
337 }
338 return true;
339 }
340 if( f.isDirectory() ) {
341 childIter = new FileIterator(f);
342 if( childIter.hasNext() ) {
343 next = childIter.next();
344 return true;
345 }
346 }
347 }
348 return false;
349 }
350
351 public URL next() {
352 if( next==null )
353 throw new NoSuchElementException();
354 try {
355 return next;
356 } finally {
357 next = null;
358 }
359 }
360
361 public void remove() {
362 throw new UnsupportedOperationException();
363 }
364 }
365
366 private static class JarIterator implements Iterator<URL>, Iterable<URL> {
367 private final Enumeration<JarEntry> entries;
368 private final String urlBase;
369
370 JarIterator(JarFile jar) {
371 this.entries = jar.entries();
372 try {
373 this.urlBase = "jar:" + new File(jar.getName()).toURL().toString() + "!/";
374 } catch(MalformedURLException e) {
375 throw new RuntimeException(e);
376 }
377 }
378
379 public Iterator<URL> iterator() {
380 return this;
381 }
382
383 public boolean hasNext() {
384 return entries.hasMoreElements();
385 }
386
387 public URL next() {
388 try {
389 return new URL( urlBase + entries.nextElement() );
390 } catch(MalformedURLException e) {
391 throw new RuntimeException(e);
392 }
393 }
394
395 public void remove() {
396 throw new UnsupportedOperationException();
397 }
398 }
399
400 }