2014-05-21 2 views
0

이 클래스를 이해할 수 없습니다. 내 내부 저장소의 새 디렉토리에 새 파일을 만들고 텍스트를 입력 한 다음 읽으려고했습니다. 이것은 ContextWrapper 없이는 작동하지 않는 것 같습니다. 그래서 이것을 시도 :컨텍스트 및 컨텍스트 랩퍼 이해 문제

public class DownloadActivity extends Activity { 
    ... 
class Download extends AsyncTask<String, Void, String>{ 

.... 
private void searchAndSave(String s) throws IOException { 
.... 
    ContextWrapper cw = new ContextWrapper(getBaseContext()); 
    File folder = cw.getDir("folder", Context.MODE_PRIVATE); 
    File fileInFolder = new File(folder, "fileInFolder"); 

    String string = "Hello world!"; 
    FileOutputStream outputStream = openFileOutput("fileInFolder", 
           Context.MODE_PRIVATE); 
    outputStream.write(string.getBytes()); 
    outputStream.close(); 

    File fl = new File(cw.getDir("folder", Context.MODE_PRIVATE)+"/fileInFolder"); 
    FileInputStream fin = new FileInputStream(fl); 

    BufferedReader reader = new BufferedReader(
           new InputStreamReader(fin)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
     sb.append(line).append("\n"); 
    } 
    String result = sb.toString(); 
    reader.close(); 
    fin.close(); 
    } 
} 

파일을 만드는 것은 ContextWrapper 없이는 작동하지 않습니다. 나는 많은 것을 읽었지 만, Context와 Contextwrapper가 실제로 무엇을하는지, 왜 내가 파일을 생성해야 하는지를 이해하는 데 문제가 있습니다. 또한 내 코드에서 FileInputStream 만들기 작동하지 않습니다. 난 정말 이해와이 문제를 해결하는 몇 가지 도움을 주셔서 감사합니다 것

05-21 11:18:25.721: W/System.err(7344): java.io.FileNotFoundException: 
/data/data/com.example.dice/app_folder/fileInFolder: open failed: 
ENOENT (No such file or directory) 

: 프로그램이

FileInputStream fin = new FileInputStream(fl); 

에 도달하면 난 항상 오류가 발생합니다.

업데이트 : 더 많은 액티비티를 만들었습니다. 이제는 모든 것을 재구성하는 것이 더 쉽습니다. (새로운 답변으로이 작업을 수행해야합니까, 아니면 첫 번째 게시를 편집해도 괜찮습니까?) 파일을 만들 때 오류 메시지가 나타나지 않지만 작동하지 않는 것 같습니다. 여기 "Hello world"문자열을 읽으려고 시도하지만 FileNotFoundException (EISDIR)이 발생합니다. 그냥 알기를 바랍니다 :)

public class FolderActivity extends Activity { 
public final static String TAG = "FolderActivity"; 

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

    Button button = (Button) findViewById(R.id.button_folder); 

    button.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      try { 
       folder(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 
    private void folder() throws IOException{ 
     Log.d(TAG, "folder"); 
     ContextWrapper cw = new ContextWrapper(getBaseContext()); 
     Log.d(TAG, "cw = new ContextWrapper"); 
     File folder = cw.getDir("folder", Context.MODE_PRIVATE); 
     Log.d(TAG, "folder = cw.getDir"); 
     File fileInFolder = new File(folder, "fileInFolder"); 
     Log.d(TAG, "fileInFolder = new File"); 
     /*Log.d(TAG, 
       "fileInFolder.getAbsolutePath()" 
         + fileInFolder.getAbsolutePath());*/ 

     String string = "Hello world!"; 
// Aksioms suggestion 
     if (!fileInFolder.exists() && !fileInFolder.mkdirs()) { 
      Log.e("file", "Couldn't create file " + fileInFolder); 
     } else { Log.d(TAG, "file created"); } 
     FileOutputStream outputStream = openFileOutput("fileInFolder", 
       Context.MODE_PRIVATE); 
     outputStream.write(string.getBytes()); 
     outputStream.close(); 
     Log.d(TAG, 
       "fileInFolder.getAbsolutePath()" 
         + fileInFolder.getAbsolutePath()); 
     String s = fileInFolder.getAbsolutePath(); 
     try { 
      getStringFromFile(s); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

public static String getStringFromFile (String filePath) throws Exception { 
    File fl = new File(filePath); 
    FileInputStream fin = new FileInputStream(fl); 
    String ret = convertStreamToString(fin); 
    //Make sure you close all streams. 
    fin.close();   
    return ret; 
} 

public static String convertStreamToString(InputStream is) throws Exception { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
     sb.append(line).append("\n"); 
    } 
    reader.close(); 
    return sb.toString(); 
} 
} 
+0

래퍼가없는 문제는 무엇입니까? – laalto

+0

정확히 무엇을하는지 이해하지 못합니다. 내 주요 문제는 내가 파일을 읽는 프로그램을 얻지 못한다는 것이다. 나는 내가 뭘 잘못하고 있는지 알고 싶다. – Schnicke

답변

1

존재하지 않는 파일을 열려고합니다. 이 exsist하지 않는 경우 당신이 확인하고 파일을 만드는 것이 있는지 확인 :

if (!fl.exists() && !fl.mkdirs()) { 
       Log.e("file", "Couldn't create file " + fl); 
} 

편집 :가 생성되지 않은 경우

이 예 getDir 폴더를지지합니다.

File folder = cw.getDir("folder", Context.MODE_PRIVATE); 

그러나 문제는 여기에 당신이 exsist하지 않습니다, 당신은 단지 fileInFolder라는 이름의 새 파일을 만들어 파일을 열려고 여기에서

File fileInFolder = new File(folder, "fileInFolder"); 
    String string = "Hello world!"; 
    FileOutputStream outputStream = openFileOutput("fileInFolder", 
           Context.MODE_PRIVATE); 

이지만, 실제로는 아직 폴더가없는 .

내가 먼저 쓴 코드를 openFileOutput ("fileInFolder", Context.MODE_PRIVATE) 전에 사용하십시오. :

if (!fileInFolder.exists() && !fileInFolder.mkdirs()) { 
        Log.e("file", "Couldn't create file " + fileInFolder); 
    } 

시도해보고 어떻게 진행되는지 알려주세요.

편집 2 : 나는이 문제를 발견

OK 그렇게 분명했습니다. 실수는 우리가 디렉토리로 fileInFolder을 만든, 그리고 당신은 거기에 아무것도 쓸 수 없습니다 : D

우리가 수행해야하는 것은 이것이다 :

가 fileInFolder를 만드는 내 코드를 제거합니다.

if (!fileInFolder .exists() && !fileInFolder .mkdirs()) { 
    Log.e("file", "Couldn't create file " + fileInFolder); 
} else { 
    Log.d(TAG, "file created"); 
} 

우리는 파일로 사용하기 때문에 만들 필요가 없습니다.따라서 코드에서 변경 한 내용은 다음과 같습니다.

FileOutputStream outputStream = new FileOutputStream(fileInFolder); 
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream)); 
    out.write(string); 
    out.close(); 

String string = "Hello world!"; 첫 번째 Log.d ... 이것은 파일에 쓰는 올바른 방법입니다.

전체 코드 :

public class MainActivity extends Activity { 
public final static String TAG = "FolderActivity"; 

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

    Button button = (Button) findViewById(R.id.button_folder); 

    button.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      try { 
       folder(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

private void folder() throws IOException { 
    Log.d(TAG, "folder"); 
    ContextWrapper cw = new ContextWrapper(getBaseContext()); 
    Log.d(TAG, "cw = new ContextWrapper"); 
    File folder = cw.getDir("folder", Context.MODE_PRIVATE); 
    Log.d(TAG, "folder = cw.getDir"); 
    File fileInFolder = new File(folder, "fileInFolder"); 
    Log.d(TAG, "fileInFolder = new File"); 
    /* 
    * Log.d(TAG, "fileInFolder.getAbsolutePath()" + 
    * fileInFolder.getAbsolutePath()); 
    */ 

    String string = "Hello world!"; 

    FileOutputStream outputStream = new FileOutputStream(fileInFolder); 
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream)); 
    out.write(string); 
    out.close(); 
    Log.d(TAG, 
      "fileInFolder.getAbsolutePath()" 
        + fileInFolder.getAbsolutePath()); 
    String s = fileInFolder.getAbsolutePath(); 
    try { 
     getStringFromFile(s); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public static String getStringFromFile(String filePath) throws Exception { 
    File fl = new File(filePath); 
    FileInputStream fin = new FileInputStream(fl); 
    String ret = convertStreamToString(fin); 
    // Make sure you close all streams. 
    fin.close(); 
    return ret; 
} 

public static String convertStreamToString(InputStream is) throws Exception { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
     sb.append(line).append("\n"); 
    } 
    reader.close(); 
    return sb.toString(); 
}} 

확인 당신은 당신의 매니페스트에이 권한이있는 경우 : 나는 모든 것이 이제 분명 희망

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

합니다.

+0

내가 생각 File folder = cw.getDir ("folder", Context.MODE_PRIVATE); 존재하지 않으면 폴더를 만듭니다. 왜 파일에 무엇인가 쓸 수 있습니까? – Schnicke

+0

좋아, 내가 실수 한 것 같아. 내 편집 좀 봐. 문제가 있다고 생각합니다. – Aksiom

+0

대단히 고맙습니다. 몇 시간 후에 다시 시도해 볼 수 있습니다. 그러면 알려 드리겠습니다. – Schnicke