Java RandomAccessFile - التعامل مع أنماط جديدة لخط جديد؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

أحاول أن أسعى من خلال عشوائي وصول

على سبيل المثال

String line = raf.readLine();
raf.seek (raf.getFilePointer() - line.length() + m.start() + m.group().length());

//m is a Matcher for regular expressions

لقد حصلت على الكثير من الأخطاء خارج عن واحد ولم أتمكن من معرفة السبب. لقد اكتشفت ذلك للتو لأن بعض الملفات التي أقرأها منها تحتوي على طرفين على غرار Unix ، r n ، والبعض الآخر لديه فقط على طراز Windows n.

هل هناك من السهل الحصول على RandomAccessfile معالجة جميع خطوط الخطوط كأشجار على طراز Windows؟

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

المحلول

يمكنك دائمًا دعم الدفق لأعلى بايتين وإعادة قراءتهما لمعرفة ما إذا كان r n أو (! r) n:

String line = raf.readLine();
raf.seek(raf.getFilePointer()-2);
int offset = raf.read() == '\r' ? 2 : 1;
raf.read(); //discard the second character since you know it is either \n or EOF by definition of readLine
raf.seek (raf.getFilePointer() - (line.length()+offset) + m.start() + m.group().length());

لست متأكدًا بالضبط من أين تحاول وضع مؤشر الملف ، لذا اضبط ثوابت 2/1 بشكل مناسب. قد تحتاج أيضًا إلى إضافة فحص إضافي لخطوط فارغة ( n n) إذا حدث في ملفك ، كما لو أنه قد يظهر أنك قد تتعثر في حلقة لا حصر لها دون أن تتخطى ذلك.

نصائح أخرى

رقم RandomAccessFile والتجريدات ذات الصلة (بما في ذلك أنظمة الملفات الأساسية) ملفات نموذج كتسلسل قابل للفهرسة للبايت. إنهم لا يعرفون أو يهتمون بالخطوط أو إنهاء الخطوط.

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

بدلاً من ذلك ، قم بتحويل جميع الملفات لاستخدام تسلسل إنهاء خط DOS قبل فتحها للوصول العشوائي.

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