Copier le fichier en Java et remplacer la cible existante
j'essaie de copier un fichier avec java.nio.fichier.Les fichiers comme ceci:
Files.copy(cfgFilePath, strTarget, StandardCopyOption.REPLACE_EXISTING);
le problème est que Eclipse dit " la méthode copie (Path, Path, CopyOption...) dans les fichiers de type N'est pas applicable pour les arguments (File, String, StandardCopyOption)"
<!-J'utilise Eclipse et Java 7 sur Win7 x64. Mon projet est configuré pour utiliser la compatibilité Java 1.6.Est-il une solution ou dois-je créer quelque chose comme cela comme une solution de contournement:
File temp = new File(target);
if(temp.exists())
temp.delete();
Merci.
3 réponses
en complément de la réponse de @assylias:
si vous utilisez Java 7, drop File
tout à fait. Ce que vous voulez, c'est Path
à la place.
Et pour obtenir un Path
objet correspondant à un chemin d'accès sur votre système de fichiers, vous faire:
Paths.get("path/to/file"); // argument may also be absolute
habituer très vite. Notez que si vous utilisez toujours APIs qui require File
,Path
a un .toFile()
méthode.
Notez que si vous êtes dans le cas malheureux où vous utilisez une API qui renvoie File
objets, vous pouvez toujours faire:
theFileObject.toPath()
mais dans votre code, utilisez Path
. Systématiquement. Sans une seconde pensée.
EDIT copier un fichier vers un autre en utilisant 1.6 en utilisant NIO peut être fait comme tel; notez que le Closer
classe est inspited par Goyave:
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();
}
}
Vous avez besoin de passer Path
arguments comme expliqué par le message d'erreur:
Path from = cfgFilePath.toPath(); //convert from File to Path
Path to = Paths.get(strTarget); //convert from String to Path
Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING);
Cela suppose que votre strTarget
est un chemin d'accès valide.