org.eclipse.jetty.util.IO Maven / Gradle / Ivy
//
// ========================================================================
// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.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.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.GatheringByteChannel;
import java.nio.charset.Charset;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
/* ======================================================================== */
/** IO Utilities.
* Provides stream handling utilities in
* singleton Threadpool implementation accessed by static members.
*/
public class IO
{
private static final Logger LOG = Log.getLogger(IO.class);
/* ------------------------------------------------------------------- */
public final static String
CRLF = "\015\012";
/* ------------------------------------------------------------------- */
public final static byte[]
CRLF_BYTES = {(byte)'\015',(byte)'\012'};
/* ------------------------------------------------------------------- */
public static final int bufferSize = 64*1024;
/* ------------------------------------------------------------------- */
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.
*/
public static void copy(InputStream in, OutputStream out)
throws IOException
{
copy(in,out,-1);
}
/* ------------------------------------------------------------------- */
/** 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)
{
int max = byteCount=0)
{
while (byteCount>0)
{
if (byteCountThis method wraps a gather write with a loop that handles the limitations of some operating systems that
* have a limit on the number of buffers written. The method loops on the write until either all the content
* is written or no progress is made.
* @param out The GatheringgByteChannel to write to
* @param buffers The buffers to write
* @param offset The offset into the buffers array
* @param length The length in buffers to write
* @return The total bytes written
* @throws IOException
*/
public static long write(GatheringByteChannel out, ByteBuffer[] buffers, int offset, int length) throws IOException
{
long total=0;
write: while (length>0)
{
// Write as much as we can
long wrote=out.write(buffers,offset,length);
// If we can't write any more, give up
if (wrote==0)
break;
// count the total
total+=wrote;
// Look for unwritten content
for (int i=offset;i