001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel.util; 018 019 import java.io.IOException; 020 import java.io.InputStream; 021 import java.io.OutputStream; 022 import java.io.UnsupportedEncodingException; 023 import java.nio.charset.Charset; 024 025 /** 026 * IO helper class. 027 * 028 * @version $Revision: 752756 $ 029 */ 030 public final class IOHelper { 031 032 private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; 033 private static final Charset UTF8_CHARSET = Charset.forName("utf-8"); 034 035 private IOHelper() { 036 //Utility Class 037 } 038 039 /** 040 * Use this function instead of new String(byte[]) to avoid surprises from non-standard default encodings. 041 * @param bytes 042 * @return 043 */ 044 public static String newStringFromBytes(byte[] bytes) { 045 try { 046 return new String(bytes, UTF8_CHARSET.name()); 047 } catch (UnsupportedEncodingException e) { 048 throw 049 new RuntimeException("Impossible failure: Charset.forName(\"utf-8\") returns invalid name."); 050 051 } 052 } 053 054 /** 055 * Use this function instead of new String(byte[], int, int) 056 * to avoid surprises from non-standard default encodings. 057 * @param bytes 058 * @param start 059 * @param length 060 * @return 061 */ 062 public static String newStringFromBytes(byte[] bytes, int start, int length) { 063 try { 064 return new String(bytes, start, length, UTF8_CHARSET.name()); 065 } catch (UnsupportedEncodingException e) { 066 throw 067 new RuntimeException("Impossible failure: Charset.forName(\"utf-8\") returns invalid name."); 068 069 } 070 } 071 072 /** 073 * A factory method which creates an {@link IOException} from the given 074 * exception and message 075 */ 076 public static IOException createIOException(Throwable cause) { 077 return createIOException(cause.getMessage(), cause); 078 } 079 080 /** 081 * A factory method which creates an {@link IOException} from the given 082 * exception and message 083 */ 084 public static IOException createIOException(String message, Throwable cause) { 085 IOException answer = new IOException(message); 086 answer.initCause(cause); 087 return answer; 088 } 089 090 public static int copy(InputStream input, OutputStream output) throws IOException { 091 return copy(input, output, DEFAULT_BUFFER_SIZE); 092 } 093 094 public static int copy(final InputStream input, final OutputStream output, int bufferSize) 095 throws IOException { 096 int avail = input.available(); 097 if (avail > 262144) { 098 avail = 262144; 099 } 100 if (avail > bufferSize) { 101 bufferSize = avail; 102 } 103 final byte[] buffer = new byte[bufferSize]; 104 int n = 0; 105 n = input.read(buffer); 106 int total = 0; 107 while (-1 != n) { 108 output.write(buffer, 0, n); 109 total += n; 110 n = input.read(buffer); 111 } 112 output.flush(); 113 return total; 114 } 115 116 public static void copyAndCloseInput(InputStream input, OutputStream output) throws IOException { 117 copy(input, output); 118 input.close(); 119 } 120 121 public static void copyAndCloseInput(InputStream input, OutputStream output, int bufferSize) throws IOException { 122 copy(input, output, bufferSize); 123 } 124 125 }