InputStream中的相对路径

时间:2013-09-12 11:22:16

标签: java inputstream

我有两个问题。

  1. 如何使用目录Export.xlsx中的文件res/ 而是这个

    try ( FileInputStream fileInputStream = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xlsx"))

  2. 从文件中读取数据,该文件位于.jar所在的同一目录中。

  3. 我试过了什么?

    表示第1名。 Q值。

    String path = "res/"+sfilename+".xlsx";
    System.out.println(getClass().getClassLoader().getResource(path).toString());
    File file2 = new File(getClass().getClassLoader().getResource(path).toString());
    try ( FileInputStream fileInputStream = new FileInputStream(file2))
    
    file:/C:/Users/student/IdeaProjects/batch/out/production/batch/res/ExportBatch.xlsx
    Work is finished!
    java.io.FileNotFoundException: file:\C:\Users\student3\IdeaProjects\batch\out\production\batch\res\ExportBatch.xlsx (Синтаксическая ошибка в имени файла, имени папки или метке тома)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at workhere.WriterXlsx.<init>(WriterXlsx.java:20)
        at workhere.Start.start(Start.java:62)
        at workhere.Start.main(Start.java:24)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
    

    enter image description here

1 个答案:

答案 0 :(得分:2)

你在路上。

方法ClassLoader.getResource返回URL个对象。您的System.out.println语句打印出此URL。您可以看到URL协议“file:”。

问题:File构造函数不期望URL,而只是文件的路径。这就是为什么FileInputStream无法找到文件的原因。

解决方案:您无需自己创建InputStream。只需使用URL.openStream即可。甚至更好:用ClassLoader.getResourceAsStream向类加载器询问它。

示例:

String path = "res/" + sfilename + ".xlsx";
URL resURL = getClass().getClassLoader().getResource(path);
try (InputStream inputStream = resURL.openStream()) {
    ...
}

或者:

String path = "res/" + sfilename + ".xlsx";
try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(path)) {
    ...
}