196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/* 296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * this work for additional information regarding copyright ownership. 596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (the "License"); you may not use this file except in compliance with 796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the License. You may obtain a copy of the License at 896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and 1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License. 1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage org.apache.commons.io.output; 1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.IOException; 2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.OutputStream; 2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/** 2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * A decorating output stream that counts the number of bytes that have passed 2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * through the stream so far. 2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * A typical use case would be during debugging, to ensure that data is being 2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * written as expected. 2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @version $Id: CountingOutputStream.java 471628 2006-11-06 04:06:45Z bayard $ 3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class CountingOutputStream extends ProxyOutputStream { 3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** The count of bytes that have passed. */ 3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private long count; 3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Constructs a new CountingOutputStream. 3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param out the OutputStream to write to 4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public CountingOutputStream( OutputStream out ) { 4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project super(out); 4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project //----------------------------------------------------------------------- 4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Writes the contents of the specified byte array to this output stream 4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * keeping count of the number of bytes written. 4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param b the bytes to write, not null 5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an I/O error occurs 5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @see java.io.OutputStream#write(byte[]) 5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public void write(byte[] b) throws IOException { 5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project count += b.length; 5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project super.write(b); 5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Writes a portion of the specified byte array to this output stream 6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * keeping count of the number of bytes written. 6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param b the bytes to write, not null 6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param off the start offset in the buffer 6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param len the maximum number of bytes to write 6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an I/O error occurs 6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @see java.io.OutputStream#write(byte[], int, int) 6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public void write(byte[] b, int off, int len) throws IOException { 7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project count += len; 7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project super.write(b, off, len); 7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Writes a single byte to the output stream adding to the count of the 7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * number of bytes written. 7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param b the byte to write 7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an I/O error occurs 8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @see java.io.OutputStream#write(int) 8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public void write(int b) throws IOException { 8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project count++; 8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project super.write(b); 8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project //----------------------------------------------------------------------- 8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The number of bytes that have passed through this stream. 9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * NOTE: From v1.3 this method throws an ArithmeticException if the 9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * count is greater than can be expressed by an <code>int</code>. 9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See {@link #getByteCount()} for a method using a <code>long</code>. 9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the number of bytes accumulated 9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws ArithmeticException if the byte count is too large 9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public synchronized int getCount() { 9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project long result = getByteCount(); 10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (result > Integer.MAX_VALUE) { 10196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new ArithmeticException("The byte count " + result + " is too large to be converted to an int"); 10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return (int) result; 10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Set the byte count back to 0. 10896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 10996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * NOTE: From v1.3 this method throws an ArithmeticException if the 11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * count is greater than can be expressed by an <code>int</code>. 11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See {@link #resetByteCount()} for a method using a <code>long</code>. 11296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 11396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the count previous to resetting 11496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws ArithmeticException if the byte count is too large 11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 11696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public synchronized int resetCount() { 11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project long result = resetByteCount(); 11896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (result > Integer.MAX_VALUE) { 11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new ArithmeticException("The byte count " + result + " is too large to be converted to an int"); 12096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return (int) result; 12296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 12396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 12496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 12596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The number of bytes that have passed through this stream. 12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 12796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * NOTE: This method is an alternative for <code>getCount()</code>. 12896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * It was added because that method returns an integer which will 12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * result in incorrect count for files over 2GB. 13096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 13196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the number of bytes accumulated 13296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @since Commons IO 1.3 13396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 13496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public synchronized long getByteCount() { 13596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return this.count; 13696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 13796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 13896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 13996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Set the byte count back to 0. 14096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 14196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * NOTE: This method is an alternative for <code>resetCount()</code>. 14296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * It was added because that method returns an integer which will 14396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * result in incorrect count for files over 2GB. 14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 14596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the count previous to resetting 14696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @since Commons IO 1.3 14796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 14896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public synchronized long resetByteCount() { 14996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project long tmp = this.count; 15096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project this.count = 0; 15196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return tmp; 15296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 15396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 15496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project} 155