首页>>后端>>java->封装一个根据路径获取文件资源的工具类

封装一个根据路径获取文件资源的工具类

时间:2023-12-02 本站 点击:0

通常我们最多的场景是从本地资源中读取文件,这个时候我们经常需要注意的是相对路径、绝对路径问题;

除了从本地获取文件之外,从网络中获取文件资源(如图片)也属于相对常见的场景,接下来我们封装一个工具类,可以支持以上各种类型的数据读取。

首先定义一个公共方法如下,内部支持四种方式的数据获取

相对路径

绝对路径

用户根目录

网络

publicstaticInputStreamgetStreamByFileName(StringfileName)throwsIOException{if(fileName==null){thrownewIllegalArgumentException("fileNameshouldnotbenull!");}if(fileName.startsWith("http")){//网络地址returnnewURL(fileName).openConnection().getInputStream();}elseif(BasicFileUtil.isAbsFile(fileName)){//绝对路径Pathpath=Paths.get(fileName);returnFiles.newInputStream(path);}elseif(fileName.startsWith("~")){//用户目录下的绝对路径文件fileName=BasicFileUtil.parseHomeDir2AbsDir(fileName);returnFiles.newInputStream(Paths.get(fileName));}else{//相对路径returnFileReadUtil.class.getClassLoader().getResourceAsStream(fileName);}}

请注意上面的实现,绝对路径与相对路径比较好理解,用户目录,这个处理又是怎样的呢?

关键点在于,用户目录转绝对路径

借助System.getProperties系统属性来处理

/***将用户目录下地址~/xxx转换为绝对地址**@parampath*@return*/publicstaticStringparseHomeDir2AbsDir(Stringpath){StringhomeDir=System.getProperties().getProperty("user.home");returnStringUtils.replace(path,"~",homeDir);}

接下来再看如何判断一个路径是否为绝对路径呢?

这里需要格外注意不同操作系统的差异性,比如win,区分C盘,D盘,但是mac/linux则不分这个,上面判断的核心逻辑如下

publicstaticbooleanisAbsFile(StringfileName){if(OSUtil.isWinOS()){//windows操作系统时,绝对地址形如c:\descktopreturnfileName.contains(":")||fileName.startsWith("\\");}else{//macorlinuxreturnfileName.startsWith("/");}}/***是否windows系统*/publicstaticbooleanisWinOS(){booleanisWinOS=false;try{StringosName=System.getProperty("os.name").toLowerCase();StringsharpOsName=osName.replaceAll("windows","{windows}").replaceAll("^win([^a-z])","{windows}$1").replaceAll("([^a-z])win([^a-z])","$1{windows}$2");isWinOS=sharpOsName.contains("{windows}");}catch(Exceptione){e.printStackTrace();}returnisWinOS;}

除了上面的三种本地资源获取之外,还有一个就是网络资源的读取,上面介绍的实现姿势主要是基于JDK原生的URL,在实际使用时,这个并不稳定,不能确定能获取到完整的数据,原则上不推荐使用;如果可以,使用http-client/okhttp都是不错的选择

最后一个简单下载图片的case

Stringimg="https://c-ssl.duitang.com/uploads/item/201809/16/20180916175034_Gr2hk.thumb.1000_0.jpeg";BufferedImagepic=ImageIO.read(FileReadUtil.getStreamByFileName(img));System.out.println(pic);

尽信书则不如无书,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激。

微信公众号:一灰灰blog


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/10441.html