2013-04-30 55 views
0

在創建我的類時,我想使用src文件夾中名爲「techs.xml」的xml文件中的數據填充數組。在Android中打開XML文件 - .exists()始終爲false

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。任何人都不能給我任何提示,問題可能是什麼?

+0

你不能引用src文件夾中的任意文件。一種選擇是將文件放入資產中,然後使用AssetManager爲其獲取輸入流。路徑'C:\ Users \ ...'在android上也不會工作,因爲它不會在你的電腦上顯示,它只會在Android設備上顯示,並且不會使用'C :' – FoamyGuy 2013-04-30 22:35:08

+0

我結束了我的代碼以反映當前狀態,我做了一些我以前沒有反映過的變化,我的歉意。 這是有道理的,除了我沒有添加/ in/C:...系統本身。即使如此,/ src/techs.xml會是正確的嗎? @Foamy,哦,你不能?我從來沒有意識到這一點。然後我會查看AssetManager。 – user2337643 2013-04-30 22:36:20

+0

@ user2337643你是對的'/ src/techs.xml'不正確。在你的回答中,你已經說過應該是別的東西('/ CII/src/techs.xml')。看起來你似乎錯過了這裏的基本路徑。 – 2013-05-02 07:55:59

回答

0

您遇到的基本問題是當前working directory設置爲根目錄/(如果您是windows用戶,您可以將其視爲c:\)。所以文件src/techs.xml被解釋爲不存在的/src/techs.xml

我建議你改用資源。這將允許您在源文件夾中打包一個xml文件並在運行時訪問它。

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

如果您希望繼續使用一個文件,那麼你將需要找到地方Android已經把你的應用程序,讓你知道你的文件的絕對路徑。爲此你可以看到這個問題。雖然你應該記住,在src文件將您的罐子裏進行包裝:

Get Application Directory

的理解:任何路徑開始/被認爲是絕對的。任何不以/開頭的路徑都被視爲相對於當前工作目錄。因此,如果當前工作目錄是/foo,則沒有前面的/path將被認爲是/foo/path。在你的情況下,工作目錄是/因此src/techs.xml變爲/src/techs.xml

相關問題