探讨request.getinputstream只有载入一次的难题

2021-02-14 01:21| 发布者: | 查看: |

最先,大家备考一下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 rmation 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 pliance with
 * the License. You may obtain a copy of the License at
 * 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只有载入一次的难题便是网编共享给大伙儿的所有內容了,期待能给大伙儿一个参照,也期待大伙儿多多的适用。

<
>

 
QQ在线咨询
售前咨询热线
18720358503
售后服务热线
18720358503
返回顶部