亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

淺談request.getinputstream只能讀取一次的問題

2020-07-27 21:24:39
字體:
來源:轉載
供稿:網友

首先,我們復習一下InputStream read方法的基礎知識,

java InputStream read方法內部有一個,postion,標志當前流讀取到的位置,每讀取一次,位置就會移動一次,如果讀到最后,InputStream.read方法會返回-1,標志已經讀取完了,如果想再次讀取,可以調用inputstream.reset方法,position就會移動到上次調用mark的位置,mark默認是0,所以就能從頭再讀了。

當然,能否reset是有條件的,它取決于markSupported,markSupported() 方法返回是否可以mark/reset

我們再回頭看request.getInputStream

request.getInputStream返回的值是ServletInputStream,查看ServletInputStream源碼發現,沒有重寫reset方法,所以查看InputStream源碼發現marksupported 返回false,并且reset方法,直接拋出異常。

InputStream.java

 public boolean markSupported() {    return false;  } public synchronized void reset() throws IOException {    throw new IOException("mark/reset not supported");  }

綜上所述,在request.getinputstream讀取一次后position到了文件末尾,第二次就讀取不到數據,由于無法reset(),所以,request.getinputstream只能讀取一次。

總結:

這個問題最根本還是對java IO的read、reset方法的深入理解,尤其是read方法的內部實現原理。

附ServletInputStream.java源碼

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * *   http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package javax.servlet;import java.io.IOException;import java.io.InputStream;/** * Provides an input stream for reading binary data from a client request, * including an efficient <code>readLine</code> method for reading data one line * at a time. With some protocols, such as HTTP POST and PUT, a * <code>ServletInputStream</code> object can be used to read data sent from the * client. * <p> * A <code>ServletInputStream</code> object is normally retrieved via the * {@link ServletRequest#getInputStream} method. * <p> * This is an abstract class that a servlet container implements. Subclasses of * this class must implement the <code>java.io.InputStream.read()</code> method. * * @see ServletRequest */public abstract class ServletInputStream extends InputStream {  /**   * Does nothing, because this is an abstract class.   */  protected ServletInputStream() {    // NOOP  }  /**   * Reads the input stream, one line at a time. Starting at an offset, reads   * bytes into an array, until it reads a certain number of bytes or reaches   * a newline character, which it reads into the array as well.   * <p>   * This method returns -1 if it reaches the end of the input stream before   * reading the maximum number of bytes.   *   * @param b   *      an array of bytes into which data is read   * @param off   *      an integer specifying the character at which this method   *      begins reading   * @param len   *      an integer specifying the maximum number of bytes to read   * @return an integer specifying the actual number of bytes read, or -1 if   *     the end of the stream is reached   * @exception IOException   *        if an input or output exception has occurred   */  public int readLine(byte[] b, int off, int len) throws IOException {    if (len <= 0) {      return 0;    }    int count = 0, c;    while ((c = read()) != -1) {      b[off++] = (byte) c;      count++;      if (c == '/n' || count == len) {        break;      }    }    return count > 0 ? count : -1;  }  /**   * Returns <code>true</code> if all the data has been read from the stream,   * else <code>false</code>.   *   * @since Servlet 3.1   */  public abstract boolean isFinished();  /**   * Returns <code>true</code> if data can be read without blocking, else   * <code>false</code>. If this method is called and returns false, the   * container will invoke {@link ReadListener#onDataAvailable()} when data is   * available.   *   * @since Servlet 3.1   */  public abstract boolean isReady();  /**   * Sets the {@link ReadListener} for this {@link ServletInputStream} and   * thereby switches to non-blocking IO. It is only valid to switch to   * non-blocking IO within async processing or HTTP upgrade processing.   *   * @param listener The non-blocking IO read listener   *   * @throws IllegalStateException  If this method is called if neither   *                 async nor HTTP upgrade is in progress or   *                 if the {@link ReadListener} has already   *                 been set   * @throws NullPointerException   If listener is null   *   * @since Servlet 3.1   */  public abstract void setReadListener(ReadListener listener);}

以上這篇淺談request.getinputstream只能讀取一次的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最新91在线视频| 国产在线播放91| 成人久久精品视频| 欧美在线一级va免费观看| 亚洲免费中文字幕| 欧美丰满老妇厨房牲生活| 欧美老女人xx| 最近2019免费中文字幕视频三| 久久天天躁狠狠躁夜夜躁2014| 亚洲free嫩bbb| 岛国视频午夜一区免费在线观看| 国产精品精品国产| 欧美午夜宅男影院在线观看| 国产精品黄页免费高清在线观看| 国产精品国语对白| 国产精品综合不卡av| 欧美成人全部免费| 欧美一区二粉嫩精品国产一线天| 欧美激情国产日韩精品一区18| 亚洲精品国产精品国自产在线| 国产精品视频网| 成人天堂噜噜噜| 日韩男女性生活视频| 正在播放欧美视频| 国产精品激情av电影在线观看| 日韩在线中文字| 日韩视频永久免费观看| 成人精品福利视频| 精品国产1区2区| 久久久久久久久久久久久久久久久久av| 成人444kkkk在线观看| 国产精品精品视频一区二区三区| 日韩国产激情在线| 91天堂在线观看| 精品国产乱码久久久久酒店| 97免费视频在线| 成人精品网站在线观看| 久久久久久网址| 一区二区三区国产视频| 国产精品久久久久久婷婷天堂| 欧美性xxxx18| 97超级碰碰人国产在线观看| 综合欧美国产视频二区| 欧美成人第一页| 大量国产精品视频| 精品国产31久久久久久| 亚洲国产欧美一区二区三区久久| 欧美超级免费视 在线| 久精品免费视频| 91久久综合亚洲鲁鲁五月天| 欧美最猛性xxxxx亚洲精品| 欧美成人黑人xx视频免费观看| 夜色77av精品影院| 欧美成人黑人xx视频免费观看| 欧美成人一区二区三区电影| 日韩美女毛茸茸| 日韩av在线资源| 2019中文在线观看| 136fldh精品导航福利| 成人国产精品一区| 日韩在线资源网| 成人国产精品av| 成人免费视频xnxx.com| 国产精品福利小视频| 91人人爽人人爽人人精88v| 国产精品亚洲精品| 久久久久国产精品www| 久久综合久久美利坚合众国| 欧美成人三级视频网站| 97在线精品视频| 日韩av影视在线| 韩国三级电影久久久久久| 国产精品扒开腿爽爽爽视频| 奇门遁甲1982国语版免费观看高清| 日韩av电影在线免费播放| 国产精品视频网站| 精品久久久91| 中文字幕亚洲综合久久| 国产精品日韩在线播放| 久久精品国产久精国产思思| 国产精品露脸自拍| 日韩av在线免费看| 精品香蕉在线观看视频一| 51ⅴ精品国产91久久久久久| 欧美另类高清videos| 美女啪啪无遮挡免费久久网站| 蜜臀久久99精品久久久久久宅男| 一本色道久久88精品综合| 精品动漫一区二区三区| 欧美理论电影在线播放| 成人黄色网免费| 中文字幕日韩在线观看| 亚洲尤物视频网| 韩国精品美女www爽爽爽视频| 国产不卡av在线| 色偷偷偷亚洲综合网另类| 日韩在线视频一区| 国产午夜精品免费一区二区三区| 欧美日韩精品二区| 美日韩在线视频| 久久精品久久久久久国产 免费| 热re99久久精品国产66热| 日韩av快播网址| 不卡av电影院| 日韩激情视频在线| 亚洲激情视频网| 国产精品高潮粉嫩av| 91在线|亚洲| www.久久撸.com| 国产日韩中文在线| 国产精品精品视频一区二区三区| 欧美色视频日本高清在线观看| 最新国产成人av网站网址麻豆| 久久99亚洲精品| 欧美床上激情在线观看| 亚洲免费电影在线观看| 久久精品视频免费播放| 亚洲精品乱码久久久久久金桔影视| 精品国产999| 欧美在线视频网站| 91av在线免费观看| 亚洲综合色激情五月| 国产激情久久久| 中文字幕精品久久久久| 亚洲激情中文字幕| 国产精品老女人精品视频| 亚洲免费视频在线观看| 91免费版网站入口| 欧美激情久久久| 97色在线观看| 日韩av电影手机在线| 亚洲综合在线中文字幕| 欧美激情小视频| 九色成人免费视频| 欧美在线视频免费观看| 这里精品视频免费| 中文字幕亚洲欧美日韩2019| 欧美日韩亚洲精品一区二区三区| 国产色视频一区| 精品女同一区二区三区在线播放| 国产mv久久久| 精品国产一区二区三区久久久狼| 亚洲精品视频在线观看视频| 91国偷自产一区二区三区的观看方式| 91高清免费视频| 欧美另类69精品久久久久9999| 精品久久久久久中文字幕大豆网| 亚洲人午夜色婷婷| 国产精品久久久久久久久久尿| 亚洲成年人在线播放| 伊人伊成久久人综合网小说| 成人网在线免费观看| 日本成人激情视频| 国产精品免费久久久久影院| 在线电影av不卡网址| 中文字幕亚洲欧美| 精品久久久香蕉免费精品视频| 国产精品福利网站| 欧美黑人巨大精品一区二区| 亚洲欧美日韩精品| 91精品国产综合久久久久久蜜臀| 久久精品99久久香蕉国产色戒| 不卡av电影在线观看| 性色av一区二区三区在线观看|