سؤال

يفترض برنامجي الحفاظ على مجموعة من الصور في صورة ضوئية. يبدأ من خلال قراءة مجلد من الصور ويضيفها إلى صورتي الضوئية. ثم يقوم بطباعة قائمة تتيح للمستخدم إدراج جميع الصور وإضافة صورة وإيجاد صورة وحفظها وتوقفها. في الوقت الحالي ، إذا قمت بتشغيل برنامجي ، فسيضيف 100 صورة إلى photalbum ، ولكن إذا تركت البرنامج دون حفظ ، فإنه يقوم بمسح الملف الذي أقرأ منه حتى لو لم أضف صورة أو فعلت أي شيء إلى photalbum و لست متأكدا لماذا.

هذه هي طريقتي للطباعة إلى ملف:

private static void saveFile(PrintWriter writer) {
 String result;
  ArrayList<Photo> temp = album.getPhotoAlbum();
  for (int i = 0; i < temp.size(); i++){
   result = temp.get(i).toString() + "\n";
   writer.println(result);
  }
  writer.close();
 }

وحيث يتم إنشاء مثيل:

File file = new File(args[0] + File.separator + "album.dat");

try {
   PrintWriter fout =  
new PrintWriter(new FileWriter(file));
   fileWriter = fout;
  } catch (IOException e){
   System.out.println("ReadFromFile: Folder " + args[0]
                          + " is not found.");
   System.exit(0);
  }

وحيث يتم استدعاؤه في طريقة Runmenu الخاصة بي:

private static void runMainMenu(Scanner scan) {
  String input;
  do {
   showMainMenu();
  input = scan.nextLine().toLowerCase();
  switch (input.charAt(0)) {
  case 'p':
   System.out.println(album.toString());
   break;
  case 'a': 
  album.addPhoto(readPhoto(scan, t));
   break;
  case 'f':
  findMenu(scan);
   break;
  case 's':
   saveFile(fileWriter);
   System.exit(0);
   break;
  case 'q':
   break;
  default:
   System.out.println("Invalid entry: " + 
     input.charAt(0));
   break;
  }
  } while (!input.equalsIgnoreCase("q"));
 }
هل كانت مفيدة؟

المحلول

ربما لا تغلق الدفق بعد فتحه. يجب عليك القيام بذلك في أي حال (ليس فقط عندما تقوم بتعديله بالفعل) إذا تم فتحه ..

لهذا finally الكتل مفيدة في جافا ، ألقِ نظرة هنا لممارسات جيدة حول استخدام تدفقات جافا ..

نصائح أخرى

عند فتح الملف عن طريق تمرير كائن ملف إلى الطباعة كاتب أنت تسمح بشكل أساسي لـ PrintWriter بتحكم كيفية فتح الملف (على الأرجح إنشاء) الذي يحذف الملف الحالي ويعيد إلى ملف جديد للكتابة.

نظرًا لأنك لا تنقذ أبدًا (أغلق الدفق) ، فإن أي بيانات مخزنة في PrintWriter لم يتم إخراجها إلى الملف.

تحتاج إلى إعادة صياغة نهج الملف الخاص بك ، إذا كنت تستخدم وظيفة file.open (...) يمكنك تحديد جلسة إلحاح.

FileStream outStream = File.Open(myFileName, FileMode.Append);
PrintWriter pw = new PrintWriter(outStream);

وبهذه الطريقة ، لن يتم مسح ملفك فقط عن طريق فتحه ، ويمكنك إلحاقه حتى النهاية.

بدلاً من ذلك ، يمكنك إجبار الملف على مسحه عندما تريد أن يكون عن طريق فتحه باستخدام fileMode.create

ملاحظة: يجب أن تتعرف على استخدام كتلة ، إنه مفيد جدا.

تأكد من أنك تغلق تياراتك. تحقق أيضًا من أنك لا تقوم بإفراطك في كتابة الملف الأصلي. أعطى Aren B بعض الرمز C# ، لكن ما يعادل Java سيكون:

PrintWriter printWriter = new PrintWriter( new FileWriter("path/to/album.dat", true));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top