【问题标题】:Reading in a file - java.io.FileNotFoundException读取文件 - java.io.FileNotFoundException
【发布时间】:2013-07-12 08:42:09
【问题描述】:
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)。

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

有什么想法吗?

【问题讨论】:

  • 路径不是你想的那样。你试过调试吗?
  • 这些资源是你提供的还是用户提供的?如果由您访问,请以embedded-resource 的身份通过URL 访问它们。如果是用户,请给他们一个JFileChooser
  • 也许你首先应该知道当前工作目录是什么。 System.out.println("工作目录 = " + System.getProperty("user.dir"));
  • @AndrewThompson 这是我提供的文件。它包含我的游戏的关卡布局信息,这些信息是从我使用 swing 编写的一个小关卡创建器/编辑器导出的
  • 再一次投了反对票,没有评论为什么。这对任何人都没有帮助。

标签: java android file-io embedded-resource filenotfoundexception


【解决方案1】:

因为您是在包外处理,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 捕获或声明被抛出。

【讨论】:

  • URL 转换为File 没什么意义。大多数将接受File 的方法/构造函数也将接受URL
【解决方案2】:

在 Android 项目中,读取资产文件内容的正确方法是使用 AssetManager。资产文件是您放在 Android 项目的 assets/ 文件夹中的文件。 Android 文档中Accessing Resources 页面的侧边栏中简要提到了这一点。

特别是,您可以像这样打开文件assets/levels.txt 并创建一个BufferedReader

InputStream stream = context.getAssets().open("levels.txt");
BufferedReader reader = new BufferedReader(
            new InputStreamReader(stream));

注意open 调用的参数只是levels.txt,而不是assets/levels.txt

更多详情请见full docs of AssetManager

【讨论】:

  • 嗨 @Jabos 是的,这是一个 Android 项目。基本上我所做的是,用 Java/Swing 编写一个关卡编辑器。这会将关卡布局信息输出到我放在资产文件夹中的文本文件中,然后在我的平板电脑/手机上运行该应用程序。这是这样做的正确方法吗?如果我按照您在答案的最后一部分中指出的那样使用 inputStream ,那么我如何将这一行集成到我的代码中似乎不起作用?我是否使用它而不是 file levelFile = new file?谢谢! :-)
  • @Zippy 查看我的更新答案。这是在 Android 项目中读取资产文件内容的正确方法。
  • 感谢@janos 的回答,由于某种原因我遇到了麻烦,所以我使用了 Azad 的类似答案。谢谢:-)
  • @Zippy 我将答案修改为非常具体。这是这样做的正确方法,我从来没有遇到过问题。如果你对这种方法有问题,那么我一定是你做错了什么。您应该修复那个,而不是选择不太干净的解决方案。
  • 这应该是公认的答案,因为它是读取本地文件的正确 Android 方式。
猜你喜欢
  • 2017-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 2020-04-26
  • 1970-01-01
相关资源
最近更新 更多