1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License. 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License. 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.util; 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport java.io.File; 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport java.io.FileInputStream; 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport java.io.IOException; 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/** 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * File I/O utilities. 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic final class FileUtils { 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * This class is uninstantiable. 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private FileUtils() { 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson // This space intentionally left blank. 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Reads the named file, translating {@link IOException} to a 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * {@link RuntimeException} of some sort. 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param fileName {@code non-null;} name of the file to read 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} contents of the file 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static byte[] readFile(String fileName) { 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson File file = new File(fileName); 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return readFile(file); 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Reads the given file, translating {@link IOException} to a 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * {@link RuntimeException} of some sort. 49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param file {@code non-null;} the file to read 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} contents of the file 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static byte[] readFile(File file) { 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (!file.exists()) { 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new RuntimeException(file + ": file not found"); 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (!file.isFile()) { 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new RuntimeException(file + ": not a file"); 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (!file.canRead()) { 63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new RuntimeException(file + ": file not readable"); 64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson long longLength = file.length(); 67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int length = (int) longLength; 68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (length != longLength) { 69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new RuntimeException(file + ": file too long"); 70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson byte[] result = new byte[length]; 73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson try { 75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson FileInputStream in = new FileInputStream(file); 76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int at = 0; 77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson while (length > 0) { 78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int amt = in.read(result, at, length); 79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (amt == -1) { 80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new RuntimeException(file + ": unexpected EOF"); 81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson at += amt; 83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson length -= amt; 84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson in.close(); 86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } catch (IOException ex) { 87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new RuntimeException(file + ": trouble reading", ex); 88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 93579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 94579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Returns true if {@code fileName} names a .zip, .jar, or .apk. 95579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 96579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static boolean hasArchiveSuffix(String fileName) { 97579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return fileName.endsWith(".zip") 98579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson || fileName.endsWith(".jar") 99579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson || fileName.endsWith(".apk"); 100579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 101579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 102