1bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 3bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 4bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Licensed under the Apache License, Version 2.0 (the "License"); 5bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * you may not use this file except in compliance with the License. 6bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * You may obtain a copy of the License at 7bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 8bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * http://www.apache.org/licenses/LICENSE-2.0 9bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 10bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Unless required by applicable law or agreed to in writing, software 11bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * distributed under the License is distributed on an "AS IS" BASIS, 12bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * See the License for the specific language governing permissions and 14bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * limitations under the License. 15bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 16bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 17bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorpackage com.google.common.io; 18bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Joiner; 23bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport com.google.common.base.Preconditions; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Splitter; 25bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 26bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.BufferedReader; 27bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.BufferedWriter; 28bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.Closeable; 29bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.File; 30bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.FileInputStream; 31bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.FileNotFoundException; 32bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.FileOutputStream; 33bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.IOException; 34bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.InputStream; 35bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.InputStreamReader; 36bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.OutputStream; 37bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.OutputStreamWriter; 38bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.io.RandomAccessFile; 39bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.nio.MappedByteBuffer; 40bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.nio.channels.FileChannel; 41bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.nio.channels.FileChannel.MapMode; 42bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.nio.charset.Charset; 43bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.security.MessageDigest; 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList; 45bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.List; 46bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.zip.Checksum; 47bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 48bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/** 49bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Provides utility methods for working with files. 50bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 51bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>All method parameters must be non-null unless documented otherwise. 52bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 53bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @author Chris Nokleberg 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 1.0 55bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta 57bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorpublic final class Files { 58bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 59bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** Maximum loop count when creating temp directories. */ 60bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor private static final int TEMP_DIR_ATTEMPTS = 10000; 61bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 62bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor private Files() {} 63bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 64bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 65bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns a buffered reader that reads from a file using the given 66bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * character set. 67bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 68bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read from 69bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 70bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the buffered reader 71bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 72bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static BufferedReader newReader(File file, Charset charset) 73bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws FileNotFoundException { 74bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return new BufferedReader( 75bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor new InputStreamReader(new FileInputStream(file), charset)); 76bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 77bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 78bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 79bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns a buffered writer that writes to a file using the given 80bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * character set. 81bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 82bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to write to 83bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 84bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the buffered writer 85bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 86bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static BufferedWriter newWriter(File file, Charset charset) 87bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws FileNotFoundException { 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new BufferedWriter( 89bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor new OutputStreamWriter(new FileOutputStream(file), charset)); 90bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 91bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 92bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 93bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns a factory that will supply instances of {@link FileInputStream} 94bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * that read from a file. 95bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 96bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read from 97bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the factory 98bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 99bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static InputSupplier<FileInputStream> newInputStreamSupplier( 100bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor final File file) { 101bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Preconditions.checkNotNull(file); 102bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return new InputSupplier<FileInputStream>() { 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 104bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public FileInputStream getInput() throws IOException { 105bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return new FileInputStream(file); 106bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 107bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor }; 108bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 109bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 110bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 111bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns a factory that will supply instances of {@link FileOutputStream} 112bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * that write to a file. 113bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 114bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to write to 115bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the factory 116bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 117bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static OutputSupplier<FileOutputStream> newOutputStreamSupplier( 118bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor File file) { 119bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return newOutputStreamSupplier(file, false); 120bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 121bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 122bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 123bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns a factory that will supply instances of {@link FileOutputStream} 124bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * that write to or append to a file. 125bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 126bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to write to 127bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param append if true, the encoded characters will be appended to the file; 128bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * otherwise the file is overwritten 129bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the factory 130bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 131bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static OutputSupplier<FileOutputStream> newOutputStreamSupplier( 132bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor final File file, final boolean append) { 133bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Preconditions.checkNotNull(file); 134bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return new OutputSupplier<FileOutputStream>() { 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 136bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public FileOutputStream getOutput() throws IOException { 137bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return new FileOutputStream(file, append); 138bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 139bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor }; 140bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 141bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 142bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 143bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns a factory that will supply instances of 144bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@link InputStreamReader} that read a file using the given character set. 145bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 146bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read from 147bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when reading the file 148bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the factory 149bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 150bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static InputSupplier<InputStreamReader> newReaderSupplier(File file, 151bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Charset charset) { 152bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return CharStreams.newReaderSupplier(newInputStreamSupplier(file), charset); 153bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 154bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 155bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 156bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns a factory that will supply instances of {@link OutputStreamWriter} 157bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * that write to a file using the given character set. 158bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 159bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to write to 160bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 161bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the factory 162bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 163bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static OutputSupplier<OutputStreamWriter> newWriterSupplier(File file, 164bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Charset charset) { 165bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return newWriterSupplier(file, charset, false); 166bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 167bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 168bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 169bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns a factory that will supply instances of {@link OutputStreamWriter} 170bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * that write to or append to a file using the given character set. 171bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 172bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to write to 173bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 174bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param append if true, the encoded characters will be appended to the file; 175bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * otherwise the file is overwritten 176bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the factory 177bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 178bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static OutputSupplier<OutputStreamWriter> newWriterSupplier(File file, 179bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Charset charset, boolean append) { 180bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return CharStreams.newWriterSupplier(newOutputStreamSupplier(file, append), 181bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor charset); 182bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 183bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 184bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 185bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Reads all bytes from a file into a byte array. 186bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 187bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read from 188bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return a byte array containing all the bytes from file 189bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IllegalArgumentException if the file is bigger than the largest 190bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * possible byte array (2^31 - 1) 191bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 192bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 193bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static byte[] toByteArray(File file) throws IOException { 194bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Preconditions.checkArgument(file.length() <= Integer.MAX_VALUE); 195bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor if (file.length() == 0) { 196bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor // Some special files are length 0 but have content nonetheless. 197bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return ByteStreams.toByteArray(newInputStreamSupplier(file)); 198bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } else { 199bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor // Avoid an extra allocation and copy. 200bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor byte[] b = new byte[(int) file.length()]; 201bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor boolean threw = true; 202bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor InputStream in = new FileInputStream(file); 203bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor try { 204bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor ByteStreams.readFully(in, b); 205bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor threw = false; 206bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } finally { 207bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Closeables.close(in, threw); 208bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 209bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return b; 210bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 211bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 212bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 213bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 214bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Reads all characters from a file into a {@link String}, using the given 215bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * character set. 216bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 217bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read from 218bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when reading the file 219bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return a string containing all the characters from the file 220bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 221bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 222bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static String toString(File file, Charset charset) throws IOException { 223bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return new String(toByteArray(file), charset.name()); 224bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 225bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 226bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 227bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Copies to a file all bytes from an {@link InputStream} supplied by a 228bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * factory. 229bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 230bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the input factory 231bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the destination file 232bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 233bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 234bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void copy(InputSupplier<? extends InputStream> from, File to) 235bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 236bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor ByteStreams.copy(from, newOutputStreamSupplier(to)); 237bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 238bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 239bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 240bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Overwrites a file with the contents of a byte array. 241bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 242bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the bytes to write 243bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the destination file 244bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 245bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 246bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void write(byte[] from, File to) throws IOException { 247bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor ByteStreams.write(from, newOutputStreamSupplier(to)); 248bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 249bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 250bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 251bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Copies all bytes from a file to an {@link OutputStream} supplied by 252bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * a factory. 253bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 254bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the source file 255bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the output factory 256bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 257bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 258bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void copy(File from, OutputSupplier<? extends OutputStream> to) 259bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 260bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor ByteStreams.copy(newInputStreamSupplier(from), to); 261bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 262bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 263bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 264bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Copies all bytes from a file to an output stream. 265bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 266bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the source file 267bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the output stream 268bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 269bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 270bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void copy(File from, OutputStream to) throws IOException { 271bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor ByteStreams.copy(newInputStreamSupplier(from), to); 272bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 273bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 274bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 275bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Copies all the bytes from one file to another. 276bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor *. 277bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the source file 278bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the destination file 279bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalArgumentException if {@code from.equals(to)} 281bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 282bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void copy(File from, File to) throws IOException { 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Preconditions.checkArgument(!from.equals(to), 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "Source %s and destination %s must be different", from, to); 285bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor copy(newInputStreamSupplier(from), to); 286bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 287bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 288bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 289bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Copies to a file all characters from a {@link Readable} and 290bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@link Closeable} object supplied by a factory, using the given 291bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * character set. 292bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 293bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the readable supplier 294bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the destination file 295bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 296bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 297bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 298bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static <R extends Readable & Closeable> void copy( 299bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor InputSupplier<R> from, File to, Charset charset) throws IOException { 300bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor CharStreams.copy(from, newWriterSupplier(to, charset)); 301bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 302bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 303bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 304bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Writes a character sequence (such as a string) to a file using the given 305bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * character set. 306bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 307bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the character sequence to write 308bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the destination file 309bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 310bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 311bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 312bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void write(CharSequence from, File to, Charset charset) 313bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 314bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor write(from, to, charset, false); 315bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 316bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 317bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 318bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Appends a character sequence (such as a string) to a file using the given 319bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * character set. 320bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 321bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the character sequence to append 322bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the destination file 323bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 324bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 325bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 326bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void append(CharSequence from, File to, Charset charset) 327bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 328bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor write(from, to, charset, true); 329bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 330bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 331bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 332bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Private helper method. Writes a character sequence to a file, 333bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * optionally appending. 334bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 335bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the character sequence to append 336bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the destination file 337bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 338bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param append true to append, false to overwrite 339bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 340bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 341bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor private static void write(CharSequence from, File to, Charset charset, 342bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor boolean append) throws IOException { 343bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor CharStreams.write(from, newWriterSupplier(to, charset, append)); 344bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 345bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 346bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 347bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Copies all characters from a file to a {@link Appendable} & 348bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@link Closeable} object supplied by a factory, using the given 349bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * character set. 350bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 351bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the source file 352bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when reading the file 353bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the appendable supplier 354bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 355bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 356bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static <W extends Appendable & Closeable> void copy(File from, 357bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Charset charset, OutputSupplier<W> to) throws IOException { 358bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor CharStreams.copy(newReaderSupplier(from, charset), to); 359bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 360bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 361bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 362bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Copies all characters from a file to an appendable object, 363bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * using the given character set. 364bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 365bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the source file 366bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when reading the file 367bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the appendable object 368bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 369bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 370bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void copy(File from, Charset charset, Appendable to) 371bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 372bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor CharStreams.copy(newReaderSupplier(from, charset), to); 373bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 374bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 375bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 376bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Returns true if the files contains the same bytes. 377bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 378bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 379bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 380bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static boolean equal(File file1, File file2) throws IOException { 381bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor if (file1 == file2 || file1.equals(file2)) { 382bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return true; 383bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 384bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 385bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /* 386bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Some operating systems may return zero as the length for files 387bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * denoting system-dependent entities such as devices or pipes, in 388bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * which case we must fall back on comparing the bytes directly. 389bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 390bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor long len1 = file1.length(); 391bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor long len2 = file2.length(); 392bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor if (len1 != 0 && len2 != 0 && len1 != len2) { 393bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return false; 394bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 395bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return ByteStreams.equal(newInputStreamSupplier(file1), 396bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor newInputStreamSupplier(file2)); 397bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 398bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 399bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 400bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Atomically creates a new directory somewhere beneath the system's 401bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * temporary directory (as defined by the {@code java.io.tmpdir} system 402bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * property), and returns its name. 403bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 404bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>Use this method instead of {@link File#createTempFile(String, String)} 405bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * when you wish to create a directory, not a regular file. A common pitfall 406bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * is to call {@code createTempFile}, delete the file and create a 407bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * directory in its place, but this leads a race condition which can be 408bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * exploited to create security vulnerabilities, especially when executable 409bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * files are to be written into the directory. 410bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 411bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>This method assumes that the temporary volume is writable, has free 412bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * inodes and free blocks, and that it will not be called thousands of times 413bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * per second. 414bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 415bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the newly-created directory 416bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IllegalStateException if the directory could not be created 417bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 418bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static File createTempDir() { 419bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor File baseDir = new File(System.getProperty("java.io.tmpdir")); 420bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor String baseName = System.currentTimeMillis() + "-"; 421bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 422bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor for (int counter = 0; counter < TEMP_DIR_ATTEMPTS; counter++) { 423bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor File tempDir = new File(baseDir, baseName + counter); 424bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor if (tempDir.mkdir()) { 425bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return tempDir; 426bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 427bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 428bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throw new IllegalStateException("Failed to create directory within " 429bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor + TEMP_DIR_ATTEMPTS + " attempts (tried " 430bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor + baseName + "0 to " + baseName + (TEMP_DIR_ATTEMPTS - 1) + ')'); 431bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 432bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 433bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 434bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Creates an empty file or updates the last updated timestamp on the 435bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * same as the unix command of the same name. 436bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 437bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to create or update 438bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 439bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 440bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void touch(File file) throws IOException { 441bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor if (!file.createNewFile() 442bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor && !file.setLastModified(System.currentTimeMillis())) { 443bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throw new IOException("Unable to update modification time of " + file); 444bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 445bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 446bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 447bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates any necessary but nonexistent parent directories of the specified 4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * file. Note that if this operation fails it may have succeeded in creating 4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * some (but not all) of the necessary parent directories. 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IOException if an I/O error occurs, or if any necessary but 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * nonexistent parent directories of the specified file could not be 4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * created. 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 4.0 4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static void createParentDirs(File file) throws IOException { 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert File parent = file.getCanonicalFile().getParentFile(); 4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (parent == null) { 4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* 4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * The given directory is a filesystem root. All zero of its ancestors 4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * exist. This doesn't mean that the root itself exists -- consider x:\ on 4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a Windows machine without such a drive -- or even that the caller can 4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * create it, but this method makes no such guarantees even for non-root 4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * files. 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert parent.mkdirs(); 4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!parent.isDirectory()) { 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new IOException("Unable to create parent directories of " + file); 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 476bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Moves the file from one path to another. This method can rename a file or 477bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * move it to a different directory, like the Unix {@code mv} command. 478bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 479bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param from the source file 480bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param to the destination file 481bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalArgumentException if {@code from.equals(to)} 483bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 484bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static void move(File from, File to) throws IOException { 485bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Preconditions.checkNotNull(to); 486bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Preconditions.checkArgument(!from.equals(to), 487bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor "Source %s and destination %s must be different", from, to); 488bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 489bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor if (!from.renameTo(to)) { 490bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor copy(from, to); 491bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor if (!from.delete()) { 492bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor if (!to.delete()) { 493bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throw new IOException("Unable to delete " + to); 494bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 495bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throw new IOException("Unable to delete " + from); 496bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 497bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 498bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 499bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 500bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 501bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Reads the first line from a file. The line does not include 502bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * line-termination characters, but does include other leading and 503bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * trailing whitespace. 504bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 505bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read from 506bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 507bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the first line, or null if the file is empty 508bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 509bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 510bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static String readFirstLine(File file, Charset charset) 511bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 512bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return CharStreams.readFirstLine(Files.newReaderSupplier(file, charset)); 513bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 514bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 515bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 516bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Reads all of the lines from a file. The lines do not include 517bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * line-termination characters, but do include other leading and 518bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * trailing whitespace. 519bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 520bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read from 521bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 522bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return a mutable {@link List} containing all the lines 523bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 524bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 525bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static List<String> readLines(File file, Charset charset) 526bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 527bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return CharStreams.readLines(Files.newReaderSupplier(file, charset)); 528bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 529bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 530bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 531bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Streams lines from a {@link File}, stopping when our callback returns 532bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * false, or we have read all of the lines. 533bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 534bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read from 535bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param charset the character set used when writing the file 536bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param callback the {@link LineProcessor} to use to handle the lines 537bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the output of processing the lines 538bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 539bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 540bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static <T> T readLines(File file, Charset charset, 541bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor LineProcessor<T> callback) throws IOException { 542bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return CharStreams.readLines(Files.newReaderSupplier(file, charset), 543bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor callback); 544bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 545bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 546bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 547bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Process the bytes of a file. 548bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 549bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>(If this seems too complicated, maybe you're looking for 550bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@link #toByteArray}.) 551bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 552bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read 553bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param processor the object to which the bytes of the file are passed. 554bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the result of the byte processor 555bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 556bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 557bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static <T> T readBytes(File file, ByteProcessor<T> processor) 558bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 559bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return ByteStreams.readBytes(newInputStreamSupplier(file), processor); 560bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 561bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 562bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 563bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Computes and returns the checksum value for a file. 564bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * The checksum object is reset when this method returns successfully. 565bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 566bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read 567bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param checksum the checksum object 568bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the result of {@link Checksum#getValue} after updating the 569bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * checksum object with all of the bytes in the file 570bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 571bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 572bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static long getChecksum(File file, Checksum checksum) 573bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 574bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return ByteStreams.getChecksum(newInputStreamSupplier(file), checksum); 575bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 576bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 577bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 578bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Computes and returns the digest value for a file. 579bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * The digest object is reset when this method returns successfully. 580bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 581bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to read 582bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param md the digest object 583bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return the result of {@link MessageDigest#digest()} after updating the 584bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * digest object with all of the bytes in this file 585bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 586bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 587bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static byte[] getDigest(File file, MessageDigest md) 588bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 589bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return ByteStreams.getDigest(newInputStreamSupplier(file), md); 590bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 591bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 592bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 593bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Fully maps a file read-only in to memory as per 594bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@link FileChannel#map(java.nio.channels.FileChannel.MapMode, long, long)}. 595bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 596bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>Files are mapped from offset 0 to its length. 597bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 598bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>This only works for files <= {@link Integer#MAX_VALUE} bytes. 599bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 600bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to map 601bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return a read-only buffer reflecting {@code file} 602bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws FileNotFoundException if the {@code file} does not exist 603bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 604bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 605bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @see FileChannel#map(MapMode, long, long) 6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 607bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 608bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static MappedByteBuffer map(File file) throws IOException { 609bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return map(file, MapMode.READ_ONLY); 610bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 611bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 612bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 613bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Fully maps a file in to memory as per 614bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@link FileChannel#map(java.nio.channels.FileChannel.MapMode, long, long)} 615bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * using the requested {@link MapMode}. 616bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 617bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>Files are mapped from offset 0 to its length. 618bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 619bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>This only works for files <= {@link Integer#MAX_VALUE} bytes. 620bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 621bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to map 622bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param mode the mode to use when mapping {@code file} 623bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return a buffer reflecting {@code file} 624bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws FileNotFoundException if the {@code file} does not exist 625bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 626bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 627bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @see FileChannel#map(MapMode, long, long) 6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 629bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 630bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static MappedByteBuffer map(File file, MapMode mode) 631bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws IOException { 632bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor if (!file.exists()) { 633bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throw new FileNotFoundException(file.toString()); 634bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 635bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return map(file, mode, file.length()); 636bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 637bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 638bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 639bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Maps a file in to memory as per 640bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * {@link FileChannel#map(java.nio.channels.FileChannel.MapMode, long, long)} 641bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * using the requested {@link MapMode}. 642bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 643bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>Files are mapped from offset 0 to {@code size}. 644bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 645bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>If the mode is {@link MapMode#READ_WRITE} and the file does not exist, 646bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * it will be created with the requested {@code size}. Thus this method is 647bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * useful for creating memory mapped files which do not yet exist. 648bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 649bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * <p>This only works for files <= {@link Integer#MAX_VALUE} bytes. 650bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 651bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param file the file to map 652bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @param mode the mode to use when mapping {@code file} 653bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @return a buffer reflecting {@code file} 654bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @throws IOException if an I/O error occurs 655bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 656bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @see FileChannel#map(MapMode, long, long) 6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 658bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 659bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public static MappedByteBuffer map(File file, MapMode mode, long size) 660bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws FileNotFoundException, IOException { 661bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor RandomAccessFile raf = 662bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor new RandomAccessFile(file, mode == MapMode.READ_ONLY ? "r" : "rw"); 663bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 664bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor boolean threw = true; 665bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor try { 666bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor MappedByteBuffer mbb = map(raf, mode, size); 667bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor threw = false; 668bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return mbb; 669bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } finally { 670bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Closeables.close(raf, threw); 671bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 672bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 673bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 674bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor private static MappedByteBuffer map(RandomAccessFile raf, MapMode mode, 675bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor long size) throws IOException { 676bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor FileChannel channel = raf.getChannel(); 677bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 678bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor boolean threw = true; 679bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor try { 680bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor MappedByteBuffer mbb = channel.map(mode, 0, size); 681bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor threw = false; 682bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return mbb; 683bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } finally { 684bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor Closeables.close(channel, threw); 685bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 686bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the lexically cleaned form of the path name, <i>usually</i> (but 6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * not always) equivalent to the original. The following heuristics are used: 6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <ul> 6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>empty string becomes . 6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>. stays as . 6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>fold out ./ 6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>fold out ../ when possible 6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>collapse multiple slashes 6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>delete trailing slashes (unless the path is just "/") 6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * </ul> 7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * These heuristics do not always match the behavior of the filesystem. In 7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * particular, consider the path {@code a/../b}, which {@code simplifyPath} 7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * will change to {@code b}. If {@code a} is a symlink to {@code x}, {@code 7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a/../b} may refer to a sibling of {@code x}, rather than the sibling of 7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code a} referred to by {@code b}. 7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static String simplifyPath(String pathname) { 7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (pathname.length() == 0) { 7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "."; 7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // split the path apart 7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterable<String> components = 7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Splitter.on('/').omitEmptyStrings().split(pathname); 7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<String> path = new ArrayList<String>(); 7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // resolve ., .., and // 7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (String component : components) { 7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (component.equals(".")) { 7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert continue; 7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else if (component.equals("..")) { 7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (path.size() > 0 && !path.get(path.size() - 1).equals("..")) { 7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert path.remove(path.size() - 1); 7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert path.add(".."); 7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert path.add(component); 7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // put it back together 7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert String result = Joiner.on('/').join(path); 7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (pathname.charAt(0) == '/') { 7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert result = "/" + result; 7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (result.startsWith("/../")) { 7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert result = result.substring(3); 7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (result.equals("/..")) { 7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert result = "/"; 7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else if ("".equals(result)) { 7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert result = "."; 7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return result; 7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the <a href="http://en.wikipedia.org/wiki/Filename_extension">file 7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * extension</a> for the given file name, or the empty string if the file has 7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * no extension. The result does not include the '{@code .}'. 7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static String getFileExtension(String fileName) { 7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(fileName); 7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int dotIndex = fileName.lastIndexOf('.'); 7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1); 7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 764bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor} 765