踏んだ穴シリーズのInputStream.read(byte[])方法

4810 ワード

プロジェクトの前はすべてよくて、最近現場のあちらは1つの問題が現れて、報告の間違いは合法的なjson文字列ではありませんて、このjson文字列はhttpを通じてアクセスを要求して獲得しました.
ブラウザ上でhttpというリクエストに直接アクセスすることで,返されるjsonも完全に正しいことが分かった.その後、コードを調べて、バイトストリームからデータを読み出すエラーが検出されました.
前のエラーコードを見てください.この方法はInputStreamを処理し、文字列に戻ります.
 1 public String process(InputStream in, String charset) {
 2      byte[] buf = new byte[1024];
 3      StringBuffer sb = new StringBuffer();
 4      try {
 5          while (in.read(buf) != -1) {
 6              sb.append(new String(buf, charset));
 7          }
 8     } catch (IOException e) {
 9          e.printStackTrace();
10     }
11      return sb.toString();
12 }

 問題のあるコードは6行目で、前のプロジェクトが間違っていないことを発見したのはInputStreamの中のデータが少なく、1024バイト未満で、whileのところで1回循環すればいいので、正しいフォーマットのjson列を得ることができます.後にエラーが発生したのはInputStreamの中のデータが比較的に多いためで、whileは2回必要で、1回目の読み取りの後でbufの中はいっぱいになって、2回目の読み取りはread(byte[])の方法がバッファの配列を空にすることはできなくて、2回目は実際にreadバイトは100個しかなくて、bufの中で前の100バイトの内容だけを交換して、それから6行目のコードappendを通じて文字列の中に着きました最後に得られた文字列がjsonフォーマットではなく、その後のjson解析エラーが発生します.
問題がわかったら、前のコードを下に変更します.バッファ配列の内容を毎回空にしない以上、長さを読み取ることでappend文字列を作成し、問題を解決します.
 1 public String process(InputStream in, String charset) {
 2     byte[] buf = new byte[1024];
 3     StringBuffer sb = new StringBuffer();
 4     int len = 0;
 5     try {
 6         while ((len=in.read(buf)) != -1) {
 7             sb.append(new String(buf, 0, len, charset));
 8         }
 9     } catch (IOException e) {
10         e.printStackTrace();
11     }
12     return sb.toString();
13 }

 
    その後、JDK APIを調べてみると、APIにも説明されていたが、以前は気づかなかったが、キーは黒フォントを加え、b[k]からb[b.length-1]の要素に影響を与えないことにある.
APIを添付:
    public int read(byte[] b) throws IOException    
   , b 。 。
   、 , 。
   b 0, 0; , 。 , -1; , b b[0]b[1] , 。 b 。 k ; b[0] b[k-1]b[k] b[b.length-1] 

 
転載先:https://www.cnblogs.com/lylife/p/5519109.html