我创建了一个文件,当我运行程序时,数据已写入文件,但是当我再次运行程序时,新数据会写入旧数据。 我需要一旦程序运行并收集数据,这些数据可以相互级联写入文件,而不会覆盖文件中的先前数据。
这段代码运行成功,但是当我再次运行程序时,我不需要写入过度写入,我需要将以前的数据保存在文件旁边,然后很快就将新数据写入。
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();
}
}
});
}
}
答案 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")
。