2013-01-24 71 views
1

我想了解Java中的掃描器類,沒有任何人爲什麼這個代碼僅在打印的第一行第一部分,而不是所有的信息部分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方法,您會看到在第二次調用時,Scanner將拋出一個NoSuchElementException。這是因爲第一個Scanner消耗了ByteArrayInputStream的一部分。

一個補丁修復你能做的就是你的while循環之前創建Scanner並傳遞到ScannergetNextEntry強似在ByteArrayInputStream

public static String getNextEntry(Scanner sin) { 

... 

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

根據第2部分,PrintWriter沒有被刷新。如果您將pout.flush()添加到putNextEntry的底部,這會導致數據發送到您的文件。對於PrintWriter對象,只有在調用println,printf,formatflush時纔會刷新數據。

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