Java テスト用に作ったファイル読込み
以下のような static メソッドを書いて使い回してました。
public static String readText(String path) throws IOException{ try(InputStream in = new FileInputStream(path); ByteArrayOutputStream out = new ByteArrayOutputStream()){ in.transferTo(out); return out.toString(); } } public static byte[] readBinary(String path) throws IOException{ try(InputStream in = new FileInputStream(path)){ byte[] data = new byte[in.available()]; in.read(data); in.close(); return data; } }
そこで、引数に渡すパスが参照できるパスだけでなくて
このメソッドを呼び出すクラスと同じ場所にあるファイルパスでも
読込めるとテスト構成が、判りやすいと思いました。
実行速度は遅くて構わない。
簡単にテスト用のプログラムを書きたい目的で、以下のようにします。
呼び出し側クラスのパスでファイルが見つかればそれが優先です。
見つからなければ、引数で指定するパスで読み込もうとします。
public static String readText(String path) throws IOException{ try{ File file = Optional.ofNullable( ClassLoader.getSystemClassLoader() .getResource(Class.forName(Thread.currentThread() .getStackTrace()[2].getClassName()) .getPackageName().replaceAll("\\.", "/") + "/" + path) ).map(u->{ try{ return new File(u.toURI()); }catch(URISyntaxException e){ return null; } }).orElse(new File(path)); try(InputStream in = new FileInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream()){ in.transferTo(out); return out.toString(); } }catch(ClassNotFoundException ex){ ex.printStackTrace(); throw new IOException(ex.getMessage(), ex); } } public static byte[] readBinary(String path) throws IOException{ try{ File file = Optional.ofNullable( ClassLoader.getSystemClassLoader() .getResource(Class.forName(Thread.currentThread() .getStackTrace()[2].getClassName()) .getPackageName().replaceAll("\\.", "/") + "/" + path) ).map(u->{ try{ return new File(u.toURI()); }catch(URISyntaxException e){ return null; } }).orElse(new File(path)); try(InputStream in = new FileInputStream(file)){ byte[] data = new byte[in.available()]; in.read(data); in.close(); return data; } }catch(ClassNotFoundException ex){ ex.printStackTrace(); throw new IOException(ex.getMessage(), ex); } }