javadocには、ブロックされる可能性がScanner.hasNext()
あると記載されています。それは本当に基礎となる に依存します。個人的には、ソケットから読み取るために a を使用することはありません。Scanner.next()
InputStream
Scanner
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> ...