Java:外部文本文件的相对路径

时间:2013-06-30 16:39:24

标签: java file text path relative

我对Java中的路径(使用Eclipse)有点困惑。这是我的文件结构:

 Folder

    Subfolder

        file.txt

    jarfile.jar

所以,我试图让jar文件解析来自file.txt的数据,并使用以下代码:

Scanner in = new Scanner(this.getClass().getResourceAsStream("./Subfolder/file.txt"));

我用Eclipse制作了一个可运行的jar文件,把它放在文件夹中,但它不起作用。我做错了什么?

非常感谢!

伊戈尔

4 个答案:

答案 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以及您已放置的路径。