文件复制在eclipse测试环境中工作,但在打包的程序中产生URI错误

时间:2017-06-15 13:12:36

标签: java file io

我有一个需要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 folder structure

正如我所说,在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或我如何解决它的任何提示?

1 个答案:

答案 0 :(得分:2)

当您的程序打包到JAR文件中时,CLASSPATH上的文件位于JAR文件的ZIP存档中。

话虽这么说,您可以使用ClassLoader.getResourceAsStream()方法访问CLASSPATH上的文件。 但不能使用上述版本的Files.copy() ...