在我的java程序中,我有一个名为resources的包,我保留了一个log.ascii文件,我保存了一些细节。为此,我使用方法
.class.getResource("/resources")
当我在eclipse上测试它时一切正常但是当我构建jar时它不会找到路径。你知道如何克服这个问题吗?
谢谢你的时间
private static String retrieveSelectedWorkspace() throws FileNotFoundException{
String temp[];
String str=Gui.class.getResource("/resources").toString();
temp=str.split("/",2);
FileReader fr = null;
fr = new FileReader(temp[1]+"/log.ascii");
Scanner scanner = new Scanner(fr);
while(scanner.hasNextLine())
return scanner.nextLine().toString();
return null;
}
}
答案 0 :(得分:1)
getResource
会返回URL
。不要toString
它并与它做一些丑陋的字符串连接。构建JAR后,URL不是文件系统URL。在Eclipse中开发并从那里运行时,您仍然可以使用这些文件。
当然,您无法写入JAR中的资源。
答案 1 :(得分:1)
我认为您的代码可以使用Class.getResourceAsStream()代替(/resources/log.ascii
需要打包在jar中,或者包含在类路径的其他位置)。
private static String retrieveSelectedWorkspace() throws FileNotFoundException {
InputStream in = Gui.class.getResourceAsStream("/resources/log.ascii");
Scanner scanner = new Scanner(in);
while(scanner.hasNextLine())
return scanner.nextLine().toString();
return null;
}
但是关于你的实际问题,你肯定可以从jar中获取文件夹资源,只要该文件夹打包在jar中。
Test.java:
class Test {
public static void main(String[] args) {
System.out.println(Test.class.getResource("/text.txt"));
System.out.println(Test.class.getResource("/folder"));
}
}
命令行。创建文件和文件夹。然后尝试运行.class
文件中的代码并运行.jar
文件中的代码。
C:\Temp>echo text > text.txt
C:\Temp>md folder
C:\Temp>javac Test.java
C:\Temp>java Test
file:/C:/Temp/text.txt
file:/C:/Temp/folder
创建jar:
C:\Temp>jar cvf test.jar Test.class text.txt folder
added manifest
adding: Test.class(in = 530) (out= 347)(deflated 34%)
adding: text.txt(in = 7) (out= 9)(deflated -28%)
adding: folder/(in = 0) (out= 0)(stored 0%)
从jar中运行:
C:\Temp>java -classpath test.jar Test
jar:file:/C:/Temp/test.jar!/text.txt
jar:file:/C:/Temp/test.jar!/folder
答案 2 :(得分:0)
尝试
getClass().getClassLoader().getResource("/resources")))
您也可以在一行中完成整个事情:
new Scanner(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("/resources/log.ascii"))).useDelimiter("\\A").next()
答案 3 :(得分:0)
当您在eclipse上运行时,log.ascii是文件系统上的文件,但是当您打包到jar中时,log.ascii是zip文件中的一个条目。这就是为什么你没有完成它。
您可以在系统属性java.io.tmpdir指定的临时目录上创建临时文件或创建文件,以使其正常工作。