如何在不覆盖预先保存的数据的情况下将更多内容写入文件

时间:2013-07-20 16:19:05

标签: java android

我创建了一个文件,当我运行程序时,数据已写入文件,但是当我再次运行程序时,新数据会写入旧数据。 我需要一旦程序运行并收集数据,这些数据可以相互级联写入文件,而不会覆盖文件中的先前数据。

这段代码运行成功,但是当我再次运行程序时,我不需要写入过度写入,我需要将以前的数据保存在文件旁边,然后很快就将新数据写入。

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();
            }
        }
    });

}

}

2 个答案:

答案 0 :(得分:3)

首先,您正在呼叫createNewFile()。这表示您要创建新文件。如果您不想创建新文件,请不要致电createNewFile()。而且,由于createNewFile()的文档说“此方法通常不常用”,您可能希望考虑摆脱它。

其次,您需要在打开并使用该文件时指明要附加到现有数据。这个standard recipe

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");

将文件放在您自己的应用程序唯一的子目录中。

答案 1 :(得分:0)

尝试使用java.nio。Files和java.nio.file。StandardOpenOption

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使用文件,该文件接受StandardOpenOption参数,并从结果PrintWriter中自动刷新BufferedWriter 。然后可以调用PrintWriter的{​​{1}}方法来写入文件。

此代码中使用的println()参数:打开要写入的文件,仅附加到文件,如果文件不存在则创建该文件。

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