Come complemento alla risposta @assylias':
Se si utilizza Java 7, rilasciare File
del tutto. Quello che vuoi è invece Path
.
e per ottenere un oggetto Path
corrispondenza di un percorso sul filesystem, si fa:
Paths.get("path/to/file"); // argument may also be absolute
abitua in fretta. Si noti che se si utilizzano ancora API che richiedono File
, Path
ha un metodo .toFile()
.
Si noti che se si è nel caso sfortunato in cui si utilizza un'API che restituisce File
oggetti, si può sempre fare:
theFileObject.toPath()
Ma nel codice del vostro, utilizzare Path
. Sistematicamente. Senza pensarci due volte.
EDIT La copia di un file su un altro utilizzando 1.6 utilizzando NIO può essere eseguita come tale; notare che la classe Closer
è inspited da Guava:
public final class Closer
implements Closeable
{
private final List<Closeable> closeables = new ArrayList<Closeable>();
// @Nullable is a JSR 305 annotation
public <T extends Closeable> T add(@Nullable final T closeable)
{
closeables.add(closeable);
return closeable;
}
public void closeQuietly()
{
try {
close();
} catch (IOException ignored) {
}
}
@Override
public void close()
throws IOException
{
IOException toThrow = null;
final List<Closeable> l = new ArrayList<Closeable>(closeables);
Collections.reverse(l);
for (final Closeable closeable: l) {
if (closeable == null)
continue;
try {
closeable.close();
} catch (IOException e) {
if (toThrow == null)
toThrow = e;
}
}
if (toThrow != null)
throw toThrow;
}
}
// Copy one file to another using NIO
public static void doCopy(final File source, final File destination)
throws IOException
{
final Closer closer = new Closer();
final RandomAccessFile src, dst;
final FileChannel in, out;
try {
src = closer.add(new RandomAccessFile(source.getCanonicalFile(), "r");
dst = closer.add(new RandomAccessFile(destination.getCanonicalFile(), "rw");
in = closer.add(src.getChannel());
out = closer.add(dst.getChannel());
in.transferTo(0L, in.size(), out);
out.force(false);
} finally {
closer.close();
}
}
+1 completamente d'accordo - non uso quasi mai più i file. – assylias
Mi chiedo se questo funzionerà quando compilerò il livello di conformità per Java 1.6 come accennato, ma in ogni caso grazie per la nota, lo terrò a mente per il futuro. –
@commander_keen intendi il codice che verrà distribuito per eseguire 1.6 JVM? – fge