All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bluenimble.platform.IOUtils Maven / Gradle / Ivy

There is a newer version: 2.50.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 com.bluenimble.platform;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.DataInputStream;
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.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

@SuppressWarnings("rawtypes")
public class IOUtils {

	/**
	 * The Unix directory separator character.
	 */
	public static final char DIR_SEPARATOR_UNIX = '/';

	/**
	 * The Windows directory separator character.
	 */
	public static final char DIR_SEPARATOR_WINDOWS = '\\';

	/**
	 * The system directory separator character.
	 */
	public static final char DIR_SEPARATOR = File.separatorChar;

	/**
	 * The Unix line separator string.
	 */
	public static final String LINE_SEPARATOR_UNIX = "\n";

	/**
	 * The Windows line separator string.
	 */
	public static final String LINE_SEPARATOR_WINDOWS = "\r\n";

	/**
	 * The system line separator string.
	 */
	public static final String LINE_SEPARATOR;
	
	public static final int EOF = -1;
	
	/**
	 * The default buffer size to use.
	 */
	public static final int DEFAULT_BUFFER_SIZE = 4 * 1024;
	
	public static final int SKIP_BUFFER_SIZE 	= 2 * 1024;

	static {
		// avoid security issues
		StringWriter buf = new StringWriter(4);
		PrintWriter out = new PrintWriter(buf);
		out.println();
		LINE_SEPARATOR = buf.toString();
	}

	public static byte [] charsToBytes (char [] chars) {
		return charsToBytes (chars, null);
	}
	public static byte [] charsToBytes (char [] chars, String charset) {
		if (charset == null) {
			charset = Encodings.UTF8;
		}
		ByteBuffer bb = Charset.forName (charset).encode (CharBuffer.wrap (chars));
		byte[] bytes = new byte [bb.remaining ()];
		bb.get (bytes);
		return bytes;
	}

	public static char[] stringToChars(String value) {
		char[] result = new char[value.length()];
		value.getChars(0, value.length(), result, 0);
		return result;
	}

	public static char[] bytesToChars (byte[] value) {
		return stringToChars (new String (value));
	}

	public static byte[] inputStreamToBytes (InputStream is, long length)
			throws IOException {
		byte bytes[] = new byte[(int) length];
		int cnt = 0;
		DataInputStream in = new DataInputStream(new BufferedInputStream(is));
		while (in.available() != 0) {
			bytes[cnt++] = in.readByte();
		}
		return bytes; 
	}

	public static char[] inputStreamToChars(InputStream is, long length)
			throws IOException {
		char chars[] = new char[(int) length];
		int cnt = 0;
		DataInputStream in = new DataInputStream(new BufferedInputStream(is));
		while (in.available() != 0) {
			chars[cnt++] = in.readChar();
		}
		return chars;
	}

	/**
	 * Unconditionally close an Reader.
	 * 

* Equivalent to {@link Reader#close()}, except any exceptions will be * ignored. This is typically used in finally blocks. * * @param input * the Reader to close, may be null or already closed */ public static void closeQuietly(Reader input) { try { if (input != null) { input.close(); } } catch (IOException ioe) { // ignore } } /** * Unconditionally close a Writer. *

* Equivalent to {@link Writer#close()}, except any exceptions will be * ignored. This is typically used in finally blocks. * * @param output * the Writer to close, may be null or already closed */ public static void closeQuietly(Writer output) { try { if (output != null) { output.close(); } } catch (IOException ioe) { // ignore } } /** * Unconditionally close an InputStream. *

* Equivalent to {@link InputStream#close()}, except any exceptions will be * ignored. This is typically used in finally blocks. * * @param input * the InputStream to close, may be null or already closed */ public static void closeQuietly(InputStream input) { try { if (input != null) { input.close(); } } catch (IOException ioe) { // ignore } } /** * Unconditionally close an OutputStream. *

* Equivalent to {@link OutputStream#close()}, except any exceptions will * be ignored. This is typically used in finally blocks. * * @param output * the OutputStream to close, may be null or already closed */ public static void closeQuietly(OutputStream output) { try { if (output != null) { output.close(); } } catch (IOException ioe) { // ignore } } /** * Unconditionally close an RandomAccessFile. *

* Equivalent to {@link Reader#close()}, except any exceptions will be * ignored. This is typically used in finally blocks. * * @param raf * the Reader to close, may be null or already closed */ public static void closeQuietly (RandomAccessFile raf) { try { if (raf != null) { raf.close (); } } catch (IOException ioe) { // ignore } } // read toByteArray // ----------------------------------------------------------------------- /** * Get the contents of an InputStream as a * byte[]. *

* This method buffers the input internally, so there is no need to use a * BufferedInputStream. * * @param input * the InputStream to read from * @return the requested byte array * @throws NullPointerException * if the input is null * @throws IOException * if an I/O error occurs */ public static byte[] toByteArray(InputStream input) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); copy(input, output); return output.toByteArray(); } public static byte[] toByteArray(Reader input) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); copy(input, output); return output.toByteArray(); } public static byte[] toByteArray(Reader input, String encoding) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); copy(input, output, encoding); return output.toByteArray(); } public static char[] toCharArray(InputStream is) throws IOException { CharArrayWriter output = new CharArrayWriter(); copy(is, output); return output.toCharArray(); } public static char[] toCharArray(InputStream is, String encoding) throws IOException { CharArrayWriter output = new CharArrayWriter(); copy(is, output, encoding); return output.toCharArray(); } public static char[] toCharArray(Reader input) throws IOException { CharArrayWriter sw = new CharArrayWriter(); copy(input, sw); return sw.toCharArray(); } public static String toString (InputStream input) throws IOException { StringWriter sw = new StringWriter (); copy (input, sw); return sw.toString (); } public static String toString(InputStream input, String encoding) throws IOException { StringWriter sw = new StringWriter(); copy(input, sw, encoding); return sw.toString(); } public static String toString(Reader input) throws IOException { StringWriter sw = new StringWriter(); copy(input, sw); return sw.toString(); } public static List readLines(InputStream input) throws IOException { InputStreamReader reader = new InputStreamReader(input); return readLines (reader); } /** * Get the contents of an InputStream as a list of Strings, * one entry per line, using the specified character encoding. *

* Character encoding names can be found at IANA. *

* This method buffers the input internally, so there is no need to use a * BufferedInputStream. * * @param input * the InputStream to read from, not null * @param encoding * the encoding to use, null means platform default * @return the list of Strings, never null * @throws NullPointerException * if the input is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static List readLines(InputStream input, String encoding) throws IOException { if (encoding == null) { return readLines(input); } else { InputStreamReader reader = new InputStreamReader(input, encoding); return readLines(reader); } } /** * Get the contents of a Reader as a list of Strings, one * entry per line. *

* This method buffers the input internally, so there is no need to use a * BufferedReader. * * @param input * the Reader to read from, not null * @return the list of Strings, never null * @throws NullPointerException * if the input is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ @SuppressWarnings("unchecked") public static List readLines (Reader input) throws IOException { BufferedReader reader = new BufferedReader(input); List list = new ArrayList(); String line = reader.readLine(); while (line != null) { list.add (line); line = reader.readLine(); } return list; } public static InputStream toInputStream(String input) { byte[] bytes = input.getBytes(); return new ByteArrayInputStream(bytes); } public static InputStream toInputStream(String input, String encoding) throws IOException { byte[] bytes = encoding != null ? input.getBytes(encoding) : input .getBytes(); return new ByteArrayInputStream(bytes); } public static void write(byte[] data, OutputStream output) throws IOException { if (data != null) { output.write(data); } } public static void write(byte[] data, Writer output) throws IOException { if (data != null) { output.write(new String(data)); } } public static void write(byte[] data, Writer output, String encoding) throws IOException { if (data != null) { if (encoding == null) { write(data, output); } else { output.write(new String(data, encoding)); } } } public static void write(char[] data, Writer output) throws IOException { if (data != null) { output.write(data); } } public static void write(char[] data, OutputStream output) throws IOException { if (data != null) { output.write(new String(data).getBytes()); } } public static void write(char[] data, OutputStream output, String encoding) throws IOException { if (data != null) { if (encoding == null) { write(data, output); } else { output.write(new String(data).getBytes(encoding)); } } } public static void write(String data, Writer output) throws IOException { if (data != null) { output.write(data); } } public static void write(String data, OutputStream output) throws IOException { if (data != null) { output.write(data.getBytes()); } } public static void write(String data, OutputStream output, String encoding) throws IOException { if (data != null) { if (encoding == null) { write(data, output); } else { output.write(data.getBytes(encoding)); } } } public static void write(StringBuilder data, Writer output) throws IOException { if (data != null) { output.write(data.toString()); } } /** * Writes chars from a StringBuilder to bytes on an * OutputStream using the default character encoding of the * platform. *

* This method uses {@link String#getBytes()}. * * @param data * the StringBuilder to write, null ignored * @param output * the OutputStream to write to * @throws NullPointerException * if output is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static void write(StringBuilder data, OutputStream output) throws IOException { if (data != null) { output.write(data.toString().getBytes()); } } /** * Writes chars from a StringBuilder to bytes on an * OutputStream using the specified character encoding. *

* Character encoding names can be found at IANA. *

* This method uses {@link String#getBytes(String)}. * * @param data * the StringBuilder to write, null ignored * @param output * the OutputStream to write to * @param encoding * the encoding to use, null means platform default * @throws NullPointerException * if output is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static void write(StringBuilder data, OutputStream output, String encoding) throws IOException { if (data != null) { if (encoding == null) { write(data, output); } else { output.write(data.toString().getBytes(encoding)); } } } // writeLines // ----------------------------------------------------------------------- /** * Writes the toString() value of each item in a collection * to an OutputStream line by line, using the default * character encoding of the platform and the specified line ending. * * @param lines * the lines to write, null entries produce blank lines * @param lineEnding * the line separator to use, null is system default * @param output * the OutputStream to write to, not null, not * closed * @throws NullPointerException * if the output is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static void writeLines(Collection lines, String lineEnding, OutputStream output) throws IOException { if (lines == null) { return; } if (lineEnding == null) { lineEnding = LINE_SEPARATOR; } for (Iterator it = lines.iterator(); it.hasNext();) { Object line = it.next(); if (line != null) { output.write(line.toString().getBytes()); } output.write(lineEnding.getBytes()); } } /** * Writes the toString() value of each item in a collection * to an OutputStream line by line, using the specified * character encoding and the specified line ending. *

* Character encoding names can be found at IANA. * * @param lines * the lines to write, null entries produce blank lines * @param lineEnding * the line separator to use, null is system default * @param output * the OutputStream to write to, not null, not * closed * @param encoding * the encoding to use, null means platform default * @throws NullPointerException * if the output is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static void writeLines(Collection lines, String lineEnding, OutputStream output, String encoding) throws IOException { if (encoding == null) { writeLines(lines, lineEnding, output); } else { if (lines == null) { return; } if (lineEnding == null) { lineEnding = LINE_SEPARATOR; } for (Iterator it = lines.iterator(); it.hasNext();) { Object line = it.next(); if (line != null) { output.write(line.toString().getBytes(encoding)); } output.write(lineEnding.getBytes(encoding)); } } } /** * Writes the toString() value of each item in a collection * to a Writer line by line, using the specified line ending. * * @param lines * the lines to write, null entries produce blank lines * @param lineEnding * the line separator to use, null is system default * @param writer * the Writer to write to, not null, not closed * @throws NullPointerException * if the input is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static void writeLines(Collection lines, String lineEnding, Writer writer) throws IOException { if (lines == null) { return; } if (lineEnding == null) { lineEnding = LINE_SEPARATOR; } for (Iterator it = lines.iterator(); it.hasNext();) { Object line = it.next(); if (line != null) { writer.write(line.toString()); } writer.write(lineEnding); } } public static long copy (InputStream input, OutputStream output, int bufferSize) throws IOException { byte [] buffer = new byte [bufferSize]; long count = 0; int n; while (EOF != (n = input.read(buffer))) { output.write (buffer, 0, n); count += n; } return count; } public static long copy (InputStream input, OutputStream output) throws IOException { return copy (input, output, DEFAULT_BUFFER_SIZE); } public static int copy (InputStream input, OutputStream output, int offset, int length) throws IOException { if (offset <= 0) { offset = 0; } if (length <= 0) { length = 0; } if (offset > 0) { input.skip (offset); } byte [] buffer = new byte [Math.min (DEFAULT_BUFFER_SIZE, length)]; int count = 0; int n = 0; while (-1 != (n = input.read (buffer))) { output.write (buffer, 0, n); count += n; output.flush (); } return count; } /** * Copy bytes from an InputStream to chars on a * Writer using the default character encoding of the * platform. *

* This method buffers the input internally, so there is no need to use a * BufferedInputStream. *

* This method uses {@link InputStreamReader}. * * @param input * the InputStream to read from * @param output * the Writer to write to * @throws NullPointerException * if the input or output is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static void copy(InputStream input, Writer output) throws IOException { InputStreamReader in = new InputStreamReader(input); copy(in, output); } /** * Copy bytes from an InputStream to chars on a * Writer using the specified character encoding. *

* This method buffers the input internally, so there is no need to use a * BufferedInputStream. *

* Character encoding names can be found at IANA. *

* This method uses {@link InputStreamReader}. * * @param input * the InputStream to read from * @param output * the Writer to write to * @param encoding * the encoding to use, null means platform default * @throws NullPointerException * if the input or output is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static void copy(InputStream input, Writer output, String encoding) throws IOException { if (encoding == null) { copy(input, output); } else { InputStreamReader in = new InputStreamReader(input, encoding); copy(in, output); } } // copy from Reader // ----------------------------------------------------------------------- /** * Copy chars from a Reader to a Writer. *

* This method buffers the input internally, so there is no need to use a * BufferedReader. * * @param input * the Reader to read from * @param output * the Writer to write to * @return the number of characters copied * @throws NullPointerException * if the input or output is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static int copy(Reader input, Writer output) throws IOException { char[] buffer = new char[DEFAULT_BUFFER_SIZE]; int count = 0; int n = 0; while (-1 != (n = input.read(buffer))) { output.write(buffer, 0, n); count += n; output.flush (); } return count; } /** * Copy chars from a Reader to bytes on an * OutputStream using the default character encoding of the * platform, and calling flush. *

* This method buffers the input internally, so there is no need to use a * BufferedReader. *

* Due to the implementation of OutputStreamWriter, this method performs a * flush. *

* This method uses {@link OutputStreamWriter}. * * @param input * the Reader to read from * @param output * the OutputStream to write to * @throws NullPointerException * if the input or output is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static void copy(Reader input, OutputStream output) throws IOException { OutputStreamWriter out = new OutputStreamWriter(output); copy(input, out); // XXX Unless anyone is planning on rewriting OutputStreamWriter, we // have to flush here. out.flush(); } /** * Copy chars from a Reader to bytes on an * OutputStream using the specified character encoding, and * calling flush. *

* This method buffers the input internally, so there is no need to use a * BufferedReader. *

* Character encoding names can be found at IANA. *

* Due to the implementation of OutputStreamWriter, this method performs a * flush. *

* This method uses {@link OutputStreamWriter}. * * @param input * the Reader to read from * @param output * the OutputStream to write to * @param encoding * the encoding to use, null means platform default * @throws NullPointerException * if the input or output is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static void copy(Reader input, OutputStream output, String encoding) throws IOException { if (encoding == null) { copy(input, output); } else { OutputStreamWriter out = new OutputStreamWriter(output, encoding); copy(input, out); // XXX Unless anyone is planning on rewriting OutputStreamWriter, // we have to flush here. out.flush(); } } // content equals // ----------------------------------------------------------------------- /** * Compare the contents of two Streams to determine if they are equal or * not. *

* This method buffers the input internally using * BufferedInputStream if they are not already buffered. * * @param input1 * the first stream * @param input2 * the second stream * @return true if the content of the streams are equal or they both don't * exist, false otherwise * @throws NullPointerException * if either input is null * @throws IOException * if an I/O error occurs */ public static boolean contentEquals(InputStream input1, InputStream input2) throws IOException { if (!(input1 instanceof BufferedInputStream)) { input1 = new BufferedInputStream(input1); } if (!(input2 instanceof BufferedInputStream)) { input2 = new BufferedInputStream(input2); } int ch = input1.read(); while (-1 != ch) { int ch2 = input2.read(); if (ch != ch2) { return false; } ch = input1.read(); } int ch2 = input2.read(); return (ch2 == -1); } /** * Compare the contents of two Readers to determine if they are equal or * not. *

* This method buffers the input internally using * BufferedReader if they are not already buffered. * * @param input1 * the first reader * @param input2 * the second reader * @return true if the content of the readers are equal or they both don't * exist, false otherwise * @throws NullPointerException * if either input is null * @throws IOException * if an I/O error occurs * @since Commons IO 1.1 */ public static boolean contentEquals(Reader input1, Reader input2) throws IOException { if (!(input1 instanceof BufferedReader)) { input1 = new BufferedReader(input1); } if (!(input2 instanceof BufferedReader)) { input2 = new BufferedReader(input2); } int ch = input1.read(); while (-1 != ch) { int ch2 = input2.read(); if (ch != ch2) { return false; } ch = input1.read(); } int ch2 = input2.read(); return (ch2 == -1); } public static long skip (ReadableByteChannel input, long toSkip) throws IOException { if (toSkip < 0) { throw new IllegalArgumentException ("Skip count must be non-negative, actual: " + toSkip); } ByteBuffer skipByteBuffer = ByteBuffer.allocate((int) Math.min(toSkip, SKIP_BUFFER_SIZE)); long remain = toSkip; while (remain > 0) { skipByteBuffer.position (0); skipByteBuffer.limit ((int) Math.min (remain, SKIP_BUFFER_SIZE)); int n = input.read (skipByteBuffer); if (n == EOF) { break; } remain -= n; } return toSkip - remain; } public static void main (String [] args) throws Exception { long start = System.currentTimeMillis (); OutputStream out = null; InputStream in = null; try { in = new FileInputStream (new File ("/Users/lilya/large-file.txt")); out = new FileOutputStream (new File ("/Users/lilya/large-file-copy.txt")); IOUtils.copy (in, out, 32 * 1024); } finally { IOUtils.closeQuietly (in); IOUtils.closeQuietly (out); } System.out.println ("Took " + (System.currentTimeMillis () - start) + " millis"); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy