ReadLine()問題
4223 ワード
IOを書くプログラムは多くありませんが、BufferedReader/BufferedInputStreamは何度も使っています.それは1つのとても特別な方法があります:readLine()、使うのがとても便利で、毎回読んで帰ってくるのはすべて1行で、多くの手動でbufferのこまごましたことをつなぎ合わせます; は比較的効率的で、1文字/バイトの読み取り、変換、戻りに対して、バッファがあり、バッファをいっぱい読んでから戻ります.一般的には、他のReader/InputStreamをパッケージ化して、データの読み取りを効率的にすることをお勧めします. ファイルでは、1行1行のシーンによく遭遇します.
今回はブルートゥース開発の際、2つのブルートゥースを使ってデータをやり取り(つまり1つずつ送信)していたのですが、ブルーコートというオープンソースコンポーネントはすでにデータ読み込みをInputStreamにカプセル化しており、通常のIO読み取りに相当し、自然とreadLine()を使用していました.
送信データ:
[java]
view plin
copy BufferedWriter output = new BufferedWriter( new OutputStreamWriter(conn.openOutputStream())); int i = 1 ; String message = "message " i;
while (isRunning) { output.write(message+ "/n"); i++; }
データの読み込み:
[java]
view plin
copy BufferedReader input = new BufferedReader( new InputStreamReader(m_conn.openInputStream())); String message = ""; String line = null ; while ((line = m_input.readLine()) != null ) { message += line; } System.out.println(message);
上はコードのセクションです.このコードを使用すると、データを書くたびに成功しますが、データを読む側にはデータ出力がありません(ストリームをオフにしない限り).振り回された後、この中にはいくつかの大きな問題が理解しなければならない.は、readLine()がデータがないときにnullを返す(他のreadメソッドは、データがないときに-1を返す)と勘違いしているが、実際にはreadLine()はブロック関数であり、データがないときはnullを返すのではなく、そこにブロックされている.readLine()がブロックされると、System.out.println(message)という文は実行されないので、受信側で出力するものはありません.System.out.println(message)に実行するには、データを送信した後にストリームをオフにする方法があり、readLine()はブロック状態を終了し、正しい結果を得ることができるが、1行だけデータストリームをオフにすることは明らかではない.もう一つの方法はSystem.out.println(message)をwhileサイクル体内に入れればいいです. readLine()は、データストリームに異常が発生したり、他端がclose()によって落とされたりした場合にのみnull値を返します. bufferサイズを指定しない場合、readLine()で使用されるbufferは8192文字です.bufferサイズに達するまで、「/r」、「/n」、「/r/n」に遭遇しないと返されません.
readLine()の本質(以下JDKソースコードから抜粋):
[java]
view plin
copy String readLine( boolean ignoreLF) throws IOException { StringBuffer s = null ; int startChar; synchronized (lock) { ensureOpen(); boolean omitLF = ignoreLF || skipLF; bufferLoop: for (;;) { if (nextChar >= nChars) fill(); if (nextChar >= nChars) { if (s != return s.toString(); else return } ...... } private ..../その他の int n; do { n = in.read(cb, dst, cb.length - dst); } if (n > nChars = dst + n; nextChar = dst; } }
以上から、readLine()はread(char[]cbuf,int off,int len)を呼び出してデータを読み出し、その後「/r」または「/n」に従ってデータ処理を行う.
Java I/Oブックでも、
public String readLine() throws IOException This method returns a string that contains a line of text from a text file./r,/n, and/r/n are assumed to be line breaks and are not included in the returned string. This method is often used when reading user input from System.in, since most platforms only send the user's input to the running program after the user has typed a full line (that is, hit the Return key). readLine() has the same problem with line ends that DataInputStream's readLine() method has; that is,
the potential to hang on a lone carriage return that ends the stream
. This problem is especially acute on networked connections, where readLine() should never be used.
まとめ、readLine()を使用するには、次の点に注意してください.読み込んだデータは、/rまたは/nまたは/r/n であることに注意する.データがない場合はブロックされ、null はデータストリームが異常または切断された場合に戻る. socketのようなデータストリームを使用する場合、readLine()を使用しないでください.改行/戻り文字を待つために がブロックされないようにします.
今回はブルートゥース開発の際、2つのブルートゥースを使ってデータをやり取り(つまり1つずつ送信)していたのですが、ブルーコートというオープンソースコンポーネントはすでにデータ読み込みをInputStreamにカプセル化しており、通常のIO読み取りに相当し、自然とreadLine()を使用していました.
送信データ:
[java]
view plin
copy
データの読み込み:
[java]
view plin
copy
上はコードのセクションです.このコードを使用すると、データを書くたびに成功しますが、データを読む側にはデータ出力がありません(ストリームをオフにしない限り).振り回された後、この中にはいくつかの大きな問題が理解しなければならない.
readLine()の本質(以下JDKソースコードから抜粋):
[java]
view plin
copy
//
/* EOF */
null
&& s.length() >
0
)
null
;
//
void
fill()
throws
IOException {
//
while
(n ==
0
);
0
) {
以上から、readLine()はread(char[]cbuf,int off,int len)を呼び出してデータを読み出し、その後「/r」または「/n」に従ってデータ処理を行う.
Java I/Oブックでも、
public String readLine() throws IOException This method returns a string that contains a line of text from a text file./r,/n, and/r/n are assumed to be line breaks and are not included in the returned string. This method is often used when reading user input from System.in, since most platforms only send the user's input to the running program after the user has typed a full line (that is, hit the Return key). readLine() has the same problem with line ends that DataInputStream's readLine() method has; that is,
the potential to hang on a lone carriage return that ends the stream
. This problem is especially acute on networked connections, where readLine() should never be used.
まとめ、readLine()を使用するには、次の点に注意してください.