001: /*
002:
003: Derby - Class org.apache.derby.iapi.services.io.CounterOutputStream
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.iapi.services.io;
023:
024: import java.io.OutputStream;
025: import java.io.IOException;
026: import java.io.EOFException;
027:
028: /**
029: An OutputStream that simply provides methods to count the number
030: of bytes written to an underlying stream.
031: */
032:
033: public class CounterOutputStream extends OutputStream implements Limit {
034:
035: protected OutputStream out;
036: private int count;
037: private int limit;
038:
039: /**
040: Create a CounterOutputStream that will discard any bytes
041: written but still coutn them and call its reset method
042: so that the count is intially zero.
043: */
044: public CounterOutputStream() {
045: super ();
046: }
047:
048: public void setOutputStream(OutputStream out) {
049: this .out = out;
050: setLimit(-1);
051: }
052:
053: /**
054: Get count of bytes written to the stream since the last
055: reset() call.
056: */
057: public int getCount() {
058: return count;
059: }
060:
061: /**
062: Set a limit at which an exception will be thrown. This allows callers
063: to count the number of bytes up to some point, without having to complete
064: the count. E.g. a caller may only want to see if some object will write out
065: over 4096 bytes, without waiting for all 200,000 bytes of the object to be written.
066: <BR>
067: If the passed in limit is 0 or negative then the stream will count bytes without
068: throwing an exception.
069:
070: @see EOFException
071: */
072: public void setLimit(int limit) {
073:
074: count = 0;
075:
076: this .limit = limit;
077:
078: return;
079: }
080:
081: public int clearLimit() {
082:
083: int unused = limit - count;
084: limit = 0;
085:
086: return unused;
087: }
088:
089: /*
090: ** Methods of OutputStream
091: */
092:
093: /**
094: Add 1 to the count.
095:
096: @see OutputStream#write
097: */
098: public void write(int b) throws IOException {
099:
100: if ((limit >= 0) && ((count + 1) > limit)) {
101: throw new EOFException();
102: }
103:
104: out.write(b);
105: count++;
106: }
107:
108: /**
109: Add b.length to the count.
110:
111: @see OutputStream#write
112: */
113: public void write(byte b[]) throws IOException {
114:
115: if ((limit >= 0) && ((count + b.length) > limit)) {
116: throw new EOFException();
117: }
118:
119: out.write(b);
120: count += b.length;
121: }
122:
123: /**
124: Add len to the count, discard the data.
125:
126: @see OutputStream#write
127: */
128: public void write(byte b[], int off, int len) throws IOException {
129:
130: if ((limit >= 0) && ((count + len) > limit)) {
131: throw new EOFException();
132: }
133:
134: out.write(b, off, len);
135: count += len;
136: }
137: }
|