2012-03-23 2 views
2

이 객체를 휴대 전화의 내부 저장 메모리에 저장해야하며 <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"></uses-permission>이 매니페스트에 설정되어 있습니다. 개체 자체는 상점에 대한 두 개의 정적 메소드를 가진 사람들과 내부 메모리에서 다시로드 : 나는 그것을 저장하고 내 활동이 호출 사용하여 다시하기 위해 노력하고있어직렬 객체를 사용하여 클래스 객체를 내부 메모리 저장소에 저장하는 방법?

public class SaveState implements Serializable { 
static public List<FullMagazine> fms = new ArrayList<FullMagazine>(); 
static SaveState instance=null; 

public static SaveState getInstance(){  
    if(instance == null) 
     instance = new SaveState();  
    return instance; 
} 

public static void saveData(SaveState instance){ 
    ObjectOutput out; 
    try { 
     out = new ObjectOutputStream(new FileOutputStream("appSaveState.data"));   
     out.writeObject(instance); 
     out.close(); 
    } catch (Exception e) {e.printStackTrace();} 
} 

public static SaveState loadData(){ 
    ObjectInput in; 
    SaveState ss=null; 
    try { 
     in = new ObjectInputStream(new FileInputStream("appSaveState.data"));  
     ss=(SaveState) in.readObject(); 
     in.close(); 
    } catch (Exception e) {e.printStackTrace();} 
    return ss; 
} 
} 

:

  SaveState.fms.add(fm); 
      SaveState.saveData(SaveState.getInstance());     
      SaveState sv = SaveState.loadData(); 

을하지만

03-23 09:18:16.702: WARN/System.err(9060): java.io.FileNotFoundException: /appSaveState.data (Read-only file system) 
03-23 09:18:16.702: WARN/System.err(9060):  at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method) 
03-23 09:18:16.702: WARN/System.err(9060):  at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152) 
03-23 09:18:16.702: WARN/System.err(9060):  at java.io.FileOutputStream.<init>(FileOutputStream.java:97) 
03-23 09:18:16.702: WARN/System.err(9060):  at java.io.FileOutputStream.<init>(FileOutputStream.java:168) 
03-23 09:18:16.702: WARN/System.err(9060):  at java.io.FileOutputStream.<init>(FileOutputStream.java:147) 
03-23 09:18:16.702: WARN/System.err(9060):  at com.Magazine.SaveState.saveData(SaveState.java:35) 
03-23 09:18:16.702: WARN/System.err(9060):  at com.Magazine.MainMenu$DownloadThread.run(MainMenu.java:807) 
03-23 09:18:16.709: WARN/System.err(9060): java.io.FileNotFoundException: /appSaveState.data (No such file or directory) 
03-23 09:18:16.709: WARN/System.err(9060):  at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method) 
03-23 09:18:16.709: WARN/System.err(9060):  at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152) 
03-23 09:18:16.709: WARN/System.err(9060):  at java.io.FileInputStream.<init>(FileInputStream.java:82) 
03-23 09:18:16.709: WARN/System.err(9060):  at java.io.FileInputStream.<init>(FileInputStream.java:134) 
03-23 09:18:16.709: WARN/System.err(9060):  at com.Magazine.SaveState.loadData(SaveState.java:46) 
03-23 09:18:16.709: WARN/System.err(9060):  at com.Magazine.MainMenu$DownloadThread.run(MainMenu.java:809) 

코드의 문제점은 무엇입니까 : 저장하고 개체를 읽는 동안 그 개체를 저장하지 않는, 작동하지 않는, 그리고 당연히 그것은 objecto을 읽고 있지, 나는이 두 가지 예외를 받고 있어요?

감사

+0

문제는 당신이 /에 쓰려고하는 것이고 /는 android에서만 읽혀진다는 것입니다. –

+0

정적리스트 'FullMagazine'에서 사용되는 클래스가 Serializable도 구현합니까? –

답변

4

변경이

File outFile = new File(Environment.getExternalStorageDirectory(), "appSaveState.data"); 
    out = new ObjectOutputStream(new FileOutputStream(outFile)); 

가 아니라 제대로 @ex 지적

out = new ObjectOutputStream(new FileOutputStream("appSaveState.data")); 

으로, 파일이 응용 프로그램을 응용 프로그램의 데이터를 삭제하거나 제거 제거되지 않습니다

+0

전화에 SDCARD가 설치되어 있지 않으면 어떻게됩니까? 나는 SDMARD – NullPointerException

+1

없이 휴대폰을 포함하여 모든 휴대폰에이 데이터를 저장해야하기 때문에 내부 메모리 저장소에 저장하려고합니다. sdcard를 지원하지 않는 휴대 전화 (예 : samsung nexus) 인 Enviromenet을 말하면됩니다. getExternalStorageDirectory()는 전화 내부 저장소 아카이브에 대한 경로를 반환합니다. – Blackbelt

+1

휴대 전화에 SDCARD가있는 경우 응용 프로그램의 데이터를 지울 때 파일이 남아 있다고 언급 할 가치가 있다고 생각합니다. –

2

님의 단지 내부 저장소 (당신이 그 권한을 얻을 경우에도)로 쓸 수없는 것입니다. 대신 외부 sd 또는 cache folder을 사용해보십시오.

+0

앱이 휴대 전화에서 제거 될 때까지 캐시 폴더 데이터가 손상되지 않습니까? 캐시 폴더로 처리하는 방법을 알려주십시오. 코드로 변경해야합니까? – NullPointerException

+0

파일 cacheFile = 새 파일 (activity.getCacheDir(), "appSaveState.data"); - 전에 그랬던 것처럼 그 파일에 써라. – Tim

+2

여유 공간이 부족 해지면 캐시 폴더가 OS에서 삭제되기 쉽습니다! –

0

이 있었다 내 aproach을 이 게시물을 기반으로하고 this

나는 썼다. 자신의 내 사용자 클래스에

private static File mFolder; 
public void saveData(Activity pContext) { 
    //this could be initialized once onstart up 
    if(mFolder == null){ 
     mFolder = pContext.getExternalFilesDir(null); 
    } 
    this.save(); 
    ObjectOutput out; 
    try { 
     File outFile = new File(mFolder, 
       "someRandom.data"); 
     out = new ObjectOutputStream(new FileOutputStream(outFile)); 
     out.writeObject(this); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public static User loadData(Context pContext) { 
    if(mFolder == null){ 
     mFolder = pContext.getExternalFilesDir(null); 
    } 
    ObjectInput in; 
    User lUser = null; 
    try { 
     FileInputStream fileIn = new FileInputStream(mFolder.getPath() + File.separator + "someRandom.data"); 
     in = new ObjectInputStream(fileIn); 
     lUser = (User) in.readObject(); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if (lUser != null) { 
     lUser.save(); 
     Log.d("current User: ", lUser.nickname); 
    } else { 
     Log.d("current User: ", "null"); 
    } 
    return lUser; 
} 

편집 : mSelf 인스턴스를 것

mUser = User.loadData(this); 

그럼 내 활동에서 내가 전화

mUser = User.loadData(mSelf); 

또는

내가 저장

희망이 도움이 :)

관련 문제