我对Java中的路径(使用Eclipse)有点困惑。这是我的文件结构:
Folder
Subfolder
file.txt
jarfile.jar
所以,我试图让jar文件解析来自file.txt的数据,并使用以下代码:
Scanner in = new Scanner(this.getClass().getResourceAsStream("./Subfolder/file.txt"));
我用Eclipse制作了一个可运行的jar文件,把它放在文件夹中,但它不起作用。我做错了什么?
非常感谢!
伊戈尔
答案 0 :(得分:2)
由于您通过Class
对象使用资源文件,因此资源的路径必须是绝对的:
getClass().getResourceAsStream("/Subfolder/file.txt");
请注意,执行您所做的操作是一个坏主意,即在您没有引用的资源上打开扫描程序:
new Scanner(someInputStreamHere());
您没有引用该输入流,因此无法关闭它。
此外,.getResource*()
如果资源不存在,则返回null
;在这种情况下,你会得到一个NPE!
建议您使用Java 6(使用Guava的Closer):
final URL url = getClass().getResource("/path/to/resource");
if (url == null) // Oops... Resource does not exist
barf();
final Closer closer = Closer.create();
final InputStream in;
final Scanner scanner;
try {
in = closer.register(url.openStream());
scanner = closer.register(new Scanner(in));
// do stuff
} catch (IOException e) {
throw closer.rethrow(e);
} finally {
closer.close();
}
如果您使用Java 7,只需使用try-with-resources语句:
final URL url = getClass().getResource("/path/to/resource");
if (url == null) // Oops... Resource does not exist
barf();
final InputStream in;
final Scanner scanner;
try (
in = url.openStream();
scanner = new Scanner(in);
) {
// do stuff
} catch (IOException e) {
// deal with the exception if needed; or just declare it at the method level
}
答案 1 :(得分:1)
就像一个例子,因为java是独立于平台的,看看如何根据需要获得相对绝对或规范的路径,我希望这能让你知道该怎么做。
/**
* This method reads the AcronymList.xlsx and is responsible for storing historical acronyms
* and definitions.
* @throws FileNotFoundException
* @throws IOException
* @throws InvalidFormatException
*/
public file readAcronymList() throws FileNotFoundException, IOException, InvalidFormatException {
String accListFile = new File("src\\org\\alatecinc\\acronymfinder\\dal\\acIgnoreAddList\\AcronymList.xlsx").getCanonicalPath();
File acFile = new File(accListFile).getAbsoluteFile();
return acFile;
}
答案 2 :(得分:0)
使用以下代码。
Scanner in = new Scanner(getClass()。getResource(“Subfolder / file.txt”));
答案 3 :(得分:0)
为何选择资源? txt文件是否嵌入在Jar文件中?它将从jar加载文件。
只需使用File或FileInputStream以及您已放置的路径。