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第二个参数中的FileWriter表示您要追加而不是覆盖。

第三,不要在 Android 中硬编码路径/sdcard/Output1.txt多年来一直很糟糕,无法在某些 Android 设备上运行。

第四,不要弄乱外部存储的根。因此,而不是:

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 语句来创建一个BufferedWriterusing Files,它接受参数,并从结果中StandardOpenOption自动刷新。的方法,然后可以调用写入文件。PrintWriterBufferedWriterPrintWriterprintln()

此代码中使用的StandardOpenOption参数:打开文件进行写入,仅追加到文件,如果文件不存在则创建文件。

Paths.get("path here")可以替换为new File("path here").toPath()。并且Charset.forName("charset name")可以进行修改以适应所需Charset

于 2013-07-20T16:45:25.323 回答