[英]How to improve the performance of the BufferedWriter in Android?
我正在使用Android開發,並且嘗試通過BufferedWriter
將Android手機的Sensor值記錄到.csv
文件中。
代碼如下:
//recordData
private float ACCELEROMETER_Gx = 0 , ACCELEROMETER_Gy = 0 , ACCELEROMETER_Gz = 0;
private float GRAVITY_X = 0 , GRAVITY_Y = 0 , GRAVITY_Z = 0;
private float GYROSCOPE_X = 0 , GYROSCOPE_Y = 0 , GYROSCOPE_Z = 0;
private float ACCELERATION_X = 0 , ACCELERATION_Y = 0 , ACCELERATION_Z = 0;
private float MAGNETIC_FIELD_X = 0 , MAGNETIC_FIELD_Y = 0 , MAGNETIC_FIELD_Z = 0;
private float PRESSURE = 0;
private float ROTATION_VECTOR_X = 0 , ROTATION_VECTOR_Y = 0 , ROTATION_VECTOR_Z = 0;
更改傳感器后,它將寫入.csv
文件。
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
ACCELEROMETER_Gx = event.values[0];
ACCELEROMETER_Gy = event.values[1];
ACCELEROMETER_Gz = event.values[2];
}else if (event.sensor.getType() == Sensor.TYPE_GRAVITY) {
GRAVITY_X = event.values[0];
GRAVITY_Y = event.values[1];
GRAVITY_Z = event.values[2];
}else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
GYROSCOPE_X = event.values[0];
GYROSCOPE_Y = event.values[1];
GYROSCOPE_Z = event.values[2];
}else if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
ACCELERATION_X = event.values[0];
ACCELERATION_Y = event.values[1];
ACCELERATION_Z = event.values[2];
}else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
MAGNETIC_FIELD_X = event.values[0];
MAGNETIC_FIELD_Y = event.values[1];
MAGNETIC_FIELD_Z = event.values[2];
}else if (event.sensor.getType() == Sensor.TYPE_PRESSURE) {
PRESSURE = event.values[0];
}else if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
ROTATION_VECTOR_X = event.values[0];
ROTATION_VECTOR_Y = event.values[1];
ROTATION_VECTOR_Z = event.values[2];
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
String SensorChangeTime = sdf.format(new Date(System.currentTimeMillis()));
String SensorValue =
SensorChangeTime + "," +
appendcomma(ACCELEROMETER_Gx) + appendcomma(ACCELEROMETER_Gy) + appendcomma(ACCELEROMETER_Gz) +
appendcomma(GRAVITY_X) + appendcomma(GRAVITY_Y) + appendcomma(GRAVITY_Z) +
appendcomma(GYROSCOPE_X) + appendcomma(GYROSCOPE_Y) + appendcomma(GYROSCOPE_Z) +
appendcomma(ACCELERATION_X) + appendcomma(ACCELERATION_Y) + appendcomma(ACCELERATION_Z) +
appendcomma(MAGNETIC_FIELD_X) + appendcomma(MAGNETIC_FIELD_Y) + appendcomma(MAGNETIC_FIELD_Z) +
appendcomma(PRESSURE) +
appendcomma(ROTATION_VECTOR_X) + appendcomma(ROTATION_VECTOR_Y) + appendcomma(ROTATION_VECTOR_Z) + '\n';
writeData(SensorValue);
}
private String appendcomma(float value){
return String.valueOf(value) + ",";
}
private void writeData(String Data){
try {
fw = new FileWriter(path+"/" + FileRecordName, true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(Data);
bw.close();
}catch (IOException e){
Log.d(TAG,"writeData---e = " + e.toString());
}
}
傳感器值更改時,它將每次通過以下代碼寫入.csv
文件:
fw = new FileWriter(path+"/" + FileRecordName, true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(Data);
bw.close();
每次創建new FileWriter
和coles
是否正確?
如何提高Android中BufferedWriter
的性能?
是的,這是正確的行為,對於每個寫入操作,您都必須創建一個新的FileWriter
並將其關閉。 但是,從API 19開始,您可以使用try-with-resources
來簡化操作:
try (BufferedWriter bw = new BufferedWriter(new FileWriter(FILENAME))) {
bw.write(data);
// no need to close it.
//bw.close();
} catch (IOException e) {
e.printStackTrace();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.