2013-10-31 2 views
2

파일을 읽는 프로그램을 작성했습니다. 파일을 올바르게 읽습니다. 나는 print 서술문을 사용하여 테스트했다. 그러나 파일의 마지막 줄을 읽은 후 프로그램이 멈추지 않습니다. 그것은 무한 루프로 진행됩니다. 내 while 루프가 공백 문자를 다음 줄로 계속 읽는 것 같습니다. 나는 그것을 고치는 법을 모른다.자바, 파일 리더, 무한 루프로 들어가기

else 부분에 break을 넣으면 첫 번째 줄을 읽고 while 루프에서 벗어납니다. 왜 그런지 모르겠습니다.

도와주세요. 마지막으로 다른 블록이 실제로 선을 소비하지 않습니다

public static void InterpretMessageFromFile() throws FileNotFoundException{ 
    File inputfile = new File("FilePath"); 
    Scanner reader = new Scanner(inputfile); 

try 
    { 
     while (reader.hasNextLine()) 
     { 
      //if the type of order is add order to existing Order Book 
      if (reader.hasNext("A")){ 

       reader.next(); 
       String retrieve_ts = reader.next(); 
       int ts = Integer.parseInt(retrieve_ts); 
       //int ts = Integer.parseInt(retrieve_ts, 2); //for binary file 
       String retrieve_id = reader.next(); 
       int id = Integer.parseInt(retrieve_id); 
       //int id = Integer.parseInt(retrieve_id ,2); // for binary file 
       String or_side = reader.next(); 
       String retrieve_share = reader.next(); 
       int share = Integer.parseInt(retrieve_share); 
      // int share = Integer.parseInt(retrieve_share, 2); //for binary file 
       String retrieve_price = reader.next(); 
       int price = Integer.parseInt(retrieve_price); 
       //int price = Integer.parseInt(retrieve_price, 2); //for binary file 
       System.out.println("Add Order : Id is " + id); 
       AddOrderToExistingBook.AddNewOrder(id, ts, or_side, share, price); 
      } 

      //if it is cancel order 
      else if (reader.hasNext("X")){ 

       reader.next(); 
       String retrieve_ts = reader.next(); 
       int ts = Integer.parseInt(retrieve_ts); 
       //int ts = Integer.parseInt(retrieve_ts, 2); //for binary file 
       String retrieve_id = reader.next(); 
       int id = Integer.parseInt(retrieve_id); 
       System.out.println("Cancel Order : Id is " + id + " time stamp is : " + ts); 
       //int id = Integer.parseInt(retrieve_id, 2); //for binary file 
       //String retrieve_share = reader.next(); 
      // int share = Integer.parseInt(retrieve_share, 2); // need to add back later, removing it for testing purposes 
       CancelOrder.CancelPartOfOrder(id, ts); 
      } 

      //if it is delete order 
      else if (reader.hasNext("D")){ 

       reader.next(); 
       String retrieve_ts = reader.next(); 
       int ts = Integer.parseInt(retrieve_ts, 2); 
       String retrieve_id = reader.next(); 
       int id = Integer.parseInt(retrieve_id, 2); 

       DeleteOrder.DeleteOrderFromBook(id, ts); 


      } 
      else{ 
       // unexpected token. 
       // basically log as info and ignore. 
      } 
     } 
    } 
    finally 
    { 
     reader.close(); 
    } 
} 
+0

의 중복 가능성 [? 자바 기본 콘솔 프로그래밍 - 콘솔에서 입력을 읽을 hasNextLine을 사용할 수 있습니다 (http://stackoverflow.com/questions/5048290/java-basic-console-programming- can-use-hasnextline-to-read-inputs-from-console) – duffymo

+1

'else'에 있다면 라인을 실제로 사용하지 않는 것처럼 보입니다. 그래서'reader.hasNextLine()'은 당신이 전진하지 않기 때문에 항상 true입니다. –

+0

네, 그게 사실이라고 생각합니다. 나는 else 부분에 break 문을 넣는 것을 시도했다. 그러나 그것은 효과가 없습니다. 어떻게 해결할 수 있습니까? – user2942227

답변

1

파일 읽기 작업을 처리 할 때 두 조건을 확인하는 것이 좋습니다. 1) 파일에 다음 행이 있습니까? 2) 다음 행이 널 (NULL)이 아닌지 여부.

while (reader.hasNextLine() && (line = reader.nextLine()) != null) 

코드에서이 String line을 사용할 수 있습니다.

코드에서 다음 값이 reader.next()이 되더라도 포인터는 앞으로 나아 가지 않습니다. 이것이 루프가 종료되지 않는 이유입니다.

참조 : Scanner

+0

null 줄을 확인하면 제대로 작동합니다. 감사. – user2942227

0

: 여기

는 코드입니다. 따라서 입력 된 실제 데이터의 마지막 줄 뒤에 문자가 있으면 프로그램에 항상 다음 줄이 생깁니다. 한 번에 한 줄 씩 파일을 소비 한 다음 String.split()을 사용하여 각 줄에 개별 토큰을 가져옵니다. 이렇게하면 파일의 모든 행을 사용할 수 있습니다.

관련 문제