ایجاد یک log file با روش فایل فرمت اختصاصی
سلام دوستان
من میخوام یه سیستم لاگ کردن داخل فایل داشته باشم که هرسری یک رشته را ابتدای فایل من اضافه کنه. به کمک فیلم های آموزشی بخش 19 کد زیر را نوشتم اما انگار هر سری فایل قبلی را کلا جایگزین محتویاتم میکنه و اطلاعات اول فایلم نوشته نمیشه.
در ابتدا یک inputStream و یک outputStream میسازم که محتویات فایل لاگم را داخل inputstream میریزم و بعد فایلم را پاک میکنم چون دقیقا میخوام فایل لاگ جدید را جایگزینش کنم. بعد outputStream را توی همون مسیر قبلی با همون نام میسازم و بعد رشته مورد نظرم را داخلش درج میکنم. حالا با کمک متد copyFile مقدار inputStream که از روی فایل لاگ قدیمی ساخته شده را توی outputStream میریزم. مشکل اینجاست که انگار "رشته مورد نظرم" حذف میشه و inputStream از ابتدا داخل outputStream ریخته میشه.
ObjectOutputStream outputStream = null;
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(new FileInputStream(filePath));
File file = new File(filePath);
file.delete();
outputStream = new ObjectOutputStream(new FileOutputStream(filePath));
outputStream.writeUTF("رشته مورد نظرم");
copyFile(inputStream, outputStream);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
public static void copyFile(InputStream inputStream, OutputStream outputStream) {
byte[] buffer = new byte[8 * 1024];
int lenRead = 0;
try {
while ((lenRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, lenRead);
}
}
catch (IOException e) {
e.printStackTrace();
} finally {
closeStream(inputStream);//متدی که خود استاد نوشته
closeStream(outputStream);//متدی که خود استاد نوشته
}
}
لطفا راهنمایی کنید چکار کنم
برای نوشتن اطلاعاتی نظیر Plain Text هیچ نیازی به ذخیره فایل Binary نیست. می تونید یک فایل رو با روش ASCII باز کنید و با متدهایی مثل readLine و ... از توش اطلاعات هر خط رو بخونید یا بنویسید. در آموزشها یاد ندادیم اما کار راحتی هست.
یم مشکل اساسی هم در کد شما وجود داره. شما ابتدا فایل Stream رو از رو مسیر می سازید و بعد فایل اون مسیر رو حذف می کنید، خوب handle فایل خراب میشه دیگه. شما اول فایل رو پاک کنید و بعد InputStream بزنید.
در خصوص درج کردن در ابتدای فایل نمی دونم چرا همچین هدفی دارید پس شاید بهتر باشه از زاویه دیگه ای نگاه کنید، از این زاویه که چرا باید اول فایل بنویسم و نه آخر فایل و چی کار کنم که اگر آخر فایل نوشتم به هدفم برسم؟
نیازی نیست هر بار فایل رو حذف کنید و دوباره بسازید :
public class CustomLogActivity extends Activity {
Button btnAppendToLog;
Button btnReadLog;
TextView txtLog;
File logFile;
String logDirPath = Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/log_files/";
String logFilePath = logDirPath + "log.txt";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new File(logDirPath).mkdirs();
logFile = new File(logFilePath);
if (!logFile.exists())
try {
logFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
btnAppendToLog = (Button) findViewById(R.id.btnAppendToLog);
btnReadLog = (Button) findViewById(R.id.btnReadLog);
txtLog = (TextView) findViewById(R.id.txtLog);
btnAppendToLog.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
appendToLog();
}
});
btnReadLog.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
readLog();
}
});
}
private void appendToLog() {
byte[] log = new byte[(int) logFile.length()];
try {
new FileInputStream(logFile).read(log);
Date date = new Date();
byte[] newLog = ("new log appending ... " + date.getHours() + ":"
+ date.getMinutes() + ":" + date.getSeconds() + "\n")
.getBytes();
FileOutputStream output = new FileOutputStream(logFile);
output.write(newLog);
output.write(log);
output.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void readLog() {
byte[] log = new byte[(int) logFile.length()];
try {
new FileInputStream(logFile).read(log);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
txtLog.setText(new String(log, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .