【问题标题】:Opening an XML File in Android - .exists() always false在 Android 中打开 XML 文件 - .exists() 始终为 false
【发布时间】:2013-04-24 23:05:14
【问题描述】:

在创建我的类时,我想用 src 文件夹中名为“techs.xml”的 xml 文件中的数据填充一个数组。

public class MainActivity extends Activity {
private static String username;

public ArrayList<Tech> techList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LogInDialog login = new LogInDialog();
    login.show(getFragmentManager(), null);

    FileInputStream myInputStream;

    File file = new File("src/techs.xml");
    File file1 = new File("C:\\Users\\Joe\\My Document\\Classes\\CIS 408 - Mobile Appl Dev\\CII\\src\\techs.xml");
    System.out.println(file.exists());
    System.out.println(file.getAbsolutePath());
    System.out.println(file1.exists());
    System.out.println(file1.getAbsolutePath());
    try {
        myInputStream = new FileInputStream(file);

        System.out.println("wat");
        techList = new ArrayList(TechParser.parse(myInputStream));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

相关区域的LogCat中的输出是这样的:

04-30 18:29:07.703: I/Process(7846): Sending signal. PID: 7846 SIG: 9
04-30 18:29:10.923: I/System.out(7921): false
04-30 18:29:10.923: I/System.out(7921): /src/techs.xml
04-30 18:29:10.933: I/System.out(7921): false
04-30 18:29:10.933: I/System.out(7921): /C:\Users\Joe\My Document\Classes\CIS 408 - Mobile Appl Dev\CII\src\techs.xml
04-30 18:29:10.933: W/System.err(7921): java.io.FileNotFoundException: /src/techs.xml: open failed: ENOENT (No such file or directory)
04-30 18:29:10.933: W/System.err(7921):     at libcore.io.IoBridge.open(IoBridge.java:406)
04-30 18:29:10.933: W/System.err(7921):     at java.io.FileInputStream.<init>(FileInputStream.java:78)
04-30 18:29:10.933: W/System.err(7921):     at com.example.cii.MainActivity.onCreate(MainActivity.java:35)
04-30 18:29:10.933: W/System.err(7921):     at android.app.Activity.performCreate(Activity.java:4492)
04-30 18:29:10.933: W/System.err(7921):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-30 18:29:10.933: W/System.err(7921):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
04-30 18:29:10.933: W/System.err(7921):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
04-30 18:29:10.943: W/System.err(7921):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
04-30 18:29:10.943: W/System.err(7921):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
04-30 18:29:10.943: W/System.err(7921):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-30 18:29:10.943: W/System.err(7921):     at android.os.Looper.loop(Looper.java:137)
04-30 18:29:10.943: W/System.err(7921):     at android.app.ActivityThread.main(ActivityThread.java:4424)
04-30 18:29:10.943: W/System.err(7921):     at java.lang.reflect.Method.invokeNative(Native Method)
04-30 18:29:10.943: W/System.err(7921):     at java.lang.reflect.Method.invoke(Method.java:511)
04-30 18:29:10.943: W/System.err(7921):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-30 18:29:10.943: W/System.err(7921):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-30 18:29:10.943: W/System.err(7921):     at dalvik.system.NativeStart.main(Native Method)
04-30 18:29:10.943: W/System.err(7921): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
04-30 18:29:10.943: W/System.err(7921):     at libcore.io.Posix.open(Native Method)
04-30 18:29:10.943: W/System.err(7921):     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
04-30 18:29:10.943: W/System.err(7921):     at libcore.io.IoBridge.open(IoBridge.java:390)

所以这里的问题似乎是该文件不存在,即使它位于该文件夹 (/CII/src/techs.xml) 中。我使用文件的绝对版本(我不想在最终版本中这样做)来测试它,它也返回 false。谁能给我任何关于问题可能是什么的提示?

【问题讨论】:

  • 您不能引用 src 文件夹中的任意文件。一种选择是将文件放在资产中,然后使用 AssetManager 为其获取输入流。路径C:\Users\... 也不适用于android,因为它不会在您的PC 上查看它只会在android 设备上查看并且它不使用驱动器号,例如C:
  • 我结束了我的代码以反映当前状态,我做了一些我以前没有反映的更改,我很抱歉。除了我没有在 /C:... 中添加 / 之外,这是有道理的,系统本身就是这样做的。即使这样,/src/techs.xml 也是正确的,不是吗? @Foamy,哦,你不能?我从来没有意识到这一点。那我去看看 AssetManager。
  • @user2337643 你说得对,/src/techs.xml 不正确。在您的回答中,您已经说过应该是别的东西(/CII/src/techs.xml)。您似乎在这里缺少基本路径。

标签: java android xml parsing


【解决方案1】:

您遇到的基本问题是当前的working directory 设置为根目录/(如果您是Windows 用户,可以将其视为c:\)。所以文件src/techs.xml 被解释为不存在的/src/techs.xml

我建议您改用资源。这将允许您在源文件夹中打包一个 xml 文件并在运行时访问它。

http://developer.android.com/guide/topics/resources/accessing-resources.html

如果您希望继续使用文件,那么您需要找到 android 放置您的应用的位置,以便您知道文件的绝对路径。为此,您可以看到这个问题。尽管您应该记住src 中的文件将被打包到您的 jar 中:

Get Application Directory

为了您的理解:任何以/ 开头的路径都被认为是绝对路径。任何不以/ 开头的路径都被认为是相对于当前工作目录的。因此,如果当前工作目录是/foo,那么前面没有/path 将被视为/foo/path。在您的情况下,工作目录是 / 所以 src/techs.xml 变为 /src/techs.xml

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 2016-12-07
    • 2011-10-18
    • 2012-03-29
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多