多次使用扫描仪从输入流中读取内容的行为不符合预期
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
更改为实例类型,这样我就可以调用特定于该类型的方法(mark
、reset
和 markSupported
)。这允许流指向最后标记的位置。
对输入流调用重置对我有用。
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();
}
}
}
我正在使用以下代码从输入流中读取内容。
@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
更改为实例类型,这样我就可以调用特定于该类型的方法(mark
、reset
和 markSupported
)。这允许流指向最后标记的位置。
对输入流调用重置对我有用。
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();
}
}
}