最先,大家备考一下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只有载入一次的难题便是网编共享给大伙儿的所有內容了,期待能给大伙儿一个参照,也期待大伙儿多多的适用。 |