MIME4J-5 Performance patch 3, https://issues.apache.org/jira/browse/MIME4J-5. Contrib...
[mime4j.git] / src / main / java / org / apache / james / mime4j / BufferingInputStreamAdaptor.java
blobd1c9751bf839658c5ab46885680e5dcb39525ec9
1 /****************************************************************
2 * Licensed to the Apache Software Foundation (ASF) under one *
3 * or more contributor license agreements. See the NOTICE file *
4 * distributed with this work for additional information *
5 * regarding copyright ownership. The ASF licenses this file *
6 * to you under the Apache License, Version 2.0 (the *
7 * "License"); you may not use this file except in compliance *
8 * with the License. You may obtain a copy of the License at *
9 * *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, *
13 * software distributed under the License is distributed on an *
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
15 * KIND, either express or implied. See the License for the *
16 * specific language governing permissions and limitations *
17 * under the License. *
18 ****************************************************************/
20 package org.apache.james.mime4j;
22 import java.io.IOException;
23 import java.io.InputStream;
25 /**
26 * <code>InputStream</code> used by the MIME parser to detect whether the
27 * underlying data stream was used (read from) and whether the end of the
28 * stream was reached.
30 * @version $Id$
32 class BufferingInputStreamAdaptor extends BufferingInputStream {
34 private final InputStream is;
35 private final BufferingInputStream bis;
36 private boolean used = false;
37 private boolean eof = false;
39 public BufferingInputStreamAdaptor(final InputStream is) {
40 super();
41 this.is = is;
42 if (is instanceof BufferingInputStream) {
43 this.bis = (BufferingInputStream) is;
44 } else {
45 this.bis = null;
49 public int read() throws IOException {
50 int i = this.is.read();
51 this.eof = i == -1;
52 this.used = true;
53 return i;
56 public int read(byte[] b, int off, int len) throws IOException {
57 int i = this.is.read(b, off, len);
58 this.eof = i == -1;
59 this.used = true;
60 return i;
63 public int readLine(final ByteArrayBuffer dst) throws IOException {
64 int i;
65 if (this.bis != null) {
66 i = this.bis.readLine(dst);
67 } else {
68 i = doReadLine(dst);
70 this.eof = i == -1;
71 this.used = true;
72 return i;
75 private int doReadLine(final ByteArrayBuffer dst) throws IOException {
76 int total = 0;
77 int ch;
78 while ((ch = this.is.read()) != -1) {
79 dst.append(ch);
80 total++;
81 if (ch == '\n') {
82 break;
85 if (total == 0 && ch == -1) {
86 return -1;
87 } else {
88 return total;
92 public boolean eof() {
93 return this.eof;
96 public boolean isUsed() {
97 return this.used;