أواجه مشكلة في استخدام FileReader لكتابة ملف txt إلى صفيف (Java) ، ما الخطأ الذي أفعله؟

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

سؤال

Scanner s = null;
    try {
        s = new Scanner(new BufferedReader(new FileReader("rates.txt")));
            for (int i=0; i<9; i++){
                while(s.hasNext()){rates[i] = s.next();}
                System.out.println(rates[i]);
            }
    }catch (IOException e){
        System.out.println(e);
    }
    finally {
        if (s != null) {
            s.close();
        }
    }

عندما أقوم بتشغيل هذا الرمز ، فإنه يقرأ الجزء الأخير من الأحرف في ملف txt الخاص بي ، ويضعها في الأسعار [0] ، تتمسك في 1-9. لست متأكدًا من سبب قراءة نهاية ملفي أولاً. محتويات txt أدناه ..

USD 1.34

EUR 1.00

JPY 126.28

GBP 0.88

INR 60.20

يقرأ 60.20 ، وهو كل ما يسجله في الصفيف. سيكون موضع تقدير أي مساعدة. أعتقد أنني يمكن أن أعطيك نتائج تشغيل هذا الرمز:

run:
60.20
null
null
null
null
null
null
null
null
BUILD SUCCESSFUL (total time: 0 seconds)
هل كانت مفيدة؟

المحلول

while(s.hasNext()){rates[i] = s.next();}

في اللغة الإنجليزية البسيطة ، يقول هذا: في حين أن هناك رمزًا يبقى ، ضع الرمز المميز في rates[i].

لذلك سوف يضع الرمز المميز الأول في rates[i], ، ثم الرمز التالي في rates[i], ، ثم الرمز التالي في rates[i], ، ... ، وأخيرا الرمز الأخير في rates[i]. حيث i لم يتم تعديله ، تتم كتابة جميع القيم في نفس العنصر من الصفيف ، والكتابة فوق قيم القراءة مسبقًا.

نصائح أخرى

أوصي:

  • استخدام List بدلا من الصفيف
    • أكثر مرونة ، أسهل بكثير في العمل معها ، يستفيد من إطار مجموعات Java ، إلخ
  • عدم تخزين رمز العملة وسعر الصرف الرقمي في حقيبة مختلطة واحدة
    • ... ولكن استخدام فئة لتغليف الزوج
  • استخدام Scanner.nextDouble() لقراءة سعر الصرف الرقمي (الذي من المفترض أنك تريد التحويل إليه double على أي حال)

لذا ، شيء من هذا القبيل:

List<ExchangeRate> allRates = new ArrayList<ExchangeRate>();
while (sc.hasNext()) {
    String symbol = sc.next();
    double rate = sc.nextDouble();
    allRates.add(new ExchangeRate(symbol, rate));
}

لاحظ كيف:

  • لم تعد بحاجة إلى معرفة عدد العناصر التي يجب تخصيصها في صفيف
  • الرمز والمعدل لم يتم إلقاؤهم في حقيبة مختلطة واحدة
  • List.add لا تعني أي عداد تحتاج إلى تتبعه وإدارته
    • أي الخطأ في سؤالك الأصلي!

أعتقد أن المشكلة هي أن هذا السطر 5 ، الذي يحتوي على حلقة الخاص بك ، يقرأ إدخال الملف بأكمله. لذلك تقرأ ملفك بالكامل على الأول for التكرار حلقة حيث أنا = 0 ؛ في المرة القادمة الخاصة بك for حلقة لم يتبق شيء للقراءة.

ربما تريد شيئًا كهذا بدلاً من ذلك:

List rates = new ArrayList();
while (s.hasNext()) {
      rates.add(s.next());
}

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

لتجنب المشكلة ، استخدم جديد InputStreamReader(new FileInputStream(filename), encoding) بدلاً من ذلك - وأدرك أنه عليك بالفعل اختيار ملف encoding لملفك.

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