2010-04-10 2 views
1
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 파일의 마지막 청크를 읽어 들여 rate [0]에 배치하고 1-9에서 null을 지정합니다. 나는 왜 그것이 나의 파일의 끝을 처음으로 읽는지 모르겠다. txt의 내용은 다음과 같습니다.FileReader를 사용하여 txt 파일을 배열 (Java)에 쓰는 데 문제가 있습니다. 무엇을 잘못하고 있습니까?

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) 
+0

텍스트 파일의 데이터로 정확히 무엇을하고 싶습니까? – Finbarr

+0

'rates '는 코드에서 어떻게 정의되어 있습니까? –

답변

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

를 일반 영어,이 말한다 : 왼쪽 토큰이 있지만, rates[i]에 다음 토큰을 넣어.

그래서 rates[i]rates[i], ..., 그리고 마지막으로 마지막 토큰으로, rates[i]로, rates[i]로 그 다음 토큰을 그 다음 토큰을 첫 번째 토큰을 넣어 것입니다. i이 수정되지 않았으므로 모든 값이 이전에 읽은 값을 덮어 써서 배열의 동일한 요소에 기록됩니다.

+0

/facepalm 감사합니다. – DeliriumTremens

+0

+1 참으로 좋은 발견! @deliriumtremens는 자신의 답변을 수락하는 것을 잊지 않습니다 :-) –

0

나는 while 루프를 포함하는 5 행이 전체 파일 입력을 읽는다는 것이 문제라고 생각합니다. 그래서 당신은 첫 번째 for 루프 반복에서 전체 파일을 읽습니다. 여기서 i = 0; 다음번에 for 루프를 읽을 때 아무것도 남지 않았습니다.

당신은 아마 대신 이런 걸 원하는 :

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

을 나는 추천 :

  • 사용 대신 배열의 List
    • 이 작업을 훨씬 쉽게,보다 유연한 활용 Java Collections Framework 등
  • 통화 기호 및 숫자 환율을 모두 하나의 혼합 백에 저장하지 마십시오.
    • ...그러나이 같은 숫자 교환 (아마도 어쨌든 double로 변환 할 수 있습니다) 속도 그래서

    , 뭔가 읽을 Scanner.nextDouble()을 사용하여 한 쌍

  • 을 캡슐화하는 클래스를 사용하여 :

    • 당신은 더 이상 알 필요가 : 방법
      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에 던져되지는 당신이 버그 즉
      • 을 추적하고 관리 할 필요가없는 카운터를 의미합니다 원래 질문!
  • 0

    또 다른 잠재적 인 문제 : FileReader는 플랫폼의 디폴트 인코딩을 사용합니다. 이것은 사용자 제공 파일을 처리하는 데 적합 할 수 있지만 파일이 응용 프로그램의 일부인 경우 호환되지 않는 기본 인코딩이있는 시스템에서 응용 프로그램이 실행될 때 파일이 손상 될 수 있습니다 (ASCII 문자 만 사용하면 이 아닙니다). 이것으로부터 완전히 당신을 보호하십시오).

    대신이 문제를 방지하려면 InputStreamReader(new FileInputStream(filename), encoding)을 새로 사용하고 실제로 파일에 encoding을 골라야한다는 것을 알고 있어야합니다.