org.mortbay.util.IO Maven / Gradle / Ivy
// ========================================================================
// Copyright 2004-2005 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================
package org.mortbay.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.io.StringWriter;
import java.io.InputStreamReader;
import org.mortbay.log.Log;
import org.mortbay.thread.BoundedThreadPool;
/* ======================================================================== */
/** IO Utilities.
* Provides stream handling utilities in
* singleton Threadpool implementation accessed by static members.
*/
public class IO extends BoundedThreadPool
{
/* ------------------------------------------------------------------- */
public final static String
CRLF = "\015\012";
/* ------------------------------------------------------------------- */
public final static byte[]
CRLF_BYTES = {(byte)'\015',(byte)'\012'};
/* ------------------------------------------------------------------- */
public static int bufferSize = 2*8192;
/* ------------------------------------------------------------------- */
// TODO get rid of this singleton!
private static class Singleton {
static final IO __instance=new IO();
static
{
try{__instance.start();}
catch(Exception e){Log.warn(e); System.exit(1);}
}
}
/* ------------------------------------------------------------------- */
public static IO instance()
{
return Singleton.__instance;
}
/* ------------------------------------------------------------------- */
static class Job implements Runnable
{
InputStream in;
OutputStream out;
Reader read;
Writer write;
Job(InputStream in,OutputStream out)
{
this.in=in;
this.out=out;
this.read=null;
this.write=null;
}
Job(Reader read,Writer write)
{
this.in=null;
this.out=null;
this.read=read;
this.write=write;
}
/* ------------------------------------------------------------ */
/*
* @see java.lang.Runnable#run()
*/
public void run()
{
try {
if (in!=null)
copy(in,out,-1);
else
copy(read,write,-1);
}
catch(IOException e)
{
Log.ignore(e);
try{
if (out!=null)
out.close();
if (write!=null)
write.close();
}
catch(IOException e2)
{
Log.ignore(e2);
}
}
}
}
/* ------------------------------------------------------------------- */
/** Copy Stream in to Stream out until EOF or exception.
* in own thread
*/
public static void copyThread(InputStream in, OutputStream out)
{
try{
Job job=new Job(in,out);
if (!instance().dispatch(job))
job.run();
}
catch(Exception e)
{
Log.warn(e);
}
}
/* ------------------------------------------------------------------- */
/** Copy Stream in to Stream out until EOF or exception.
*/
public static void copy(InputStream in, OutputStream out)
throws IOException
{
copy(in,out,-1);
}
/* ------------------------------------------------------------------- */
/** Copy Stream in to Stream out until EOF or exception
* in own thread
*/
public static void copyThread(Reader in, Writer out)
{
try
{
Job job=new Job(in,out);
if (!instance().dispatch(job))
job.run();
}
catch(Exception e)
{
Log.warn(e);
}
}
/* ------------------------------------------------------------------- */
/** Copy Reader to Writer out until EOF or exception.
*/
public static void copy(Reader in, Writer out)
throws IOException
{
copy(in,out,-1);
}
/* ------------------------------------------------------------------- */
/** Copy Stream in to Stream for byteCount bytes or until EOF or exception.
*/
public static void copy(InputStream in,
OutputStream out,
long byteCount)
throws IOException
{
byte buffer[] = new byte[bufferSize];
int len=bufferSize;
if (byteCount>=0)
{
while (byteCount>0)
{
if (byteCount=0)
{
while (byteCount>0)
{
if (byteCount