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

标签 java inputstream java.util.scanner

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

@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 )。这允许流指向最后一个标记的位置。

关于java - 使用扫描仪多次从输入流读取内容的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29008849/

相关文章:

Java使用Scanner作为构造函数的参数

java - Jbpm6.1.0 控制台不工作 - 无法启动服务 jboss.deployment.unit .“jbpm-console.war” .WeldService :

java - 使用小程序在客户端计算机上创建和写入文件时出错

android - 你如何在 MediaPlayer 上播放 Android InputStream?

java - I/O 输出取决于读卡器的缓冲区大小

java - 复制粘贴时扫描仪出现问题,但原始程序可以运行

java - 等待服务器给出的答复给定的时间

java - 我如何在android中使用args.length控制

android - 即使请求相同,Java InputStream 哈希码每次都不同

java - 如何使用Java中类的成员方法从文件中读取数据?