1 package org.unicode.cldr.util; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileNotFoundException; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.InputStreamReader; 10 import java.io.UncheckedIOException; 11 import java.net.URL; 12 import java.nio.charset.Charset; 13 import java.nio.charset.StandardCharsets; 14 15 import org.unicode.cldr.util.With.SimpleIterator; 16 17 public class FileReaders { 18 // 19 // public static SemiFileReader fillMapFromSemi(Class classLocation, String fileName, SemiFileReader handler) { 20 // return handler.process(classLocation, fileName); 21 // } openFile(Class<?> class1, String file)22 public static BufferedReader openFile(Class<?> class1, String file) { 23 return openFile(class1, file, StandardCharsets.UTF_8); 24 } 25 openFile(Class<?> class1, String file, Charset charset)26 public static BufferedReader openFile(Class<?> class1, String file, Charset charset) { 27 // URL path = null; 28 // String externalForm = null; 29 try { 30 // //System.out.println("Reading:\t" + file1.getCanonicalPath()); 31 // path = class1.getResource(file); 32 // externalForm = path.toExternalForm(); 33 // if (externalForm.startsWith("file:")) { 34 // externalForm = externalForm.substring(5); 35 // } 36 // File file1 = new File(externalForm); 37 // boolean x = file1.canRead(); 38 // final InputStream resourceAsStream = new FileInputStream(file1); 39 final InputStream resourceAsStream = class1.getResourceAsStream(file); 40 // String foo = class1.getResource(".").toString(); 41 if (charset == null) { 42 charset = StandardCharsets.UTF_8; 43 } 44 InputStreamReader reader = new InputStreamReader(resourceAsStream, charset); 45 BufferedReader bufferedReader = new BufferedReader(reader, 1024 * 64); 46 return bufferedReader; 47 } catch (Exception e) { 48 String className = class1 == null ? null : class1.getCanonicalName(); 49 String normalizedPath = null; 50 try { 51 String relativeFileName = FileReaders.getRelativeFileName(class1, "../util/"); 52 normalizedPath = PathUtilities.getNormalizedPathString(relativeFileName); 53 } catch (Exception e1) { 54 throw new IllegalArgumentException("Couldn't open file: " + file + "; relative to class: " 55 + className, e); 56 } 57 throw new IllegalArgumentException("Couldn't open file " + file + "; in path " + normalizedPath + "; relative to class: " 58 + className, e); 59 } 60 } 61 openFile(String directory, String file, Charset charset)62 public static BufferedReader openFile(String directory, String file, Charset charset) { 63 try { 64 return new BufferedReader(new InputStreamReader(new FileInputStream(new File(directory, file)), charset)); 65 } catch (FileNotFoundException e) { 66 throw new IllegalArgumentException(e); // handle dang'd checked exception 67 } 68 } 69 openFile(String directory, String file)70 public static BufferedReader openFile(String directory, String file) { 71 return openFile(directory, file, StandardCharsets.UTF_8); 72 } 73 getRelativeFileName(Class<?> class1, String filename)74 public static String getRelativeFileName(Class<?> class1, String filename) { 75 URL resource = class1.getResource(filename); 76 String resourceString = resource.toString(); 77 if (resourceString.startsWith("file:")) { 78 return resourceString.substring(5); 79 } else if (resourceString.startsWith("jar:file:")) { 80 return resourceString.substring(9); 81 } else if (resourceString.startsWith("wsjar:file:")) { 82 return resourceString.substring(11); 83 } else { 84 throw new IllegalArgumentException("File not found: " + resourceString); 85 } 86 } 87 88 89 public static class ReadLineSimpleIterator implements SimpleIterator<String> { 90 final BufferedReader bufferedReader; 91 ReadLineSimpleIterator(BufferedReader bufferedReader)92 public ReadLineSimpleIterator(BufferedReader bufferedReader) { 93 super(); 94 this.bufferedReader = bufferedReader; 95 } 96 97 @Override next()98 public String next() { 99 try { 100 return bufferedReader.readLine(); 101 } catch (IOException e) { 102 throw new UncheckedIOException(e); 103 } 104 } 105 } 106 } 107