2014-12-29 4 views
0

저는 로컬 json 파일을 읽고 ListView를 채우지 않아도되는 개발 및 안드로이드 응용 프로그램을 개발 중입니다. 문제는 로컬 json 파일을 읽을 수 없으며 여기서 어떻게 진행되는지 보여줍니다.로컬 json 파일을 읽을 수 없습니다 : 열기 실패 : ENOENT (해당 파일이나 디렉토리 없음)

먼저 ObjectMapper과 작업하기 때문에 객체 클래스를 만들었습니다.

이미 기본 클래스 (테마, CouchesTheme 및 ClassesEvenement)가 생성되었습니다. 내가 테마리스트의 대응되는 HashMap 클래스를 생성

package com.myapp.theme; 

public class LireTheme { 

private Theme theme; 
private CouchesTheme couchesTheme; 
private ClassesEvenement classesEvenement; 

private String message; 
private boolean ok; 

public LireTheme() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 
public LireTheme(Theme theme, CouchesTheme couchesTheme, 
     ClassesEvenement classesEvenement, String message, boolean ok) { 
    super(); 
    this.theme = theme; 
    this.couchesTheme = couchesTheme; 
    this.classesEvenement = classesEvenement; 
    this.message = message; 
    this.ok = ok; 
} 
public Theme getTheme() { 
    return theme; 
} 
public void setTheme(Theme theme) { 
    this.theme = theme; 
} 
public CouchesTheme getCouchesTheme() { 
    return couchesTheme; 
} 
public void setCouchesTheme(CouchesTheme couchesTheme) { 
    this.couchesTheme = couchesTheme; 
} 
public ClassesEvenement getClassesEvenement() { 
    return classesEvenement; 
} 
public void setClassesEvenement(ClassesEvenement classesEvenement) { 
    this.classesEvenement = classesEvenement; 
} 
public String getMessage() { 
    return message; 
} 
public void setMessage(String message) { 
    this.message = message; 
} 
public boolean isOk() { 
    return ok; 
} 
public void setOk(boolean ok) { 
    this.ok = ok; 
} 

} 

초 :

여기 subclasse에게 LireTheme을합니다.

package com.myapp.recensement; 

import java.util.ArrayList; 
import java.util.HashMap; 

import com.myapp.theme.LireTheme; 

public class LireThemes extends HashMap<String, ArrayList<LireTheme>> { 
    private static final long serialVersionUID = 1L; 
} 

다음과 같이 사용하십시오.

package com.myapp.recensement; 

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 

import org.codehaus.jackson.JsonFactory; 
import org.codehaus.jackson.JsonParseException; 
import org.codehaus.jackson.JsonParser; 
import org.codehaus.jackson.map.ObjectMapper; 

import android.os.Environment; 
import android.util.Log; 

import com.myapp.theme.LireTheme; 

public class LireThemesController { 
private ObjectMapper objectMapper = null; 
private JsonFactory jsonFactory = null; 
private JsonParser jp = null; 
private ArrayList<LireTheme> themeList = null; 
private LireThemes lirethemes = null; 
private File jsonFile; 

boolean availble=false; 

public LireThemesController() { 
    objectMapper = new ObjectMapper(); 
    jsonFactory = new JsonFactory(); 
} 

public void init() { 
    availble=isExternalStorageReadble(); 
    if(availble){ 
     Log.w("myApp", "file available"); 
    }else{ 
     Log.w("myApp", "file not available"); 
    } 

    jsonFile = new File("c:\\lireThemes.json"); 
    try{ 
     jp = jsonFactory.createJsonParser(jsonFile); 
     lirethemes = objectMapper.readValue(jp, LireThemes.class); 
     themeList = lirethemes.get("themes"); 
    } catch(JsonParseException e) { 
     e.printStackTrace(); 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } 
} 

public ArrayList<LireTheme> findAll() { 
    return themeList; 
} 
public LireTheme findById(int id) { 
    return themeList.get(id); 
} 

public boolean isExternalStorageReadble() { 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     return true; 
    } 
    return false; 
} 
} 

또한 AndroidManifest에 이미 권한이 추가되었습니다.

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

내가이 오류를 얻을 실행 : 그 문제에 대한

12-29 04:16:04.287: W/System.err(2060): java.io.FileNotFoundException: /c:\lireThemes.json: open failed: ENOENT (No such file or directory). 

모든 솔루션을하세요?

+0

c : Windows에서 하드 드라이브 문자입니까? 특히 외부 저장소를 읽는 경우에는 안드로이드에 할 일이 없습니다. 파일 이름의 접두사는 외부 저장소 경로입니다. 어떤 Context.getExternalFilesDir() 메소드를 사용하여 찾을 수 있습니다. –

+0

getAssets()를 시도해 보았습니다. 귀하의 anwser에 감사드립니다. –

답변

1

안드로이드 장치의 파일을 Windows 파일 시스템 경로 인 c : \에서 읽을 수 없습니다.

당신은 Assets 폴더 내부에 JSON 파일을 복사해야하고

public String loadJSONFromAsset() { 

String json = null; 
try { 

    InputStream is = 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; 

} 
+0

anwser에 감사드립니다.하지만 getAssets()에 대한 컨텍스트를 만들어야합니까? 아니 ? –

+0

예, LireThemesController에 컨텍스트를 전달한 다음 context.getAssets(). open (...);을 호출해야합니다. –

+0

그것뿐입니다. –

0

문제가 jsonFile = new File("c:\\lireThemes.json"); 아니 C가 없습니다 사용하여로드 : 당신의 안드로이드 장치에서 \ lireThemes.json 파일을. 당신은 당신이 getAssets().open("lireThemes.json")에 의해 액세스 할 수 있습니다 (프로젝트의) 자산 디렉토리에 파일을 추가하면

입력 스트림 를 반환합니다 또는 당신은 또한 반환하는 getActivity().getResources().openRawResource(R.raw.lireThemes)하여 고해상도/원시 폴더 접근을에 넣어 수있는 입력 스트림

+0

getAssets()가 최고의 솔루션이었습니다. 감사합니다. –

관련 문제