0

ファイルを作成し、プログラムを実行すると、データがファイルに書き込まれますが、プログラムを再度実行すると、新しいデータが古いデータに上書きされます。プログラムが実行されてデータが収集されると、これらのデータは、ファイル内の以前のデータを上書きすることなく、カスケードでファイルに書き込むことができます。

このコードは正常に実行されていますが、プログラムを再度実行すると、必要のない上書きが発生します。以前のデータをファイルに保存し、すぐに新しいデータを書き込む必要があります。

public class MainActivity extends Activity {
File file;
String sdCard;
FileOutputStream fos;
OutputStreamWriter myOutWriter;
String FlieName = "Output1.txt";
EditText txtData;
Button btnWriteSDFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txtData = (EditText) findViewById(R.id.editText1);
    btnWriteSDFile = (Button) findViewById(R.id.button1);
    btnWriteSDFile.setOnClickListener(new OnClickListener() 
    {
        public void onClick(View v)
        { 
            try {
                file = new File("/sdcard/Output1.txt");
                file.createNewFile();
                fos = new FileOutputStream(file);

                String eol = System.getProperty("line.separator");
                myOutWriter =new OutputStreamWriter(fos);
                myOutWriter.append(txtData.getText() + eol);// write from editor 
                myOutWriter.close();
                fos.close();
                Toast.makeText(v.getContext(),"Done writing SD 'Output.txt'", Toast.LENGTH_SHORT).show();
                txtData.setText("");
            } catch (Exception e) {
                // e.printStackTrace();
                Toast.makeText(v.getContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
            }
        }
    });

}

}

4

2 に答える 2

3

まず、 を呼び出してcreateNewFile()います。これは、新しいファイルを作成することを示しています。新しいファイルを作成したくない場合は、 を呼び出さないでくださいcreateNewFile()。また、ドキュメントにcreateNewFile()は「このメソッドは一般的には役に立たない」と記載されているため、単に削除することを検討することをお勧めします。

次に、そのファイルを開いて使用するときに、既存のデータに追加することを示す必要があります。このための標準的なレシピ:

try {
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("outfilename", true)));
    out.println("the text");
    out.close();
} catch (IOException e) {
    //oh noes!
}

trueコンストラクターの 2 番目のパラメーターの は、FileWriter上書きではなく追加することを示します。

第三に、Android でパスをハードコードしないでください。/sdcard/Output1.txtは何年も前から貧弱な形式であり、一部の Android デバイスでは動作しません。

第 4 に、外部ストレージのルートを乱雑にしないでください。したがって、代わりに:

file = new File("/sdcard/Output1.txt");

使用する:

file = new File(getExtenalFilesDir(null), "Output1.txt");

独自のアプリに固有のサブディレクトリにファイルを配置します。

于 2013-07-20T16:29:07.553 に答える
0

java.nio を使用してみてください。java.nio.file と一緒のファイル。標準オープンオプション

try(BufferedWriter bufWriter =
        Files.newBufferedWriter(Paths.get("/sdcard/Output1.txt"),
            Charset.forName("UTF8"),
            StandardOpenOption.WRITE, 
            StandardOpenOption.APPEND,
            StandardOpenOption.CREATE);
    PrintWriter printWriter = new PrintWriter(bufWriter, true);)
{ 

    printWriter.println("Text to be appended.");

}catch(Exception e){
    //Oh no!
}

これは、try-with-resources ステートメントを使用して、パラメータBufferedWriterを受け入れる using Filesを作成し、その結果からStandardOpenOption自動フラッシュします。のメソッドを呼び出して、ファイルに書き込むことができます。PrintWriterBufferedWriterPrintWriterprintln()

このStandardOpenOptionコードで使用されるパラメーター: ファイルを書き込み用に開き、ファイルに追加するだけで、ファイルが存在しない場合はファイルを作成します。

Paths.get("path here")で置き換えることができますnew File("path here").toPath()。とCharset.forName("charset name")希望に合わせて変更することができますCharset

于 2013-07-20T16:45:25.323 に答える