2012-11-15 9 views
11

그래서 내 프로그램에 텍스트 파일을 읽는 데 문제가 있습니다. 코드는 다음과 같습니다.while 루프에서 BufferedReader.readLine() 사용하기

 try{ 
     InputStream fis=new FileInputStream(targetsFile); 
     BufferedReader br=new BufferedReader(new InputStreamReader(fis)); 

     //while(br.readLine()!=null){ 
     for(int i=0;i<100;i++){ 
      String[] words=br.readLine().split(" "); 
      int targetX=Integer.parseInt(words[0]); 
      int targetY=Integer.parseInt(words[1]); 
      int targetW=Integer.parseInt(words[2]); 
      int targetH=Integer.parseInt(words[3]); 
      int targetHits=Integer.parseInt(words[4]); 
      Target a=new Target(targetX, targetY, targetW, targetH, targetHits); 
      targets.add(a); 
     } 
     br.close(); 
    } 
    catch(Exception e){ 
     System.err.println("Error: Target File Cannot Be Read"); 
    } 

내가 읽는 파일은 100 줄의 인수입니다. for 루프를 사용하면 완벽하게 작동합니다. while 문 (for 루프 위에 주석 처리 된 문)을 사용하면 50 초에 중단됩니다. 사용자가 임의의 수의 행을 가진 파일로 프로그램을 실행할 수 있기 때문에 현재 for 루프 구현이 ' 일하지 마라.

while(br.readLine()!=null) 라인이 50에서 멈 춥니 다? 나는 텍스트 파일을 검사했고 그것을 끊을만한 것이 아무것도 없다.

while 루프를 사용할 때 try-catch에서 오류가 발생하지 않으므로 문제가 발생합니다. 누구든지 아이디어가 있습니까?

답변

24

루프 안에 br.readLine() 번으로 전화를 겁니다.
따라서 회람 할 때마다 두 줄이 두 개가됩니다.

+0

고마워요! 나는 분명히 이것을 알아야했다. 해결 방법이 무엇인지 알아? – billg118

+4

'((line = br.readLine())! = null)'구문은 Java에서 허용됩니다. 맞습니까? – jpm

+2

@jpm : 예; 이것이 최선의 방법입니다. (비록 내가 처음에'null'을 넣어서 더 명확하게하고 싶다.) – SLaks

3

SLaks와 jpm에게 도움을 주셔서 감사합니다. 내가 보지 못했던 아주 단순한 오류였다.

SLaks가 지적했듯이, br.readLine()은 각 루프를 두 번 호출하여 프로그램이 값의 절반 만 얻도록했습니다. 다음은 고정 코드입니다.

try{ 
     InputStream fis=new FileInputStream(targetsFile); 
     BufferedReader br=new BufferedReader(new InputStreamReader(fis)); 
     String words[]=new String[5]; 
     String line=null; 
     while((line=br.readLine())!=null){ 
      words=line.split(" "); 
      int targetX=Integer.parseInt(words[0]); 
      int targetY=Integer.parseInt(words[1]); 
      int targetW=Integer.parseInt(words[2]); 
      int targetH=Integer.parseInt(words[3]); 
      int targetHits=Integer.parseInt(words[4]); 
      Target a=new Target(targetX, targetY, targetW, targetH, targetHits); 
      targets.add(a); 
     } 
     br.close(); 
    } 
    catch(Exception e){ 
     System.err.println("Error: Target File Cannot Be Read"); 
    } 

다시 한번 감사드립니다! 너희들 대단하다!

또한
+0

또한 문자열의 불변성을 크게 활용하는 방법을 보여줍니다. – JoshuaTree

25

매우 포괄적 인 ...

try{ 
    InputStream fis=new FileInputStream(targetsFile); 
    BufferedReader br=new BufferedReader(new InputStreamReader(fis)); 

    for (String line = br.readLine(); line != null; line = br.readLine()) { 
     System.out.println(line); 
    } 

    br.close(); 
} 
catch(Exception e){ 
    System.err.println("Error: Target File Cannot Be Read"); 
} 
+0

이것은 나를 위해가는 길입니다. 'while ((line = br.readLine())! = null)'은 너무 추합니다. 나는'br.readLine()'을 두 번 호출하는 것을 좋아하지 않지만 그것에 대해 할 수있는 일은별로 없다. 난 for 문을'for (String s = br.readLine (s) = null; s = br.readLine())'로 단축하면된다. – Adam

+1

for 루프 구문을 좋아해 변수는 루프 이후에 매달려있다. 또한, 다소 짧아 질 수 있지만 여전히 추한 것입니다 :'for (String line = null; null! = (line = reader.readLine());)' ** ** reader.readLine() 'for '의 조건부 및 이니셜 라이저에서 첫 번째 행을 건너 뜁니다. – Raystorm

5

다음과 같은 구조를 사용할 수 있습니다 경우

while ((line = bufferedReader.readLine()) != null) { 
      System.out.println(line); 
     } 
0

을 여전히이 질문을 통해 비틀 경우. 요즘 Java 8에서 더 멋지게 보입니다.

try { 
    Files.lines(Paths.get(targetsFile)).forEach(
    s -> { 
     System.out.println(s); 
     // do more stuff with s 
    } 
); 
} catch (IOException exc) { 
    exc.printStackTrace(); 
} 
관련 문제