Java 用不同的数据行填充日志文件
我的android应用程序通过BLE连续接收传感器加速度数据和时间戳。通过按下“我的活动”上的“保存”按钮,它将生成一个包含所接收数据的日志文件。但不幸的是,文件中只有最后收到的一行数据。但我想导出文件中的更多行,直到按按钮退出。这是我在Java 用不同的数据行填充日志文件,java,android-studio,Java,Android Studio,我的android应用程序通过BLE连续接收传感器加速度数据和时间戳。通过按下“我的活动”上的“保存”按钮,它将生成一个包含所接收数据的日志文件。但不幸的是,文件中只有最后收到的一行数据。但我想导出文件中的更多行,直到按按钮退出。这是我在onCreate-方法中的相关代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVie
onCreate
-方法中的相关代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server_interact);
//initialize views
mSaveBtn = findViewById(R.id.save);
//handle button click
mSaveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//text for export to file
mX_Axis = result_X;
mY_Axis = result_Y;
mZ_Axis = result_Z;
mTime = Long.toString(Timestamp);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_DENIED){
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
//show PopUp for runtime permission
requestPermissions(permissions,WRITE_EXTERNAL_STORAGE_CODE);
}
else{
//permissions are accepted, now memory data
saveToTxtFile(mX_Axis, mY_Axis, mZ_Axis, mTime);
}
}
else {
saveToTxtFile(mX_Axis, mY_Axis, mZ_Axis, mTime);
}
}
});
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case WRITE_EXTERNAL_STORAGE_CODE:{
if(grantResults.length > 0 && grantResults[0]
== PackageManager.PERMISSION_GRANTED){
//permissions accepted, memory data
saveToTxtFile(mX_Axis, mY_Axis, mZ_Axis, mTime);
}
else{
//permisssions not accepted, show toast
Toast.makeText(this, "Storage permission is required to store data", Toast.LENGTH_SHORT).show();
}
}
}
}
private void saveToTxtFile(String mX_Axis, String mY_Axis, String mZ_Axis, String mTime) {
//catch current time for dataname
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
Locale.getDefault()).format(System.currentTimeMillis());
try{
//path to storage
File path = Environment.getExternalStorageDirectory();
//create folder with name "myProject_BLE-Data"
File dir = new File(path + "/myProject_BLE-Data/");
dir.mkdirs();
//Dataname
String fileName = "myProject_" + timeStamp + ".txt";
File file = new File(dir, fileName);
//FileWriter class to store characters in file
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(" X-Axis Y-Axis Z-Axis State Timestamp\n");
bw.write("_______________________________________________________________________________________\n");
bw.write(" ");
bw.write(mX_Axis);
bw.write(" ");
bw.write(mY_Axis);
bw.write(" ");
bw.write(mZ_Axis);
bw.write(" ");
if (NotificationValue [1] == 0x00) {bw.write( "State: defect ");}
else if (NotificationValue [1] == 0x01) {bw.write("State: OK ");}
else if (NotificationValue [1] == 0x02) {bw.write("State nearly defect ");}
bw.write(mTime);
bw.close();
//show filename and path in toast
Toast.makeText(this, fileName+"is saved to\n" +dir, Toast.LENGTH_SHORT).show();
}
catch (Exception e){
//if something goes wrong...
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
通过创建以下文件,此块只能生成一次:
bw.write(" X-Axis Y-Axis Z-Axis State Timestamp\n");
bw.write("_______________________________________________________________________________________\n");
这个块表示我不断收到的数据行:
bw.write(" ");
bw.write(mX_Axis);
bw.write(" ");
bw.write(mY_Axis);
bw.write(" ");
bw.write(mZ_Axis);
bw.write(" ");
if (NotificationValue [1] == 0x00) {bw.write( "State: defect ");}
else if (NotificationValue [1] == 0x01) {bw.write("State: OK ");}
else if (NotificationValue [1] == 0x02) {bw.write("State nearly defect ");}
bw.write(mTime);
bw.close();
每次在同一文件中,当我收到通知时(或者通常:每次发生特殊事件时),我都需要生成更多的数据行。但是我没有找到一种方法来做到这一点。它每次只生成一行新文件。我试了很多次。请帮助…您可以在创建FileWriter(file.getAbsoluteFile(),true)时将FileWriter设置为追加--这样FileWriter将追加到现有文件,而不是重写
此外,按钮事件只触发一次-如果您想持续保存数据,必须设置一个循环,直到再次按下按钮为止。非常感谢您!您是否有一个代码片段来演示这一点?你能在我的问题中的代码片段中演示一下吗?当使用循环时,我想我遇到了一个问题,即同一个东西被一次又一次地复制到我的文件中。当我得到新数据时,它不会被处理,因为我的代码被卡在循环中。或者我理解错了吗?
//FileWriter类在文件FileWriter fw=newfilewriter(file.getAbsoluteFile(),true)中存储字符代码>只需将true添加到FileWriter构造函数调用中。关于循环-是的,我明白你的观点。您可以尝试使用eventListener设计模式—该按钮激活事件侦听器,每当要记录的事件发生时,该事件侦听器都会写入文件。