Java: chemin vs fichier

Réponses:

153

Longue histoire courte:

java.io.Filene sera probablement jamais déconseillé / non pris en charge. Cela dit, java.nio.file.Pathfait partie de la java.nio.filebibliothèque plus moderne , et fait tout ce qui est java.io.Filepossible, mais généralement d'une meilleure manière, et plus encore.

Pour les nouveaux projets, utilisez Path.

Et si jamais vous avez besoin d'un Fileobjet pour l'héritage, appelez simplement Path # toFile ()

Migration d'un fichier vers un chemin

Cette page Oracle met en évidence les différences et correspond java.io.File functionalityàjava.nio.file lib (including Path) functionality

Article de Janice J. Heiss et Sharon Zakhour, mai 2009, sur le système de fichiers NIO.2 dans JDK 7

Don Cheadle
la source
12
Vous pouvez lire les commentaires d'Oracle sur les différences ici: docs.oracle.com/javase/tutorial/essential/io/legacy.html
Josiah Yoder
4
Notez également que "Fichiers" (au pluriel) n'est pas déconseillé. Il s'agit essentiellement d'une classe abstraite qui fonctionne sur les objets Path et exécute de nombreuses fonctionnalités de l'ancienne classe File, telles que isDirectory () ou exist ()
Josiah Yoder
2
Maintenant, je me demande: pourquoi les nouvelles boîtes de dialogue File / FolderChooser de JavaFX 8 utilisent-elles toujours à la Fileplace de Path?
piegames
2
Le chemin est une interface. Pour créer une instance, utilisez Paths.get (nom de fichier). C'est peut-être à cause de la confusion d'avoir à écrire Files.exists (Paths.get (nom de fichier)) au lieu du nouveau fichier (nom de fichier) .exists () que l'ancienne API est toujours utilisée.
Josiah Yoder
Pathpeut être plus facilement modifié pour "ajouter des enfants" avec resolve(...)ou "monter d'un niveau" avec getParent(), etc. alors Filequ'il ne le peut pas. Essentiellement, une fois que vous avez terminé de modifier le chemin, vous le convertissez souvent toFile()afin qu'il puisse être envoyé dans des méthodes héritées telles qu'un FileInputStreamconstructeur.
MasterHD
18

peut-on le considérer comme obsolète?

Non, vous ne pouvez pas le considérer comme obsolète à moins et jusqu'à ce qu'il soit marqué dans le FileJavadoc.

Marquis de Lorne
la source
14
Même si c'est l'une de ces réponses "parce que la RFC le dit", je ne la considérerais pas comme une bonne réponse. Il est assez évident que File sera remplacé par Path. Si vous voulez être en avance, vous pouvez commencer à utiliser Path immédiatement et utiliser toFile () si nécessaire.
Chris
15
@Chris Rien n'a jamais été supprimé du JDK depuis la modification du modèle d'événement AWT en 1.02. Ce n'est pas du tout «évident». C'est faux.
Marquis de Lorne
5
@downvoters Cette réponse est essentiellement une tautologie. Ça ne peut pas être faux. NB: Au cours des cinq années écoulées depuis que j'ai écrit cette réponse, Java 8 est apparu par la suite, et java.io.Filen'est toujours ni supprimé ni même obsolète, et il n'y a toujours rien dans le Javadoc pour suggérer que l'une de ces choses se produira jamais.
Marquis de Lorne
2
@EJP Je viens de voter pour votre commentaire. Cependant, je ne suis pas tout à fait sûr que vous ayez raison lorsque vous dites que la réponse est une tautologie. La question, qui aurait probablement dû être écartée pour avoir été "fondée sur l'opinion", est "peut-on la considérer comme obsolète". Eh bien, oui, le PO et n'importe qui d'autre peut le faire , mais ce n'est pas le cas.
mike rodent
@mikerodent Je suggère que ce n'est qu'une mauvaise interprétation délibérée de ce qu'est vraiment la question. Aussi une citation partielle.
Marquis de Lorne
8

Consultez cet article pour plus d'informations - http://www.oracle.com/technetwork/articles/javase/nio-139333.html

Fondamentalement, file.Path sera la voie à suivre à partir de maintenant, mais comme tout le monde Java le sait, les gens ont tendance à conserver la rétrocompatibilité, donc je suppose que c'est pourquoi ils l'ont laissée.

LordDoskias
la source
Souhaitez-vous mettre à jour le lien? Je voudrais lire cet article.
John B
Malheureusement, je n'ai pas trouvé l'article original sur la page Web d'Oracle. Voici une version de la machine de retour: web.archive.org/web/20090601091119/http://java.sun.com/…
LordDoskias
1
J'ai trouvé l'article à nouveau sur un côté Oracle normal - lien ajouté pour répondre.
Duncan Jones
5

Je vais compléter la très bonne réponse de @mmcrae.

Y a-t-il une raison d'utiliser un objet java.io.File ou peut-on le considérer comme obsolète?

Les classes JDK sont très rarement obsolètes.
Vous pouvez voir dans la liste des obsolètes de l'API JDK 8 toutes les classes obsolètes depuis le premier JDK.
Il ne contient qu'une petite partie des classes que la documentation Oracle et la communauté Java déconseillent d'utiliser.
java.util.Date, java.util.Vector, java.util.Hashtable... qui sont des classes avec tant de défauts ne sont pas déconseillés.
Mais pourquoi ?
Parce que conceptuellement quelque chose de deprecatedsignifie toujours là mais décourage de l'utiliser car il sera très certainement supprimé.
Des milliers de programmes s'appuient sur ces classes mal conçues.
Pour de telles classes, les développeurs d'API Java ne donneront pas un tel signal.

La réponse @EJPest tellement juste:

Sauf si et jusqu'à ce qu'il soit marqué dans le Javadoc.

Donc, je pense que votre question aurait plus de sens dans ses termes:
"Comme nous avons le choix, devrions-nous utiliser java.io.Fileou java.nio.file.Pathpour de nouveaux développements et si la réponse est java.nio.file.Path, pourriez-vous facilement profiter des java.io.Fileprojets hérités en utilisant java.io.File?"

Je crois qu'un java.nio.file.Path peut faire tout ce qu'un java.io.File peut faire et plus encore.

Vous avez la réponse.

Ce tutoriel Oracle sur les IO hérités confirme votre réflexion.

Avant la version Java SE 7, la java.io.Fileclasse était le mécanisme utilisé pour les E / S de fichiers, mais elle présentait plusieurs inconvénients.

De nombreuses méthodes ne lançaient pas d'exceptions en cas d'échec, il était donc impossible d'obtenir un message d'erreur utile. Par exemple, si une suppression de fichier échouait, le programme recevrait un "échec de suppression" mais ne saurait pas si c'était parce que le fichier n'existait pas, l'utilisateur n'avait pas les autorisations ou il y avait un autre problème.

La méthode de renommage ne fonctionnait pas de manière cohérente sur toutes les plateformes. Il n'y avait pas vraiment de support pour les liens symboliques.

Une meilleure prise en charge des métadonnées était souhaitée, comme les autorisations de fichier, le propriétaire du fichier et d'autres attributs de sécurité.

L'accès aux métadonnées des fichiers était inefficace.

La plupart des méthodes File n'ont pas évolué. La demande d'une grande liste de répertoires sur un serveur peut entraîner un blocage. Les répertoires volumineux peuvent également provoquer des problèmes de ressources mémoire, entraînant un déni de service.

Il n'était pas possible d'écrire du code fiable qui pourrait parcourir récursivement une arborescence de fichiers et répondre de manière appropriée s'il y avait des liens symboliques circulaires.

Avec autant d'inconvénients pour java.io.File, nous n'avons vraiment besoin d'aucune raison d'utiliser cette classe pour de nouveaux développements.
Et même pour l'utilisation de code hérité java.io.File, Oracle donne des conseils à utiliser Path.

Peut-être que vous avez un code hérité qui utilise java.io.File et que vous souhaitez profiter de la fonctionnalité java.nio.file.Path avec un impact minimal sur votre code.

La classe java.io.File fournit la méthode toPath, qui convertit une instance de fichier de style ancien en une instance java.nio.file.Path, comme suit:

Path input = file.toPath();

Vous pouvez ensuite profiter du riche ensemble de fonctionnalités disponibles pour la classe Path.

Par exemple, supposons que vous disposiez d'un code qui a supprimé un fichier:

file.delete();

Vous pouvez modifier ce code pour utiliser la méthode Files.delete, comme suit:

Path fp = file.toPath();
Files.delete(fp);
davidxxx
la source
Bref, elle peut en effet la considérer comme obsolète si elle le souhaite.
Mike Rodent
@mike rongeur. Exactement. Conceptuellement, il / elle devrait le faire alors que ce n'est pas le cas en termes de Javadoc pour des raisons expliquées.
davidxxx
4

Oui, mais de nombreuses API existantes, y compris les propres API standard de Java7, ne fonctionnent toujours qu'avec le Filetype.

irréprochable
la source
8
Les objets Path peuvent être convertis en objets File à l'aide de Path.toFile () , puis utilisez des API standard.
jacktrades
2
Votre réponse est donc «oui mais non»?
Marquis de Lorne
1

Java.io.File n'est pas obsolète. Oui java.nio.file.Path est mieux, mais tant qu'il y a encore beaucoup de programmes et de manuels utilisant Java.io.File, ne serait-ce que pour des raisons héritées, il ne doit pas être considéré comme obsolète, c'est trop important. Cela reviendrait simplement à jeter une clé dans les travaux sans aucun gain. Par exemple, le framework Android utilise File pour certaines de ses fonctionnalités de base de gestion de fichiers, et bien d'autres choses le font.

Andrew S
la source
Il n'a pas demandé si Pathc'était mieux. Il a demandé s'il Fileétait déprécié.
Marquis de Lorne
1
@EJP Je pense que vous êtes un peu trop pédant. Le PO a demandé si java.io.File était obsolète et j'ai répondu que .. Il a également déclaré "Je crois qu'un java.nio.file.Path peut faire tout ce qu'un java.io.File peut faire et plus encore." Je confirmais simplement son commentaire, cela ne valait guère la peine d'être rejeté.
Andrew S
-9

Pour les nouvelles applications écrites en Java 7, y a-t-il une raison d'utiliser un objet java.io.File plus ou peut-on le considérer comme obsolète?

C'est un peu comme dire: "Napoléon doit-il envahir la Russie, ou ces choux de Bruxelles sont-ils vraiment savoureux?"

Quant à la deuxième partie de la question, vous pouvez en effet la considérer comme obsolète. Depuis janvier 2018, il n'est plus obsolète. Mais rien ne vous empêche de le considérer ainsi. Il est impossible de dire si cela vous procurera un avantage dans cette vie ou dans la suivante.

Mike rongeur
la source
5
Je ne comprends pas votre analogie.
Tunaki
Toute question "ou" doit présenter deux alternatives logiques, qui répondent toutes deux essentiellement à la même question.
mike rodent
Désolé, cela semble très pédant dans ce contexte. L'idée est "je veux utiliser File. Dois-je, oui ou non?"
Tunaki
1
Oui, je suis d'accord, c'est une question chargée ... d'autant plus que de nombreuses API tierces existantes utilisent de Filetoute façon. Ça ne va pas mourir de sitôt.
Tunaki
3
it isn't deprecated. But there's nothing to stop you *considering* it soLOL.
Don Cheadle