001 /* 002 * Cobertura - http://cobertura.sourceforge.net/ 003 * 004 * Copyright (C) 2005 Grzegorz Lukasik 005 * Copyright (C) 2006 John Lewis 006 * 007 * Note: This file is dual licensed under the GPL and the Apache 008 * Source License (so that it can be used from both the main 009 * Cobertura classes and the ant tasks). 010 * 011 * Cobertura is free software; you can redistribute it and/or modify 012 * it under the terms of the GNU General Public License as published 013 * by the Free Software Foundation; either version 2 of the License, 014 * or (at your option) any later version. 015 * 016 * Cobertura is distributed in the hope that it will be useful, but 017 * WITHOUT ANY WARRANTY; without even the implied warranty of 018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 019 * General Public License for more details. 020 * 021 * You should have received a copy of the GNU General Public License 022 * along with Cobertura; if not, write to the Free Software 023 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 024 * USA 025 */ 026 027 package net.sourceforge.cobertura.util; 028 029 import java.io.ByteArrayOutputStream; 030 import java.io.File; 031 import java.io.FileInputStream; 032 import java.io.FileNotFoundException; 033 import java.io.FileOutputStream; 034 import java.io.IOException; 035 import java.io.InputStream; 036 import java.io.OutputStream; 037 import java.io.OutputStreamWriter; 038 import java.io.PrintWriter; 039 import java.io.UnsupportedEncodingException; 040 import java.io.Writer; 041 042 /** 043 * Helper class with useful I/O operations. 044 * 045 * @author Grzegorz Lukasik 046 */ 047 public abstract class IOUtil 048 { 049 050 /** 051 * Copies bytes from input stream into the output stream. Stops 052 * when the input stream read method returns -1. Does not close 053 * the streams. 054 * 055 * @throws IOException If either passed stream will throw IOException. 056 * @throws NullPointerException If either passed stream is null. 057 */ 058 public static void copyStream(InputStream in, OutputStream out) 059 throws IOException 060 { 061 // NullPointerException is explicity thrown to guarantee expected behaviour 062 if (in == null || out == null) 063 throw new NullPointerException(); 064 065 int el; 066 byte[] buffer = new byte[1 << 15]; 067 while ((el = in.read(buffer)) != -1) 068 { 069 out.write(buffer, 0, el); 070 } 071 } 072 073 /** 074 * Returns an array that contains values read from the 075 * given input stream. 076 * 077 * @throws NullPointerException If null stream is passed. 078 */ 079 public static byte[] createByteArrayFromInputStream(InputStream in) 080 throws IOException 081 { 082 ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); 083 copyStream(in, byteArray); 084 return byteArray.toByteArray(); 085 } 086 087 /** 088 * Moves a file from one location to other. 089 * 090 * @throws IOException If IO exception occur during moving. 091 * @throws NullPointerException If either passed file is null. 092 */ 093 public static void moveFile(File sourceFile, File destinationFile) 094 throws IOException 095 { 096 if (destinationFile.exists()) 097 { 098 destinationFile.delete(); 099 } 100 101 // Move file using File method if possible 102 boolean succesfulMove = sourceFile.renameTo(destinationFile); 103 if (succesfulMove) 104 return; 105 106 // Copy file from source to destination 107 InputStream in = null; 108 OutputStream out = null; 109 try 110 { 111 in = new FileInputStream(sourceFile); 112 out = new FileOutputStream(destinationFile); 113 copyStream(in, out); 114 } 115 finally 116 { 117 in = closeInputStream(in); 118 out = closeOutputStream(out); 119 } 120 121 // Remove source file 122 sourceFile.delete(); 123 } 124 125 /** 126 * Closes an input stream. 127 * 128 * @param in The stream to close. 129 * @return null unless an exception was thrown while closing, else 130 * returns the stream 131 */ 132 public static InputStream closeInputStream(InputStream in) 133 { 134 if (in != null) 135 { 136 try 137 { 138 in.close(); 139 in = null; 140 } 141 catch (IOException e) 142 { 143 System.err.println("Cobertura: Error closing input stream."); 144 e.printStackTrace(); 145 } 146 } 147 return in; 148 } 149 150 /** 151 * Closes an output stream. 152 * 153 * @param out The stream to close. 154 * @return null unless an exception was thrown while closing, else 155 * returns the stream. 156 */ 157 public static OutputStream closeOutputStream(OutputStream out) 158 { 159 if (out != null) 160 { 161 try 162 { 163 out.close(); 164 out = null; 165 } 166 catch (IOException e) 167 { 168 System.err.println("Cobertura: Error closing output stream."); 169 e.printStackTrace(); 170 } 171 } 172 return out; 173 } 174 175 public static PrintWriter getPrintWriter(File file) throws UnsupportedEncodingException, FileNotFoundException 176 { 177 Writer osWriter = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); 178 PrintWriter pw = new PrintWriter(osWriter, false); 179 return pw; 180 } 181 182 }