多次使用扫描仪从输入流中读取内容的行为不符合预期

Reading the content from an inputstream using scanner multiple times is not behaving as expected

我正在使用以下代码从输入流中读取内容。

@Test
public void testGetStreamContent(){
        InputStream is = new ByteArrayInputStream("Hello World!!".getBytes());
        System.out.println(getStreamContent(is));
        System.out.println("Printed once");
        System.out.println(getStreamContent(is));
}

public static String getStreamContent(InputStream is) {
    Scanner s = null;
    try {
        s = new Scanner(is);
        s.useDelimiter("\A");
        return s.hasNext() ? s.next() : "";
    } finally {
        if (s != null){
            s.close();
        }
    }
}

我希望输出包含 Hello World!!两次,但第二次没有返回文本。以下是唯一的输出。

Hello World!!
Printed once

我尝试使用 s.reset() 重置扫描仪。但这也行不通。

试试这个

    ByteArrayInputStream is = new ByteArrayInputStream("Hello World!!".getBytes());
    if(is.markSupported()){
        is.mark("Hello World!!".length());
    }
    System.out.println(getStreamContent(is));
    is.reset();
    System.out.println("Printed once");
    System.out.println(getStreamContent(is));

注意事项:我将变量类型从 InputStream 更改为实例类型,这样我就可以调用特定于该类型的方法(markresetmarkSupported)。这允许流指向最后标记的位置。

对输入流调用重置对我有用。

public static String getStreamContent(InputStream is) throws IOException {
    if(is == null)
        return "";
    is.reset();
    Scanner s = null;
    try {
        s = new Scanner(is);
        s.reset();
        s.useDelimiter("\A");
        return s.hasNext() ? s.next() : "";
    } finally {
        if (s != null){
            s.close();
        }
    }
}