java中inputstream的有關類的設計模式-the decorator pattern

          java中inputstream的有關類的設計模式-the decorator pattern

          inputstream中比較重要的decorator----BufferedInputStream
          它的構造函數為BufferedInputStream(InputStream in)
          BufferedInputStream(InputStream in, int size)


          可以裝飾繼承了inputsream類的類

          自己完成的新的inputstream
          public class LowerCaseInputStream extends FilterInputStream {
          public LowerCaseInputStream(InputStream in) {
          super(in);
          }
          public int read() throws IOException {
          int c = super.read();
          return (c == -1 ? c : Character.toLowerCase((char)c));
          }
          public int read(byte[] b, int offset, int len) throws IOException {
          int result = super.read(b, offset, len);
          for (int i = offset; i < offset+result; i++) {
          b[i] = (byte)Character.toLowerCase((char)b[i]);
          }
          return result;
          }
          }


          FiterInputStream 便是一種特殊的類,他滿足裝飾器(decorator)的條件,
          1。必須繼承需要decorator的類:InputStream
          2。在此類中必須包含需要decorator的類的實例,這樣的話此類就擁有decorator的類的功能還能擴展其他功能。
          FiterInputStream 的原代碼

          /*
           * @(#)FilterInputStream.java 1.28 03/12/19
           *
           * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
           * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
           */

          package java.io;

          /**
           * A <code>FilterInputStream</code> contains
           * some other input stream, which it uses as
           * its  basic source of data, possibly transforming
           * the data along the way or providing  additional
           * functionality. The class <code>FilterInputStream</code>
           * itself simply overrides all  methods of
           * <code>InputStream</code> with versions that
           * pass all requests to the contained  input
           * stream. Subclasses of <code>FilterInputStream</code>
           * may further override some of  these methods
           * and may also provide additional methods
           * and fields.
           *
           * @author  Jonathan Payne
           * @version 1.28, 12/19/03
           * @since   JDK1.0
           */
          public
          class FilterInputStream extends InputStream {
              /**
               * The input stream to be filtered.
               */
              protected volatile InputStream in;   
          /**
               * Creates a <code>FilterInputStream</code>
               * by assigning the  argument <code>in</code>
               * to the field <code>this.in</code> so as
               * to remember it for later use.
               *
               * @param   in   the underlying input stream, or <code>null</code> if
               *          this instance is to be created without an underlying stream.
               */
              protected FilterInputStream(InputStream in) {
           this.in = in;
              }

              /**
               * Reads the next byte of data from this input stream. The value
               * byte is returned as an <code>int</code> in the range
               * <code>0</code> to <code>255</code>. If no byte is available
               * because the end of the stream has been reached, the value
               * <code>-1</code> is returned. This method blocks until input data
               * is available, the end of the stream is detected, or an exception
               * is thrown.
               * <p>
               * This method
               * simply performs <code>in.read()</code> and returns the result.
               *
               * @return     the next byte of data, or <code>-1</code> if the end of the
               *             stream is reached.
               * @exception  IOException  if an I/O error occurs.
               * @see        java.io.FilterInputStream#in
               */
              public int read() throws IOException {
           return in.read();
              }

              /**
               * Reads up to <code>byte.length</code> bytes of data from this
               * input stream into an array of bytes. This method blocks until some
               * input is available.
               * <p>
               * This method simply performs the call
               * <code>read(b, 0, b.length)</code> and returns
               * the  result. It is important that it does
               * <i>not</i> do <code>in.read(b)</code> instead;
               * certain subclasses of  <code>FilterInputStream</code>
               * depend on the implementation strategy actually
               * used.
               *
               * @param      b   the buffer into which the data is read.
               * @return     the total number of bytes read into the buffer, or
               *             <code>-1</code> if there is no more data because the end of
               *             the stream has been reached.
               * @exception  IOException  if an I/O error occurs.
               * @see        java.io.FilterInputStream#read(byte[], int, int)
               */
              public int read(byte b[]) throws IOException {
           return read(b, 0, b.length);
              }

              /**
               * Reads up to <code>len</code> bytes of data from this input stream
               * into an array of bytes. This method blocks until some input is
               * available.
               * <p>
               * This method simply performs <code>in.read(b, off, len)</code>
               * and returns the result.
               *
               * @param      b     the buffer into which the data is read.
               * @param      off   the start offset of the data.
               * @param      len   the maximum number of bytes read.
               * @return     the total number of bytes read into the buffer, or
               *             <code>-1</code> if there is no more data because the end of
               *             the stream has been reached.
               * @exception  IOException  if an I/O error occurs.
               * @see        java.io.FilterInputStream#in
               */
              public int read(byte b[], int off, int len) throws IOException {
           return in.read(b, off, len);
              }

              /**
               * Skips over and discards <code>n</code> bytes of data from the
               * input stream. The <code>skip</code> method may, for a variety of
               * reasons, end up skipping over some smaller number of bytes,
               * possibly <code>0</code>. The actual number of bytes skipped is
               * returned.
               * <p>
               * This method
               * simply performs <code>in.skip(n)</code>.
               *
               * @param      n   the number of bytes to be skipped.
               * @return     the actual number of bytes skipped.
               * @exception  IOException  if an I/O error occurs.
               */
              public long skip(long n) throws IOException {
           return in.skip(n);
              }

              /**
               * Returns the number of bytes that can be read from this input
               * stream without blocking.
               * <p>
               * This method
               * simply performs <code>in.available()</code> and
               * returns the result.
               *
               * @return     the number of bytes that can be read from the input stream
               *             without blocking.
               * @exception  IOException  if an I/O error occurs.
               * @see        java.io.FilterInputStream#in
               */
              public int available() throws IOException {
           return in.available();
              }

              /**
               * Closes this input stream and releases any system resources
               * associated with the stream.
               * This
               * method simply performs <code>in.close()</code>.
               *
               * @exception  IOException  if an I/O error occurs.
               * @see        java.io.FilterInputStream#in
               */
              public void close() throws IOException {
           in.close();
              }

              /**
               * Marks the current position in this input stream. A subsequent
               * call to the <code>reset</code> method repositions this stream at
               * the last marked position so that subsequent reads re-read the same bytes.
               * <p>
               * The <code>readlimit</code> argument tells this input stream to
               * allow that many bytes to be read before the mark position gets
               * invalidated.
               * <p>
               * This method simply performs <code>in.mark(readlimit)</code>.
               *
               * @param   readlimit   the maximum limit of bytes that can be read before
               *                      the mark position becomes invalid.
               * @see     java.io.FilterInputStream#in
               * @see     java.io.FilterInputStream#reset()
               */
              public synchronized void mark(int readlimit) {
           in.mark(readlimit);
              }

              /**
               * Repositions this stream to the position at the time the
               * <code>mark</code> method was last called on this input stream.
               * <p>
               * This method
               * simply performs <code>in.reset()</code>.
               * <p>
               * Stream marks are intended to be used in
               * situations where you need to read ahead a little to see what's in
               * the stream. Often this is most easily done by invoking some
               * general parser. If the stream is of the type handled by the
               * parse, it just chugs along happily. If the stream is not of
               * that type, the parser should toss an exception when it fails.
               * If this happens within readlimit bytes, it allows the outer
               * code to reset the stream and try another parser.
               *
               * @exception  IOException  if the stream has not been marked or if the
               *               mark has been invalidated.
               * @see        java.io.FilterInputStream#in
               * @see        java.io.FilterInputStream#mark(int)
               */
              public synchronized void reset() throws IOException {
           in.reset();
              }

              /**
               * Tests if this input stream supports the <code>mark</code>
               * and <code>reset</code> methods.
               * This method
               * simply performs <code>in.markSupported()</code>.
               *
               * @return  <code>true</code> if this stream type supports the
               *          <code>mark</code> and <code>reset</code> method;
               *          <code>false</code> otherwise.
               * @see     java.io.FilterInputStream#in
               * @see     java.io.InputStream#mark(int)
               * @see     java.io.InputStream#reset()
               */
              public boolean markSupported() {
           return in.markSupported();
              }
          }

          posted on 2007-09-12 12:02 劉錚 閱讀(797) 評論(0)  編輯  收藏 所屬分類: JAVA General

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          留言簿(1)

          文章分類(141)

          文章檔案(147)

          搜索

          最新評論

          主站蜘蛛池模板: 宜兴市| 江北区| 台安县| 芦溪县| 诸城市| 鄢陵县| 英吉沙县| 扎鲁特旗| 凤台县| 滦平县| 繁峙县| 环江| 茌平县| 丽水市| 财经| 英德市| 利津县| 微博| 龙州县| 永福县| 凉城县| 革吉县| 宿松县| 田阳县| 察雅县| 嘉禾县| 亚东县| 景谷| 林西县| 海安县| 西峡县| 宜州市| 彝良县| 景谷| 日喀则市| 白朗县| 新兴县| 潜山县| 石楼县| 陇南市| 威海市|