آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

ایجاد یک log file با روش فایل فرمت اختصاصی

PandaStudio  12 سال پیش  12 سال پیش
+1 0

سلام دوستان

من میخوام یه سیستم لاگ کردن داخل فایل داشته باشم که هرسری یک رشته را ابتدای فایل من اضافه کنه. به کمک فیلم های آموزشی بخش 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);//متدی که خود استاد نوشته
} }

لطفا راهنمایی کنید چکار کنم

0 0
شاید بهتر باشه اطلاعات جدیدی که می خواهید اضافه کنید رو به آخر فایل اضافه کنید این طوری نیاز به حذف و کپی نباشه.(البته بنده هنوز به بخش آموزش کار با فایل نرسیدم ولی قبلا برای ویندوز برنامه نوشتم به انتهای فایل اضافه می کردم و نیازی به حذف و کپی نبود).حالا اساتید میان بیشتر راهنمایی تون میکنن. (12 سال پیش)
0 0
بله میدونم اما استراتژیم جوریه که حتما باید ابتدای فایل بنویسم و البته یه موضوع دیگه هم هست اینکه مشکل نوشتن اول فایل که حل شد حالا چطور میتونم اون را از اول فایل لاگم حذف کنم :-؟ (12 سال پیش)
0 0
درسته ، در این روش از نوشتن روی فایل هر بار تمام محتویات فایل باید دوباره نوشته ، اگر میخواین از این روش استفاده کنید یکبار کل متن رو بخونید در یک متغییر ذخیره کنید ، متن جدید رو به متغییر اضافه کنید و مقدار متغییر رو مجددا در فایل بنویسید (12 سال پیش)
0 0
خوب مگه کل متن داخل inputStream ریخته نمیشه ؟! و سپس به ادامه outputStream اضافه میشه (12 سال پیش)
0 0
خوب الان مشکل چیه ؟ (12 سال پیش)
0 0
رشته مورد نظرم اول outputStream درج نمیشه ولی عمل کوپی از inputStream به outputStream کاملا انجام میشه (12 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
uncocoder  12 سال پیش
+6 0

برای نوشتن اطلاعاتی نظیر Plain Text هیچ نیازی به ذخیره فایل Binary نیست. می تونید یک فایل رو با روش ASCII باز کنید و با متدهایی مثل readLine و ... از توش اطلاعات هر خط رو بخونید یا بنویسید. در آموزشها یاد ندادیم اما کار راحتی هست.

یم مشکل اساسی هم در کد شما وجود داره. شما ابتدا فایل Stream رو از رو مسیر می سازید و بعد فایل اون مسیر رو حذف می کنید، خوب handle فایل خراب میشه دیگه. شما اول فایل رو پاک کنید و بعد InputStream بزنید.

در خصوص درج کردن در ابتدای فایل نمی دونم چرا همچین هدفی دارید پس شاید بهتر باشه از زاویه دیگه ای نگاه کنید، از این زاویه که چرا باید اول فایل بنویسم و نه آخر فایل و چی کار کنم که اگر آخر فایل نوشتم به هدفم برسم؟

0 0
استاد من متوجه نشدم-اگه ابتدا فایلم را پاک کنم بعد چطور میتونم از روی اون inputStream بسازم که مشکل handler هم برطرف بشه؟ (12 سال پیش)
+1 0
ساخت InputStream به پاک کردنش ربطی نداره. شما فایل رو پاک کن، موقعی که می خوای OutputStream بسازی خودش فایل رو می سازه برای شما. من یک بار دیگه سورس شما رو دیدم، شما در واقع این کار رو می کنی. InputStream ( یک لیوان آب ) رو باز می کنید، بعد لیوان رو میشکونید می ندازید سطل آشغال، بعد محتوایات لیوان را داخل لیوان دیگه خالی می کنید! غلطه دیگه. شما می تونی محتویات یک لیوان رو تو خودش بریزی؟ نمیشه دیگه. (12 سال پیش)
پاسخ به سوال 
محمد حسین زاده  12 سال پیش
+6 0

نیازی نیست هر بار فایل رو حذف کنید و دوباره بسازید :

 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();
}

}
}

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .