web-dev-qa-db-fra.com

Java 7: Chemin ou fichier

Pour les nouvelles applications écrites en Java 7, n’est-il pas justifié d’utiliser un Java.io.File plus d’objets ou peut-on considérer qu’il est obsolète?

Je crois a Java.nio.file.Path peut tout faire a Java.io.File peut faire et plus.

185
dogbane

Longue histoire courte:

Java.io.File Sera probablement jamais obsolète/non supporté. Cela dit, Java.nio.file.Path Fait partie de la plus moderne Java.nio.file Lib et fait tout ce que Java.io.File Peut faire, mais généralement d'une meilleure façon, et plus encore.

Pour les nouveaux projets, utilisez Path.

Et si vous avez besoin d’un objet File pour hériter, appelez simplement Path # toFile ()

Migration du fichier vers le chemin

Cette page Oracle met en évidence les différences et mappe Java.io.File functionality À Java.nio.file lib (including Path) functionality

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

139
Don Cheadle

pouvons-nous considérer qu'il est déconseillé?

Non, vous ne pouvez pas le considérer comme obsolète à moins qu’il ne soit ainsi indiqué dans la File Javadoc.

17
user207421

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

Fondamentalement, file.Path sera le chemin à suivre à partir de maintenant, mais comme il est largement connu Java), les gens ont tendance à garder la compatibilité, donc je suppose que c'est pourquoi ils l'ont laissée.

7
LordDoskias

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

4
irreputable

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 pouvons-nous le considérer comme obsolète?

Les classes JDK sont très rarement obsolètes.
Vous pouvez voir sur le la liste des applications 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 Java communauté découragent d’utiliser.
Java.util.Date, Java.util.Vector, Java.util.Hashtable... qui sont des classes avec autant de défauts ne sont pas obsolètes.
Mais pourquoi ?
Parce que conceptuellement, quelque chose de deprecated signifie toujours là, mais déconseillez-le, car il sera très certainement supprimé.
Des milliers de programmes s'appuient sur ces classes mal conçues.
Pour de telles classes, Java) les développeurs d’API ne donneront pas un tel signal.

Réponse de @EJP a vraiment raison:

Sauf si et jusqu'à ce que cela soit marqué dans la Javadoc.

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

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

Tu as la réponse.

Ce tutoriel Oracle à propos de l'héritage IO confirme votre pensée.

Avant la version Java SE 7, le Java.io.File _ class était le mécanisme utilisé pour les E/S sur fichier, mais il présentait plusieurs inconvénients.

De nombreuses méthodes ne lançaient pas d'exceptions lorsqu'elles échouaient. 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 savait pas si c'était parce que le fichier n'existait pas, si l'utilisateur n'avait pas les autorisations ou s'il existait un autre problème.

La méthode de changement de nom n'a pas fonctionné de manière cohérente sur toutes les plateformes. Il n'y avait pas de réel soutien pour les liens symboliques.

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

L'accès aux métadonnées de fichier était inefficace.

Beaucoup de méthodes File n'ont pas été mises à l'échelle. Demander une liste de répertoires volumineuse sur un serveur peut entraîner un blocage. Les grands annuaires peuvent également causer des problèmes de ressources de mémoire, entraînant un déni de service.

Il n’était pas possible d’écrire un code fiable capable de parcourir récursivement une arborescence de fichiers et de réagir de manière appropriée s’il existait 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 le code hérité utilisant Java.io.File, Oracle donne des astuces pour utiliser Path.

Peut-être avez-vous du code hérité qui utilise Java.io.File et souhaitez-vous tirer parti des fonctionnalités de 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 style ancien File en une instance Java.nio.file.Path, comme suit:

Path input = file.toPath();

Vous pouvez ensuite tirer parti des nombreuses fonctionnalités disponibles dans la classe Path.

Par exemple, supposons que vous ayez du 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);
3
davidxxx

Java.io.File n'est pas obsolète. Oui, Java.nio.file.Path est préférable, mais tant qu'il reste de nombreux programmes et manuels utilisant Java.io.File, ne serait-ce que pour des raisons héritées du passé, il ne devrait pas être considéré comme trop important. Cela ne ferait que lancer une clé pour rien sans aucun gain. Par exemple, le framework Android utilise File pour certaines de ses fonctionnalités de base de gestion des fichiers, entre autres choses.

1
Andrew S