Java 用不同的数据行填充日志文件

Java 用不同的数据行填充日志文件,java,android-studio,Java,Android Studio,我的android应用程序通过BLE连续接收传感器加速度数据和时间戳。通过按下“我的活动”上的“保存”按钮,它将生成一个包含所接收数据的日志文件。但不幸的是,文件中只有最后收到的一行数据。但我想导出文件中的更多行,直到按按钮退出。这是我在onCreate-方法中的相关代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVie

我的android应用程序通过BLE连续接收传感器加速度数据和时间戳。通过按下“我的活动”上的“保存”按钮,它将生成一个包含所接收数据的日志文件。但不幸的是,文件中只有最后收到的一行数据。但我想导出文件中的更多行,直到按按钮退出。这是我在
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设计模式—该按钮激活事件侦听器,每当要记录的事件发生时,该事件侦听器都会写入文件。