CRLFInputStream.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:3k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2.  * CRLFInputStream.java
  3.  * Copyright (C) 1999 dog <dog@dog.net.uk>
  4.  * 
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  * 
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  * 
  19.  * You may retrieve the latest version of this library from
  20.  * http://www.dog.net.uk/knife/
  21.  */
  22. package dog.mail.util;
  23. import java.io.*;
  24. /**
  25.  * An input stream that filters out CR/LF pairs into LFs.
  26.  *
  27.  * @author dog@dog.net.uk
  28.  * @version 1.0
  29.  */
  30. public class CRLFInputStream extends PushbackInputStream {
  31. /**
  32.  * The CR octet.
  33.  */
  34. public static final int CR = 13;
  35. /**
  36.  * The LF octet.
  37.  */
  38. public static final int LF = 10;
  39. /**
  40.  * Constructs a CR/LF input stream connected to the specified input stream.
  41.  */
  42. public CRLFInputStream(InputStream in) {
  43. super(in);
  44. }
  45. /**
  46.  * Constructs a CR/LF input stream connected to the specified input stream, with the specified pushback buffer size.
  47.  */
  48. public CRLFInputStream(InputStream in, int bufsize) {
  49. super(in, bufsize);
  50. }
  51. /**
  52.  * Reads the next byte of data from this input stream.
  53.  * Returns -1 if the end of the stream has been reached.
  54.  * @exception IOException if an I/O error occurs
  55.  */
  56. public int read() throws IOException {
  57. int c = super.read();
  58. if (c==CR) // skip CR
  59. return super.read();
  60. return c;
  61. }
  62. /**
  63.  * Reads up to b.length bytes of data from this input stream into
  64.  * an array of bytes.
  65.  * Returns -1 if the end of the stream has been reached.
  66.  * @exception IOException if an I/O error occurs
  67.  */
  68. public int read(byte[] b) throws IOException {
  69. return read(b, 0, b.length);
  70. }
  71. /**
  72.  * Reads up to len bytes of data from this input stream into an
  73.  * array of bytes, starting at the specified offset.
  74.  * Returns -1 if the end of the stream has been reached.
  75.  * @exception IOException if an I/O error occurs
  76.  */
  77. public int read(byte[] b, int off, int len) throws IOException {
  78. int l = super.read(b, off, len);
  79. return removeCRs(b, off, l);
  80. }
  81. /**
  82.  * Reads a line of input terminated by LF.
  83.  * @exception IOException if an I/O error occurs
  84.  */
  85. public String readLine() throws IOException {
  86. byte[] acc = new byte[4096];
  87. int count = 0;
  88. for (byte b=(byte)read(); b!=LF && b!=-1; b=(byte)read())
  89. acc[count++] = b;
  90. if (count>0) {
  91. byte[] bytes = new byte[count];
  92. System.arraycopy(acc, 0, bytes, 0, count);
  93. return new String(bytes);
  94. } else
  95. return null;
  96. }
  97. int removeCRs(byte[] b, int off, int len) {
  98. for (int index = indexOfCR(b, off, len); index>-1; index = indexOfCR(b, off, len)) {
  99. for (int i=index; i<b.length-1; i++)
  100. b[i] = b[i+1];
  101. len--;
  102. }
  103. return len;
  104. }
  105. int indexOfCR(byte[] b, int off, int len) {
  106. for (int i=off; i<off+len; i++)
  107. if (b[i]==CR) return i;
  108. return -1;
  109. }
  110. }