代码之家  ›  专栏  ›  技术社区  ›  dudi

未找到文件。读取JSON文件时出现异常

  •  0
  • dudi  · 技术社区  · 9 年前

    我编写了一些代码从SD卡读取JSON文件。

    第一次,我保存了appfolder的路径。

    Boolean isMounted = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (isMounted) {
            File Dir = new File(Environment.getExternalStorageDirectory(), "MyIdea");
            //creat folder if don't exist
            if (!Dir.exists()) {
                if (!Dir.mkdir()) {
                    Log.d("MyIdea", "failed to create");
                }
            }
            //set the absolutPath to appPathString
            appDataPath = Dir.getAbsolutePath();
        }
    

    之后,我把配置。json放入文件夹,并希望使用此方法从SD卡读取json文件。

    public String loadJSONFromAsset() {
        String json = null;
        try {
    
            InputStream is = getAssets().open(appDataPath + "/config.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;
    
    }
    

    之后,我想从文件中获取数据

    JSONObject obj = new JSONObject(loadJSONFromAsset());
    

    但是如果我通过调试器运行代码,我会在ex上得到消息:

    java.io.FileNotFoundException: /storage/emulated/0/MyIdea/config.json
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Neerajlal K    9 年前

    文件不在您的 assets 文件夹,但仍在使用 getAssets SD卡中的文件可以像java中的任何普通文件一样打开。

    public String loadJSON() {
        String json = "";
        try {
            BufferedReader reader = new BufferedReader(new FileReader(appDataPath + "/config.json"));
            String line;
            StringBuilder buffer = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }
            reader.close();
            json = buffer.toString();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return json;
    }
    

    还要确保您在清单中具有以下权限。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    不要创建大小与文件大小相同的缓冲区。如果文件是一个大文件,则很可能会遇到 OutOfMemoryException .