Mercurial Hosting > nabble
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 } |