📄 bodycontentimpl.java
字号:
/* * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.jasper.runtime;import java.io.IOException;import java.io.Writer;import java.io.Reader;import java.io.CharArrayReader;import java.io.PrintWriter;import javax.servlet.ServletResponse;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.BodyContent;import org.apache.jasper.Constants;/** * Write text to a character-output stream, buffering characters so as * to provide for the efficient writing of single characters, arrays, * and strings. * * Provide support for discarding for the output that has been buffered. * * @author Rajiv Mordani */public class BodyContentImpl extends BodyContent { private char[] cb; protected int bufferSize = Constants.DEFAULT_BUFFER_SIZE; private int nextChar; static String lineSeparator = System.getProperty("line.separator"); public BodyContentImpl (JspWriter writer) { super(writer); cb = new char[bufferSize]; nextChar = 0; } /** * Write a single character. * */ public void write(int c) throws IOException { synchronized (lock) { if (nextChar >= bufferSize) { reAllocBuff (0); } cb[nextChar++] = (char) c; } } private void reAllocBuff (int len) { //Need to re-allocate the buffer since it is to be //unbounded according to the updated spec.. char[] tmp = new char [bufferSize]; System.arraycopy(cb, 0, tmp, 0, cb.length); //XXX Should it be multiple of DEFAULT_BUFFER_SIZE?? if (len <= Constants.DEFAULT_BUFFER_SIZE) { cb = new char [bufferSize + Constants.DEFAULT_BUFFER_SIZE]; bufferSize += Constants.DEFAULT_BUFFER_SIZE; } else { cb = new char [bufferSize + len]; bufferSize += len; } System.arraycopy(tmp, 0, cb, 0, tmp.length); tmp = null; } /** * Write a portion of an array of characters. * * <p> Ordinarily this method stores characters from the given array into * this stream's buffer, flushing the buffer to the underlying stream as * needed. If the requested length is at least as large as the buffer, * however, then this method will flush the buffer and write the characters * directly to the underlying stream. Thus redundant * <code>DiscardableBufferedWriter</code>s will not copy data unnecessarily. * * @param cbuf A character array * @param off Offset from which to start reading characters * @param len Number of characters to write * */ public void write(char cbuf[], int off, int len) throws IOException { synchronized (lock) { if ((off < 0) || (off > cbuf.length) || (len < 0) || ((off + len) > cbuf.length) || ((off + len) < 0)) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return; } if (len >= bufferSize - nextChar) reAllocBuff (len); System.arraycopy(cbuf, off, cb, nextChar, len); nextChar+=len; } } /** * Write an array of characters. This method cannot be inherited from the * Writer class because it must suppress I/O exceptions. */ public void write(char buf[]) throws IOException { write(buf, 0, buf.length); } /** * Write a portion of a String. * * @param s String to be written * @param off Offset from which to start reading characters * @param len Number of characters to be written * */ public void write(String s, int off, int len) throws IOException { synchronized (lock) { if (len >= bufferSize - nextChar) reAllocBuff(len); s.getChars(off, off + len, cb, nextChar); nextChar += len; } } /** * Write a string. This method cannot be inherited from the Writer class * because it must suppress I/O exceptions. */ public void write(String s) throws IOException { write(s, 0, s.length()); } /** * Write a line separator. The line separator string is defined by the * system property <tt>line.separator</tt>, and is not necessarily a single * newline ('\n') character. * * @exception IOException If an I/O error occurs */ public void newLine() throws IOException { synchronized (lock) { write(lineSeparator); } } /** * Print a boolean value. The string produced by <code>{@link * java.lang.String#valueOf(boolean)}</code> is translated into bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the <code>{@link * #write(int)}</code> method. * * @param b The <code>boolean</code> to be printed * @throws java.io.IOException */ public void print(boolean b) throws IOException { write(b ? "true" : "false"); } /** * Print a character. The character is translated into one or more bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the <code>{@link * #write(int)}</code> method. * * @param c The <code>char</code> to be printed * @throws java.io.IOException */ public void print(char c) throws IOException { write(String.valueOf(c)); } /** * Print an integer. The string produced by <code>{@link * java.lang.String#valueOf(int)}</code> is translated into bytes according * to the platform's default character encoding, and these bytes are * written in exactly the manner of the <code>{@link #write(int)}</code> * method. * * @param i The <code>int</code> to be printed * @see java.lang.Integer#toString(int) * @throws java.io.IOException */ public void print(int i) throws IOException { write(String.valueOf(i)); } /** * Print a long integer. The string produced by <code>{@link * java.lang.String#valueOf(long)}</code> is translated into bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the <code>{@link #write(int)}</code> * method. * * @param l The <code>long</code> to be printed * @see java.lang.Long#toString(long) * @throws java.io.IOException */ public void print(long l) throws IOException { write(String.valueOf(l)); } /** * Print a floating-point number. The string produced by <code>{@link * java.lang.String#valueOf(float)}</code> is translated into bytes * according to the platform's default character encoding, and these bytes * are written in exactly the manner of the <code>{@link #write(int)}</code> * method. * * @param f The <code>float</code> to be printed * @see java.lang.Float#toString(float) * @throws java.io.IOException */ public void print(float f) throws IOException { write(String.valueOf(f)); } /** * Print a double-precision floating-point number. The string produced by * <code>{@link java.lang.String#valueOf(double)}</code> is translated into * bytes according to the platform's default character encoding, and these * bytes are written in exactly the manner of the <code>{@link * #write(int)}</code> method. * * @param d The <code>double</code> to be printed * @see java.lang.Double#toString(double)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -