javadoc 说明了这一点Scanner.hasNext()
并且Scanner.next()
可能会阻塞。这真的取决于底层InputStream
。如果是这样的话,我个人永远不会使用 aScanner
从套接字读取。
InputStreamReader
一种更理智的方法可能是使用由 a 包裹的 an BufferedReader
。另外值得一提的是你应该使用StringBuilder
而不是StringBuffer
除非你需要线程安全。
BufferedReader br =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String input = null;
while ((input = br.readLine()) != null)
{
sb.append(input).append(" ");
}
请注意readLine()
,这可能会或可能不适合您的需求,具体取决于您收到的内容。它还假设连接的另一端在发送完成后将关闭。您可能希望改用其中一种read()
方法并相应地进行解析。
编辑从下面的评论中添加:这实际上是阻塞读取在 Java 中的工作方式。这是一个完整的例子:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class App
{
public static void main( String[] args ) throws MalformedURLException, IOException
{
URL url = new URL("http://www.google.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
BufferedReader br =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String input = null;
while ((input = br.readLine()) != null)
{
sb.append(input).append(" ");
}
System.out.println(sb.toString());
}
}
输出(此处为简洁起见,但它是整个页面):
<!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"><head> ...