0

誰かがこのコードのスニペットを見て、私が間違っていることを教えてください。これは、ファイル名として使用するパラメーターとして文字列を受け取り、末尾に「.txt」を追加する単純な関数です。

この関数は、ファイルが存在するかどうかを確認し、存在しない場合はファイルを作成してから、2 行のテキストをファイルに書き込みます。すべてが機能しているように見え、SD カードにファイルが正常に作成されます。ただし、すべてが完了すると、ファイルは空になります (サイズは 0 バイトになります)。

私が見落としているのは明らかなことだと思います。

public void writeFile(String fileName) {
    String myPath = new File(Environment.getExternalStorageDirectory(), "SubFolderName");
    myPath.mkdirs();

    File file = new File(myPath, fileName+".txt");

    try {
        if (!file.exists()) {
            if (!file.createNewFile()) {
                Toast.makeText(this, "Error Creating File", Toast.LENGTH_LONG).show();
                return;
            }
        }

        OutputStreamWriter writer = new OutputStreamWriter(openFileOutput(file.getName(), Context.MODE_PRIVATE));
        writer.append("First line").append('\n');
        writer.append("Second line").append('\n');

        writer.close();
    }
    catch (IOException e) {
        // Do whatever
    }
}
4

3 に答える 3

1

それを見つけるのにしばらく時間がかかりました。ここのjavadocs は私を正しい軌道に乗せました。それは言います:

パラメーター
  • name 開くファイルの名前。パス区切り文字を含めることはできません。
  • モード 動作モード。デフォルトの操作には 0 または MODE_PRIVATE を使用し、既存のファイルに追加するには MODE_APPEND を使用し、パーミッションを制御するには MODE_WORLD_READABLE および MODE_WORLD_WRITEABLE を使用します。
  • ファイルが存在しない場合は作成されますが、プライベート アプリ スペースに作成されます。を使用してSDカードのどこかにファイルを作成しますが、File.createNewFile()作成すると、常にプライベートアプリスペースにプライベートファイルがcontext.openFileOutput()作成されます。

    編集:これが私のコードです。行を書いて読んで、得たものをlogcatに出力することで、あなたの方法を拡張しました。

    <pre>
        public void writeFile(String fileName) {
        try {
            OutputStreamWriter writer = new OutputStreamWriter(
                    getContext().openFileOutput(fileName + ".txt", Context.MODE_PRIVATE));
            writer.append("First line").append('\n');
            writer.append("Second line").append('\n');
    
            writer.close();
        }
        catch (IOException e) {
            Log.e("STACKOVERFLOW", e.getMessage(), e);
            return;
            // Do whatever
        }
    
        // Now read the file
        try {
            BufferedReader is = new BufferedReader(
                    new InputStreamReader(
                            getContext().openFileInput(fileName + ".txt")));
            for(String line = is.readLine(); line != null; line = is.readLine())
                Log.d("STACKOVERFLOW", line);
    
            is.close();
        } catch (IOException e) {
            Log.e("STACKOVERFLOW", e.getMessage(), e);
            return;
            // Do whatever
        }
    }
    

    于 2013-09-08T15:55:47.190 に答える
    1

    こんにちは、私が使用している完全なコードをお見せします。完璧に動作します。使わない

     new OutputStreamWriter() 
    

    私が使う

    new BufferedWriter()
    

    ここに私のスニペットがあります

    public void writeToFile(Context context, String fileName, String data) {
    
        Writer mwriter;
    
        File root = Environment.getExternalStorageDirectory();
        File dir = new File(root.getAbsolutePath() + File.separator + "myFolder");
    
        if (!dir.isDirectory()) {
            dir.mkdir();
        }
    
        try {
            if (!dir.isDirectory()) {
                throw new IOException(
                    "Unable to create directory myFolder. SD card mounted?");
            }
            File outputFile = new File(dir, fileName);
            mwriter = new BufferedWriter(new FileWriter(outputFile));
            mwriter.write(data); // DATA WRITE TO FILE
            Toast.makeText(context.getApplicationContext(),
                "successfully saved to: " + outputFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
            mwriter.close();
        } catch (IOException e) {
            Log.w("write log", e.getMessage(), e);
            Toast.makeText(context, e.getMessage() + " Unable to write to external storage.",Toast.LENGTH_LONG).show();
            }
    }
    

    -- 元のコード --

    于 2013-09-08T14:30:08.867 に答える
    0

    モードを からContext.MODE_PRIVATEに変更Context.MODE_APPENDしますopenFileOutput()

    MODE_APPEND

    モード_プライベート

    それ以外の

    OutputStreamWriter writer = new OutputStreamWriter(openFileOutput(file.getName(), Context.MODE_PRIVATE));
    

    使用する

    OutputStreamWriter writer = new OutputStreamWriter(openFileOutput(file.getName(), Context.MODE_APPEND));
    

    アップデート :

    1.

    FileOutputStream osr = new FileOutputStream(file.getName(), true); // this will set append flag to true
    
    OutputStreamWriter writer = new OutputStreamWriter(osr);
    BufferedWriter fbw = new BufferedWriter(writer);
                fbw.write("First line");
                fbw.newLine();
                fbw.write("Second line");
                fbw.newLine();
                fbw.close();
    

    または2。

    private void writeFileToInternalStorage() {
              FileOutputStream osr = new FileOutputStream(file.getName(), true); // this will set append flag to true
              String eol = System.getProperty("line.separator");
              BufferedWriter fbw = null;
              try {
                  OutputStreamWriter writer = new OutputStreamWriter(osr);
                  fbw = new BufferedWriter(writer);
                  fbw.write("First line" + eol);
                  fbw.write("Second line" + eol);           
    
              } catch (Exception e) {
                  e.printStackTrace();
              } finally {
                if (fbw != null) {
                try {
                    fbw.close();
                } catch (IOException e) {
                  e.printStackTrace();
                }
                }
              }
            } 
    
    于 2013-09-08T14:18:33.527 に答える