通常我们最多的场景是从本地资源中读取文件,这个时候我们经常需要注意的是相对路径、绝对路径问题;
除了从本地获取文件之外,从网络中获取文件资源(如图片)也属于相对常见的场景,接下来我们封装一个工具类,可以支持以上各种类型的数据读取
首先定义一个公共方法如下,内部支持四种方式的数据获取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public static InputStream getStreamByFileName (String fileName) throws IOException { if (fileName == null ) { throw new IllegalArgumentException("fileName should not be null!" ); } if (fileName.startsWith("http" )) { return new URL(fileName).openConnection().getInputStream(); } else if (BasicFileUtil.isAbsFile(fileName)) { Path path = Paths.get(fileName); return Files.newInputStream(path); } else if (fileName.startsWith("~" )) { fileName = BasicFileUtil.parseHomeDir2AbsDir(fileName); return Files.newInputStream(Paths.get(fileName)); } else { return FileReadUtil.class .getClassLoader ().getResourceAsStream (fileName ) ; } }
请注意上面的实现,绝对路径与相对路径比较好理解,用户目录,这个处理又是怎样的呢?
关键点在于,用户目录转绝对路径
借助System.getProperties
系统属性来处理
1 2 3 4 5 6 7 8 9 10 public static String parseHomeDir2AbsDir (String path) { String homeDir = System.getProperties().getProperty("user.home" ); return StringUtils.replace(path, "~" , homeDir); }
接下来再看如何判断一个路径是否为绝对路径呢?
这里需要格外注意不同操作系统的差异性,比如win,区分C盘,D盘,但是mac/linux则不分这个,上面判断的核心逻辑如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public static boolean isAbsFile (String fileName) { if (OSUtil.isWinOS()) { return fileName.contains(":" ) || fileName.startsWith("\\" ); } else { return fileName.startsWith("/" ); } } public static boolean isWinOS () { boolean isWinOS = false ; try { String osName = System.getProperty("os.name" ).toLowerCase(); String sharpOsName = osName.replaceAll("windows" , "{windows}" ).replaceAll("^win([^a-z])" , "{windows}$1" ) .replaceAll("([^a-z])win([^a-z])" , "$1{windows}$2" ); isWinOS = sharpOsName.contains("{windows}" ); } catch (Exception e) { e.printStackTrace(); } return isWinOS; }
除了上面的三种本地资源获取之外,还有一个就是网络资源的读取,上面介绍的实现姿势主要是基于JDK原生的URL,在实际使用时,这个并不稳定,不能确定能获取到完整的数据,原则上不推荐使用;如果可以,使用http-client/okhttp都是不错的选择
最后给一个简单的测试
最后一个简单下载图片的case
1 2 3 String img = "https://c-ssl.duitang.com/uploads/item/201809/16/20180916175034_Gr2hk.thumb.1000_0.jpeg" ; BufferedImage pic = ImageIO.read(FileReadUtil.getStreamByFileName(img)); System.out.println(pic);
一灰灰的联系方式 尽信书则不如无书,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激