Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试读取json资产时FileNotFoundException_Java_Android_Json_Filenotfoundexception - Fatal编程技术网

Java 尝试读取json资产时FileNotFoundException

Java 尝试读取json资产时FileNotFoundException,java,android,json,filenotfoundexception,Java,Android,Json,Filenotfoundexception,我正在开发一个应用程序,需要在点击按钮时自动发送电子邮件。我目前的问题是,我需要读取一个json文件,当我将存储在资产中的json路径传递到一个新的FileReader()中时,我会得到一个未找到的文件异常。下面是我如何获得路径的。(想知道Uri.parse().toString是否冗余): 以下是我将其传递到的方法: sClientSecrets = GoogleClientSecrets .load(jsonFactory, new FileReader(CLIENT_SECRE

我正在开发一个应用程序,需要在点击按钮时自动发送电子邮件。我目前的问题是,我需要读取一个json文件,当我将存储在资产中的json路径传递到一个新的
FileReader()
中时,我会得到一个未找到的文件
异常
。下面是我如何获得路径的。(想知道
Uri.parse().toString
是否冗余):

以下是我将其传递到的方法:

sClientSecrets = GoogleClientSecrets
      .load(jsonFactory, new FileReader(CLIENT_SECRET_PATH));
我试图访问的json文件位于android项目目录下的app root下的my apps asset文件夹中(/app/assets/)


我不确定我在这里做错了什么,但我确信这很简单。请帮我指出正确的方向。

您不应该使用直接文件路径访问资产。 文件已打包,并且位置将在每个设备上更改。 您需要使用helper函数来获取资产路径

getAssets().open()

有关详细信息,请参阅。

您不应使用直接文件路径访问资产。 文件已打包,并且位置将在每个设备上更改。 您需要使用helper函数来获取资产路径

getAssets().open()

有关更多信息,请参阅。

您可以使用此函数从资产中获取JSON字符串,并将该字符串传递给FileReader

public String loadJSONFromAsset() {
    String json = null;
    try {
        InputStream is = getActivity().getAssets().open("yourfilename.json");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");
    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
}
return json;
}

您可以使用此函数从资产中获取JSON字符串,并将该字符串传递给FileReader

public String loadJSONFromAsset() {
    String json = null;
    try {
        InputStream is = getActivity().getAssets().open("yourfilename.json");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");
    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
}
return json;
}

将文件直接保存在assets目录中,而不是原始样本

然后文件路径将是这样的

private static final String CLIENT_SECRET_PATH = 
    Uri.parse("file:///android_asset/***.json").toString()

希望您的问题能得到解决。

将您的文件直接保存在资产目录中,而不是原始样本

然后文件路径将是这样的

private static final String CLIENT_SECRET_PATH = 
    Uri.parse("file:///android_asset/***.json").toString()

希望您的问题能够得到解决。

@Rohit我能够使用您提供的方法作为起点。唯一的问题是我使用的gmail api需要一个阅读器作为参数,而不是字符串。这就是我所做的。我不再得到filenotfoundexception。多谢各位

public InputStreamReader getJsonStreamReader(String file){
    InputStreamReader reader = null;
    try {
        InputStream in = getAssets().open(file);
        reader = new InputStreamReader(in);
    }catch(IOException ioe){
        Log.e("launch", "error : " + ioe);
        }
    return reader;
}

@Rohit i能够使用您提供的方法作为起点。唯一的问题是我使用的gmail api需要一个阅读器作为参数,而不是字符串。这就是我所做的。我不再得到filenotfoundexception。多谢各位

public InputStreamReader getJsonStreamReader(String file){
    InputStreamReader reader = null;
    try {
        InputStream in = getAssets().open(file);
        reader = new InputStreamReader(in);
    }catch(IOException ioe){
        Log.e("launch", "error : " + ioe);
        }
    return reader;
}

你确定你的**.json文件在资产目录中“raw”下的“sample”文件夹中吗?你确定你的**.json文件在资产目录中“raw”下的“sample”文件夹中吗?我可以使用你提供的方法来构建我需要的内容。非常感谢。请参阅我在下面发布的答案。我能够使用您提供的方法来构建我所需要的。非常感谢。见下面我贴的答案。