IntelliJ中Maven项目加载资源文件遇URI权限组件错误如何解决?
我已经查看过相关问题的解决方案,但在IntelliJ的Maven项目中仍遇到相同问题,我的项目情况如下:
- Maven项目
somefile.txt位于资源文件夹中,文件名无拼写错误
源代码
import java.io.File; import java.net.URI; import java.net.URISyntaxException; public class FileLoading { public static void main(String ... args){ File someFile = null; try { someFile = new File( new URI("file://somefile.txt")); } catch (URISyntaxException e) { e.printStackTrace(); } System.out.println(someFile.getPath()); } }
报错信息
"C:\Program Files\Java\jdk1.8.0_162\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar=51711:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_162\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\rt.jar;C:\Users\U631156\code\java\target\classes" FileLoading Exception in thread "main" java.lang.IllegalArgumentException: URI has an authority component at java.io.File.<init>(File.java:423) at FileLoading.main(FileLoading.java:9) Process finished with exit code 1
问题原因与解决办法
这个报错的核心原因是你用的file://somefile.txt格式URI包含了权威组件——简单说就是//后面的部分(哪怕是空的),而Java的File类构造函数不接受带这种组件的URI。给你两种实用的解决方式:
方式一:调整URI格式
把URI改成file:somefile.txt(去掉两个斜杠),这样就不会触发权威组件的问题了,修改后的代码如下:
import java.io.File; import java.net.URI; import java.net.URISyntaxException; public class FileLoading { public static void main(String ... args){ File someFile = null; try { someFile = new File( new URI("file:somefile.txt")); } catch (URISyntaxException e) { e.printStackTrace(); } System.out.println(someFile.getPath()); } }
方式二:用类加载器读取资源(更推荐)
因为你的文件是Maven资源文件夹里的,运行时会被放到classpath下,直接用File可能会因为路径问题找不到文件,用类加载器读取更可靠,还不用纠结URI格式:
import java.io.InputStream; public class FileLoading { public static void main(String ... args){ // 通过类加载器获取资源输入流 InputStream inputStream = FileLoading.class.getClassLoader().getResourceAsStream("somefile.txt"); if(inputStream != null){ System.out.println("成功找到并读取资源文件"); // 记得用完关闭流,避免资源泄漏 try { inputStream.close(); } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("未找到指定的资源文件"); } } }
这种方式适配Maven项目的资源管理逻辑,不管是本地运行还是打包后都能正常读取文件。
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

