كيف يمكنني قراءة ملف مرة أخرى باستخدام قارئ مخزنة في جافا؟

StackOverflow https://stackoverflow.com/questions/3852276

  •  27-09-2019
  •  | 
  •  

سؤال

لدي رمز Java يقرأ من خلال ملف إدخال باستخدام قارئ مخزن مؤقت حتى readLine() طريقة العودة null. أحتاج إلى استخدام محتويات الملف مرة أخرى إلى غير مسمى من المرات. كيف يمكنني قراءة هذا الملف من البداية مرة أخرى؟

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك عن طريق استدعاء وظيفة Run () بشكل متكرر ، بعد التحقق لمعرفة ما إذا كان لا يمكن قراءة خطوط أخرى - إليك عينة

// Reload the file when you reach the end (i.e. when you can't read anymore strings)
  if ((sCurrentLine = br.readLine()) == null) {
    run();
  }

نصائح أخرى

يمكنك الإغلاق وإعادة فتحه مرة أخرى. خيار آخر: إذا لم يكن كبيرًا جدًا ، فضع محتواه في قائمة ، على سبيل المثال.

يدعم قارئ المخزن المؤقت إعادة تعيين () إلى موضع للبيانات المخزنة فقط. ولكن هذا غير قادر على الحصول على ملف (افترض أن هذا الملف أكبر من المخزن المؤقت).
حلول:
1. REOPEN
2. استخدام عشوائي

واحد Reader يجب استخدامها مرة واحدة لقراءة الملف. إذا كنت ترغب في قراءة الملف مرة أخرى ، قم بإنشاء جديد Reader بناء على ذلك.

استخدام الجوافةالمرافق IO ، يمكنك إنشاء تجريد لطيف يتيح لك قراءة الملف عدة مرات كما تريد files.newreadersupplier (ملف ، charset). هذا يمنحك المدخلاتu003CInputStreamReader> يمكنك استرداد جديد Reader من عن طريق الاتصال getInput() في أي وقت.

والأفضل من ذلك ، أن الجوافة لديها العديد من طرق المرافق التي تستخدم InputSupplierS مباشرة ... هذا يوفر لك من الاضطرار إلى القلق بشأن إغلاق المقدمة Reader نفسك. ال charstreams يحتوي الفصل على معظم المرافق IO المتعلقة بالنص. مثال بسيط:

public void doSomeStuff(InputSupplier<? extends Reader> readerSupplier) throws IOException {
  boolean needToDoMoreStuff = true;
  while (needToDoMoreStuff) {
    // this handles creating, reading, and closing the Reader!
    List<String> lines = CharStreams.readLines(readerSupplier);
    // do some stuff with the lines you read
  }
}

نظرا ل File, ، يمكنك تسمية هذه الطريقة مثل:

File file = ...;
doSomeStuff(Files.newReaderSupplier(file, Charsets.UTF_8)); // or whatever charset

إذا كنت ترغب في القيام ببعض المعالجة لكل سطر دون قراءة كل سطر في الذاكرة أولاً ، يمكنك بدلاً من ذلك استخدام readLines الحمل الزائد الذي يأخذ ملف LineProcessor.

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

أود أن أقترح مكتبات شركات الاستخدام

http://commons.apache.org/io/api-release/org/apache/commons/io/fileutils.html

أعتقد أن هناك دعوة لقراءة الملف فقط في bytearray والتي قد تكون طريقة بديلة

لست متأكدًا مما إذا كنت قد فكرت في mark() و reset() طرق على BufferedReader

يمكن أن يكون ذلك خيارًا إذا كانت ملفاتك فقط في الحجم MBS ، ويمكنك تعيين العلامة في بداية الملف والاحتفاظ بإعادة التعيين () بمجرد الضغط على نهاية الملف. يبدو أيضًا أنه سيتم تقديم القراءات اللاحقة على نفس الملف بالكامل من المخزن المؤقت دون الحاجة إلى الذهاب إلى القرص.

واجهت نفس القضية وجاءت تجول في هذا السؤال.

1. استخدام طرق Mark () و Reset ():

يمكن إنشاء BufferEdReader باستخدام Filereader وأيضًا ملف fileInputStream. لا يدعم FileReader أساليب MARK وإعادة تعيين. حصلت على استثناء بينما حاولت القيام بذلك. حتى عندما حاولت مع FileInputStream ، لم أتمكن من القيام بذلك لأن ملفي كان كبيرًا (حتى الخاص بك هو أعتقد). إذا كان طول الملف أكبر من المخزن المؤقت ، فلن يعمل وضع علامة وإعادة تعيين مع ذلك مع Filereader ليس مع FileInputStream. المزيد عن هذا في هذا الجواب بقلم jtahlborn.

2. إغلاق الملف وإعادة فتحه

عندما أغلقت الملف وأعيد فتحه وقمت بإنشاء مخزن مؤقت جديد ، كان يعمل بشكل جيد. الطريقة المثالية التي أعتقد أنها إعادة فتح الملف مرة أخرى وإنشاء مخزن مؤقت جديد باعتباره fileReader أو fileInputStream يجب استخدامه مرة واحدة فقط لقراءة الملف.

try {
            BufferedReader br = new BufferedReader(new FileReader(input));

            while ((line = br.readLine()) != null)
            {
                //do somethng
            }
            br.close();
        }
        catch(IOException e)
        {
            System.err.println("Error: " + e.getMessage());

        }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top