【问题标题】:java.io.FileNotFoundException (Trying to deserialize)java.io.FileNotFoundException(试图反序列化)
【发布时间】:2018-11-01 19:45:55
【问题描述】:

我正在尝试将 XML 文件反序列化为对象。 我的代码上线失败:

new FileInputStream(mySearch)

java.io.FileNotFoundException

所以,我添加了: if (exists) 块以查看是否可以通过其他方式找到该文件。

我已经用谷歌搜索了错误并阅读了其他讨论主题。基于这些讨论,我尝试了 五种 不同的方式来指定文件路径和名称。 (查看注释掉的尝试)

期望的行为是我找出路径和文件名的语法有什么问题,以便找到并反序列化文件。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.File;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 5/20/2018 T. Pfaff - Added XMLDecoder Deserialization of XML file into EquationLib/LibSets/EquationSet

    //===========================================================================================
    //Below are the FIVE different ways that I've tried to get it to find the file

    String myFileStr = "C:\\Users\\Terence\\Documents\\Meditate-Lemniscate\\Test_Single.xml";
    //String myFileStr = "c:\\users\\terence\\documents\\meditate-lemniscate\\test_single.xml";
    //String myFileStr = "C:/Users/Terence/Documents/Meditate-Lemniscate/Test_Single.xml";
    //String myFileStr = "c:/users/terence/documents/meditate-lemniscate/test_single.xml";
    //String myFileStr = "Test_Single.xml";

    //===========================================================================================

    String myEqSetName = "";
    Integer myCnt = 0;
    EquationLib equationLib = new EquationLib();
    TextView myTV = (TextView) findViewById(R.id.myTextView);

    //=============================================================================
    //This block of code ALWAYS results in "Does NOT Exist"
    //no matter which value I use for myFileStr

    File mySearch = new File(myFileStr);
    boolean exists = mySearch.exists();

    if (exists) {
        myTV.setText("YES EXISTS: " + myFileStr);
    } else {
        myTV.setText("Does NOT Exist: " + myFileStr);
    }
    //==============================================================================


    XMLDecoder decoder=null;

    // The first statement in the try block throws the exception:
    //java.io.FileNotFoundException: C:\Users\Terence\Documents\Meditate-Lemniscate\Test_Single.xml (No such file or directory)

    try{
        FileInputStream myFileIS = new FileInputStream(mySearch);
        decoder = new XMLDecoder(new BufferedInputStream(myFileIS));
        equationLib = (EquationLib) decoder.readObject();

        myCnt = equationLib.libSets.size();
        myEqSetName = equationLib.libSets.get(0).equationSet.name;

    } catch (Exception e){
        e.printStackTrace();
    }

    //myTV.setText(myCnt.toString());
}

}

【问题讨论】:

  • 打开cmd窗口,切换到那个目录,输入dir;然后将输出复制/粘贴到您的问题中(使用代码格式)
  • 您没有尝试不同的方式来指定文件名,而是真的验证了文件是否存在?例如。在命令行上运行 dir C:\Users\Terence\Documents\Meditate-Lemniscate\Test_Single.xml
  • 那些路径看起来像 Windows 路径,但你的代码使用的是 Android 库,它在哪里运行?
  • @Andreas - dir 命令显示文件存在并显示其大小。

标签: java android file io


【解决方案1】:

Android 模拟器无权访问主机的文件系统。您可以将 XML 文件捆绑到您的 project_root\res\raw\ 文件夹中,然后将其作为资源打开:

// Open project_root\res\raw\my_file.xml

InputStream stream = getResources().openRawResource(R.raw.my_file);

或者复制到虚拟设备的存储上,然后打开本地路径:

adb push C:\Temp\my_file.xml /sdcard/my_file.xml

【讨论】:

  • 我在“res”下创建了一个“xml”文件夹并将文件放在那里。现在,我在 (R.xml.Test_Single) 下看到了红色波浪线,消息显示:“预期资源类型为 Raw”。
  • 如果您打算使用自己的解码器将其作为原始资源读取,请尝试将其放入 raw 子目录而不是 xml
  • 现在,出于某种原因,无论我在哪里使用“(R....)”,它都会以红色突出显示并显示“无法解析符号 R”。
  • 根据您的建议@jspcal,我现在正在尝试:'InputStream stream = getResources().getString(R.xml.Test_1_gend);'但是,它以红色突出显示并显示:无法解析符号 xml 我将 xml 文件放入 \res\xml 下的文件夹中我还需要做些什么来注册 xml 文件吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多