读取文件 - java.io.FileNotFoundException

3
public void loadFile(int level){

    try {
                //Create new file
                levelFile = new File("assets/levels.txt");
                fis = new FileInputStream(levelFile);
                isr = new InputStreamReader(fis);    
                reader = new BufferedReader(isr);

                //Code to read the file goes here

使用这段代码时,我一直收到上面的错误提示 (java.io.FileNotFoundException)。

文件肯定存在于我的资产文件夹中,并且具有正确的名称。我在这里找到了几个类似的问题,并尝试了各种方法,包括刷新项目、清理项目、使用"levels.txt"而不是"assets/levels.txt",但我仍然收到这个错误。

有任何想法吗?


路径并不是你想象的那样。你尝试过调试吗? - Joni
这些资源是由您提供还是用户提供的?如果是您提供的,请通过URL作为[标签:嵌入式资源]访问它们。如果是用户提供的,请提供一个JFileChooser - Andrew Thompson
也许你首先应该知道当前的工作目录在哪里。System.out.println("Working Directory = " + System.getProperty("user.dir")); - oldmonk
@AndrewThompson 这是我提供的一个文件。它包含了我的游戏的关卡布局信息,这些信息是从我使用swing编写的小型关卡创建器/编辑器中导出的。 - Zippy
1
再次遭到负评,却没有任何评论说明原因。这对任何人都没有帮助。 - Zippy
给你点个赞来抵消它。对不起,社区里有些不好的人。 - csvan
2个回答

7

因为您正在处理包外的内容,getResource()将是您问题的最佳解决方案:

URL url = getClass().getResource("/assets/levels.txt");
File f = new File(url.toURI());
//....

或者您可以直接使用getResourceAsStream()方法获取输入流:

InputStream  is= getClass().getResourceAsStream("/assets/levels.txt");
isr = new InputStreamReader(is); 

使用FileInputStream不再必要,这样更好。

请注意,URISyntaxException必须通过FileNotFoundException捕获或声明抛出。


2
URL转换为File没有太大的意义。大多数接受File的方法/构造函数也会接受URL - Andrew Thompson

6
在Android项目中,读取asset文件内容的正确方式是使用AssetManager。Asset文件是放置在Android项目的assets/文件夹中的文件。这在Android文档的访问资源页面的侧边栏中简要提到。
具体来说,您可以打开文件assets/levels.txt,并像下面这样创建一个BufferedReader:
InputStream stream = context.getAssets().open("levels.txt");
BufferedReader reader = new BufferedReader(
            new InputStreamReader(stream));

注意,open调用的参数只是levels.txt,而不是assets/levels.txt
更多详细信息请参见AssetManager的完整文档

嗨@Jabos,是的,这是一个Android项目。基本上我所做的就是用Java / Swing编写了一个关卡编辑器。它将关卡布局信息输出到文本文件中,然后将其放入我的资产文件夹中,并在平板电脑/手机上运行应用程序。这是正确的方法吗?如果我像你在答案的最后一部分所示那样使用inputStream,它似乎不起作用。我该如何将此行集成到我的代码中?我要用它来代替file levelFile = new file吗?谢谢! :-) - Zippy
@Zippy,请查看我的更新答案。这是在Android项目中读取资产文件内容的正确方法。 - janos
感谢@janos的回答,出于某些原因,我遇到了一些问题,所以我使用了Azad的类似答案。谢谢 :-) - Zippy
@Zippy,我修改了我的答案,使其更加具体。这是正确的做法,我从未遇到过任何问题。如果您使用此方法遇到困难,则一定是做错了什么。您应该解决那个问题,而不是选择一个不太干净的解决方案。 - janos
2
这应该是被接受的答案,因为这是正确的 Android 读取本地文件的方法。 - csvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接