كيف يمكنني قراءة ملف مرة أخرى باستخدام قارئ مخزنة في جافا؟
-
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()
في أي وقت.
والأفضل من ذلك ، أن الجوافة لديها العديد من طرق المرافق التي تستخدم InputSupplier
S مباشرة ... هذا يوفر لك من الاضطرار إلى القلق بشأن إغلاق المقدمة 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());
}
}