2013-01-24 4 views
1

내가 자바 스캐너 클래스를 이해하려고 노력하고는, 제 2 부스캐너 건너 뛰는 새로운 라인

import java.io.ByteArrayInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.util.NoSuchElementException; 
import java.util.Scanner; 

public class BadParse { 

public static String getNextEntry(InputStream in) { 
    Scanner sin = new Scanner(in); 

    try { 
     String ssn = sin.next(); 
     String name = sin.next(); 
     int age = sin.nextInt(); 

     return name + "(" + ssn + ") is " + age + " years old."; 
    } catch (NoSuchElementException e) { 
     return null; 
    } 
} 

public static void putNextEntry(String ssn, String name, int age, OutputStream out) { 
    PrintWriter pout = new PrintWriter(new OutputStreamWriter(out)); 

    pout.print(ssn + " "); 
    pout.print(name + " "); 
    pout.print(age + " "); 
} 

public static void main(String[] args) throws IOException { 

    // Part I 
    String input = "1234567890 John 20\n0987654321 Beth 18\n2468101214 Jack 19\n"; 
    InputStream in = new ByteArrayInputStream(input.getBytes()); 

    String entry; 
    while ((entry = getNextEntry(in)) != null) { 
     System.out.println(entry); 
    } 

    // Part II 
    OutputStream out = new FileOutputStream("data"); 

    putNextEntry("1234567890", "John", 20, out); 
    putNextEntry("0987654321", "Beth", 18, out); 
    putNextEntry("2468101214", "Jack", 19, out); 

    out.close(); 
} 

}

의 모든 정보를이 코드는 일부에 불과 하나에서 첫 번째 줄을 인쇄 왜 사람을 수행하고 있지

구분 기호를 사용했지만 성공하지 못했습니다.

+1

당신이 잡을 예외를 무시하지 마십시오. 적어도'e.printStackTrace()'를 수행해야합니다. –

답변

2

디버거를 실행하고 getNextEntry 메서드를 실행하면 두 번째 호출에서 ScannerNoSuchElementException을 던졌습니다. 그 이유는 첫 번째 ScannerByteArrayInputStream의 일부를 사용했기 때문입니다. 당신이 할 수있는

한 수정은 while 루프 전에 Scanner를 작성하고 Scanner 대신 ByteArrayInputStream 전달의 getNextEntry에 전달한다. 제 2의 측면에서

public static String getNextEntry(Scanner sin) { 

... 

Scanner sin = new Scanner(in); 
String entry; 
while ((entry = getNextEntry(sin)) != null) { 

PrintWriter는 플러시되지 않습니다. pout.flush()putNextEntry 하단에 추가하면 데이터가 파일로 전송됩니다. PrintWriter 개체의 경우 println, printf, format 또는 flush을 호출하면 데이터가 플러시됩니다.

public static void putNextEntry(String ssn, String name, int age, OutputStream out) { 
    PrintWriter pout = new PrintWriter(new OutputStreamWriter(out)); 
    pout.print(ssn + " "); 
    pout.print(name + " "); 
    pout.print(age + " "); 
    pout.flush(); 
} 

스캐너와 비슷한 PrintWriter를 생성하여 전달하는 것이 좋습니다. 자원을 줄이고 putNextEntry 번을 여러 번 호출 한 다음 모든 것을 끝내십시오.

+0

감사합니다! 도움이 된 – sola

2

getNextEntry 안에 Scanner 개체를 만들고이 개체가 파괴되면 스트림을 닫는 것이 문제입니다. 같은 인수 대신 스트림으로 스캐너를 통과 시도 (와 같은의 PrintWriter 간다) :

import java.io.ByteArrayInputStream; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.util.NoSuchElementException; 
import java.util.Scanner; 

public class BadParse { 
public static String getNextEntry(Scanner sin) { 

    try { 
     String ssn = sin.next(); 
     String name = sin.next(); 
     int age = sin.nextInt(); 

     return name + "(" + ssn + ") is " + age + " years old."; 
    } catch (NoSuchElementException e) { 
     return null; 
    } 
} 

public static void putNextEntry(String ssn, String name, int age, PrintWriter pout) { 

    pout.print(ssn + " "); 
    pout.print(name + " "); 
    pout.print(age + " "); 
} 

public static void main(String[] args) throws IOException { 

    // Part I 
    String input = "1234567890 John 20\n0987654321 Beth 18\n2468101214 Jack 19\n"; 
    InputStream in = new ByteArrayInputStream(input.getBytes()); 
    Scanner sin = new Scanner(in); 

    String entry; 
    while ((entry = getNextEntry(sin)) != null) { 
     System.out.println(entry); 
    } 

    // Part II 
    OutputStream out = new FileOutputStream("data"); 
    PrintWriter pout = new PrintWriter(new OutputStreamWriter(out)); 

    putNextEntry("1234567890", "John", 20, pout); 
    putNextEntry("0987654321", "Beth", 18, pout); 
    putNextEntry("2468101214", "Jack", 19, pout); 

    pout.close(); 
} 
} 
+0

감사합니다. 나는 공황 상태에 빠지기 시작했고, 마지막에 닫히면 플러시가 발생합니다. – sola