سؤال

أحد الخطوط الموجودة في ملف Java الذي أحاول فهمه كما هو موضح أدناه.

return new Scanner(file).useDelimiter("\\Z").next();

من المتوقع أن يعود الملف إلى "نهاية المدخلات ولكن بالنسبة للمحطة النهائية ، إن وجدت" حسب وثائق java.util.regex.pattern. ولكن ما يحدث هو أنه يعيد فقط أول 1024 حرفًا من الملف. هل هذا قيود يفرضه مطابقة نمط regex؟ هل يمكن التغلب على هذا؟ حاليا أنا أمضي قدمًا باستخدام قائد FileReader. لكنني أود أن أعرف سبب هذا السلوك.

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

المحلول

حاول لف file اعتراض في FileInputStream

نصائح أخرى

نفسي ، لم أستطع إعادة إنتاج هذا. لكنني أعتقد أنه يمكنني إلقاء الضوء على ما يجري.

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

المشكلة في النمط الخاص بك ... سوف تتطابق دائمًا مع نهاية الإدخال ، لكن هذا لا يعني نهاية دفق/بيانات الإدخال. عندما يطبق Java نمطك على البيانات المخزنة ، فإنه يحاول العثور على أول حدث لنهاية الإدخال. نظرًا لأن 1024 حرفًا موجودًا في المخزن المؤقت ، فإن محرك المطابقة يستدعي موضع 1024 المباراة الأولى من المحدد وكل شيء قبل إرجاعه كأول رمز.

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

Scanner يهدف إلى قراءة العديد من البدائية من ملف. إنه ليس المقصود حقًا قراءة ملف كامل.

إذا كنت لا ترغب في تضمين مكتبات أطراف ثالثة ، فمن الأفضل أن تحلق على BufferedReader أن يلتف FileReader/InputStreamReader للنص ، أو الحلق فوق أ FileInputStream للبيانات الثنائية.

إذا كنت موافقًا على استخدام مكتبة طرف ثالث ، Apache المشاعات لديه FileUtils الفئة التي تحتوي على الأساليب الثابتة readFileToString و readLines للنص و readFileToByteArray للبيانات الثنائية ..

يمكنك استخدام فئة الماسح الضوئي ، فقط حدد مجموعة Chart عند فتح الماسح الضوئي ، أي:

Scanner sc = new Scanner(file, "ISO-8859-1");

تقوم Java بتحويل بايتات من الملف إلى أحرف باستخدام Charset المحددة ، وهو واحد افتراضي (من نظام التشغيل الأساسي) إذا لم يتم إعطاء شيء (مصدر). لا يزال من غير الواضح بالنسبة لي لماذا يقرأ الماسح الضوئي 1024 بايت فقط مع العرض الافتراضي ، بينما يصل مع آخر إلى نهاية الملف. على أي حال ، فهو يعمل بشكل جيد!

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