簡體   English   中英

掃描儀跳過新線

[英]scanner skipping new line

我試圖理解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();
}

}

我嘗試使用分隔符,但沒有成功。

如果您運行調試器並逐步執行getNextEntry方法,您將看到在第二次調用時, Scanner會拋出NoSuchElementException 發生這種情況的原因是因為第一個Scanner消耗了部分ByteArrayInputStream

一個修復你可以做的是創建Scanner您的面前while循環,並通過在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對象,只有在調用printlnprintfformatflush時才刷新數據。

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后清除所有結束。

問題是您在getNextEntry中創建了Scanner對象,當該對象被銷毀時,它會關閉流。 嘗試將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();
}
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM