我有一个需要excel文件的程序,可以由用户修改,因此我已经在类路径中包含了一个副本,以防万一可以手动更改的文件会消失。这个想法是第一次运行程序时,包含在包中的文件被复制到另一个文件夹中,用户可以在其中编辑它。
当我使用eclipse运行测试时,副本实际上完成了。这样做的来源是:
public static void createExcelIfNotExists() throws URISyntaxException, IOException{
File fOrigin = new File("doc\\Data.xlsx");
if(fOrigin.exists())
return;
fOrigin = new File(ExcelDataProcessor.class.getResource("dt.xlsx").toURI());
File fDestiny = new File("doc\\Data.xlsx");
OutputStream o = new FileOutputStream(fDestiny);
Files.copy(fOrigin.toPath(), o);
}
正如我所说,在eclipse测试环境中没关系,当我将项目导出到.jar文件时问题就出现了。尽管文件夹doc实际存在并且包实际上包含dt.xlsx
文档,但是当我运行程序时,文件不会放在那里。
当我运行程序时,我得到的错误是图片中的错误
d:\Jar>java -jar prog.jar
creating directory: logs
DIR created
creating directory: records
DIR created
creating directory: doc
DIR created
java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(File.java:418)
at fileDataProcessing.ExcelDataProcessor.createExcelIfNotExists(ExcelDataProcessor.java:101)
at menus.MainMenu.initializeDirectoriesAndConfigFiles(MainMenu.java:880)
at menus.MainMenu.main(MainMenu.java:859)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
关于问题如何来自URI或我如何解决它的任何提示?
答案 0 :(得分:2)
当您的程序打包到JAR文件中时,CLASSPATH上的文件位于JAR文件的ZIP存档中。
话虽这么说,您可以使用ClassLoader.getResourceAsStream()
方法访问CLASSPATH上的文件。
但不能使用上述版本的Files.copy()
...