أواجه مشكلة في استخدام FileReader لكتابة ملف txt إلى صفيف (Java) ، ما الخطأ الذي أفعله؟
-
25-09-2019 - |
سؤال
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
لملفك.