Java: percorso vs file


Risposte:


153

Per farla breve:

java.io.Filemolto probabilmente non sarà mai deprecato / non supportato. Detto questo, java.nio.file.Pathfa parte della più moderna java.nio.filelib e fa tutto il java.io.Filepossibile, ma generalmente in un modo migliore, e altro ancora.

Per i nuovi progetti, utilizzare Path.

E se hai mai bisogno di un Fileoggetto per legacy, basta chiamare Path # toFile ()

Migrazione da file a percorso

Questa pagina Oracle evidenzia le differenze e le mappe java.io.File functionalityajava.nio.file lib (including Path) functionality

Articolo di Janice J. Heiss e Sharon Zakhour, maggio 2009, che parla del file system NIO.2 in JDK 7


12
Puoi leggere i commenti di Oracle sulle differenze qui: docs.oracle.com/javase/tutorial/essential/io/legacy.html
Josiah Yoder,

4
Si noti inoltre che "File" (al plurale) non è deprecato. È essenzialmente una classe astratta che opera su oggetti Path ed esegue molte delle caratteristiche della vecchia classe File, come isDirectory () o esiste ()
Josiah Yoder il

2
Ora mi chiedo: perché le nuove finestre di dialogo File / FolderChooser in JavaFX 8 utilizzano ancora Fileinvece Path?
piegames

2
Path è un'interfaccia. Per creare un'istanza, utilizzare Paths.get (nome file). Potrebbe essere a causa della confusione di dover scrivere Files.exists (Paths.get (nomefile)) invece del nuovo File (nomefile) .esistente () che l'API precedente è ancora utilizzata.
Josiah Yoder il

Pathpuò essere modificato più facilmente per "aggiungere bambini" con resolve(...)o "passare di un livello" con getParent(), ecc., mentre Filenon può. In sostanza, una volta terminata la modifica del percorso, lo convertirai spesso in toFile()modo che possa essere inviato in metodi legacy come un FileInputStreamcostruttore.
MasterHD

18

possiamo considerarlo deprecato?

No, non puoi considerarlo deprecato a meno che e fino a quando non è così contrassegnato nelFile Javadoc.


14
Anche se questo è uno di questi "Perché la RFC lo dice" -Risposte, non la considero una buona risposta. È abbastanza ovvio che File verrà sostituito da Path. Se vuoi essere in anticipo, puoi iniziare a usare Path immediatamente e usare toFile () dove necessario.
Chris,

15
@Chris Nulla è mai stato rimosso dal JDK da quando hanno modificato il modello di eventi AWT in 1.02. Non è affatto "ovvio". È sbagliato.
Marchese di Lorne,

5
@downvoters Questa risposta è essenzialmente una tautologia. Non può essere sbagliato. NB Nei cinque anni trascorsi da quando ho scritto questa risposta, Java 8 è apparso successivamente, e non java.io.Fileè ancora né rimosso né addirittura deprecato, e non c'è ancora nulla nel Javadoc che suggerisca che una di queste cose accadrà mai.
Marchese di Lorne,

2
@EJP Ho appena votato quel tuo commento. Tuttavia, non sono del tutto sicuro che tu abbia ragione quando dici che la risposta è una tautologia. La domanda, che probabilmente avrebbe dovuto essere schiacciata per essere "basata sull'opinione", è "possiamo considerarla deprecata". Bene, sì, l'OP e chiunque altro può , ma non lo è.
mike rodent,

@mikerodent Suggerisco che sia solo una lettura intenzionale errata di ciò che la domanda è veramente. Anche una citazione parziale.
Marchese di Lorne,

8

Consulta questo articolo per maggiori informazioni: http://www.oracle.com/technetwork/articles/javase/nio-139333.html

Fondamentalmente file.Path sarà la strada da percorrere da ora in poi, ma come è noto la gente Java tende a mantenere la retrocompatibilità, quindi immagino che sia per questo che l'hanno lasciata.


Per favore, aggiorni il link? Vorrei leggere questo articolo.
John B,

Sfortunatamente non sono riuscito a trovare l'articolo originale nella pagina web di Oracle. Ecco una versione dalla macchina di ritorno: web.archive.org/web/20090601091119/http://java.sun.com/…
LordDoskias il

1
Ho trovato di nuovo l'articolo su un normale lato Oracle - aggiunto il link per rispondere.
Duncan Jones,

5

Completerò l'ottima risposta di @mmcrae.

c'è qualche motivo per usare un oggetto java.io.File o possiamo considerarlo deprecato?

Le classi JDK sono molto raramente deprecate. Nell'elenco dei deprecati dell'API JDK 8
è possibile visualizzare tutte le classi deprecate dal primo JDK. Contiene solo una piccola parte delle classi che la documentazione Oracle e la comunità Java sconsigliano di utilizzare. , , ... che sono classi con tanti difetti non sono deprecati. Ma perché ? Perché concettualmente qualcosa di mezzo è ancora lì, ma scoraggia da usare in quanto sarà sicuramente rimosso. Migliaia di programmi si basano su queste classi mal progettate. Per tali classi, gli sviluppatori dell'API Java non daranno tale segnale.

java.util.Datejava.util.Vectorjava.util.Hashtable

deprecated


La risposta @EJPè davvero giusta:

A meno che e fino a quando non è così segnato nel Javadoc.

Quindi, penso che la tua domanda avrebbe più senso nei suoi termini:
"Come abbiamo la scelta, dovremmo usare java.io.Fileo java.nio.file.Pathper nuovi sviluppi e se la risposta è java.nio.file.Path, potresti facilmente trarre vantaggio dai java.io.Fileprogetti legacy che usano java.io.File?"

Credo che un file java.nio.file.Path possa fare tutto ciò che un file java.io.File può fare e altro ancora.

Hai la risposta

Questo tutorial sull'oracolo dell'IO legacy conferma il tuo pensiero.

Prima della versione Java SE 7, il java.io.File classe era il meccanismo utilizzato per l'I / O dei file, ma presentava numerosi inconvenienti.

Molti metodi non generavano eccezioni quando fallivano, quindi era impossibile ottenere un utile messaggio di errore. Ad esempio, se la cancellazione di un file non è riuscita, il programma riceverà un "errore di eliminazione" ma non saprebbe se era perché il file non esisteva, l'utente non aveva le autorizzazioni o c'era qualche altro problema.

Il metodo di rinomina non ha funzionato in modo coerente su tutte le piattaforme. Non c'era un vero supporto per i collegamenti simbolici.

È stato richiesto un maggiore supporto per i metadati, come autorizzazioni per i file, proprietario del file e altri attributi di sicurezza.

L'accesso ai metadati dei file era inefficiente.

Molti dei metodi File non sono stati ridimensionati. La richiesta di un elenco di directory di grandi dimensioni su un server potrebbe provocare un blocco. Le directory di grandi dimensioni potrebbero anche causare problemi di risorse di memoria, con conseguente negazione del servizio.

Non è stato possibile scrivere un codice affidabile che potesse ricorrere in modo ricorsivo a un albero di file e rispondere in modo appropriato se esistessero collegamenti simbolici circolari.

Con così tanti inconvenienti java.io.File, non abbiamo davvero alcun motivo per usare questa classe per nuovi sviluppi.
E anche per l'utilizzo del codice legacy java.io.File, Oracle fornisce suggerimenti da utilizzare Path.

Forse hai un codice legacy che utilizza java.io.File e vorresti sfruttare la funzionalità java.nio.file.Path con un impatto minimo sul tuo codice.

La classe java.io.File fornisce il metodo toPath, che converte un'istanza di file di vecchio stile in un'istanza java.nio.file.Path, come segue:

Path input = file.toPath();

È quindi possibile sfruttare il ricco set di funzionalità disponibili per la classe Path.

Ad esempio, supponi di avere del codice che ha eliminato un file:

file.delete();

È possibile modificare questo codice per utilizzare il metodo Files.delete, come segue:

Path fp = file.toPath();
Files.delete(fp);

In breve, può davvero considerarlo deprecato se lo desidera.
Mike Rodent,

@mike rodent. Esattamente. Concettualmente dovrebbe farlo mentre non è il caso in termini di Javadoc per ragioni spiegate.
davidxxx,

4

Sì, ma molte API esistenti, incluse le API standard di Java7, funzionano ancora solo con il Filetipo.


8
Gli oggetti Path possono essere convertiti in oggetti File utilizzando Path.toFile () , quindi utilizzare le API standard.
jacktrades

2
Quindi la tua risposta è "sì ma no"?
Marchese di Lorne,

1

Java.io.File non è obsoleto. Sì, java.nio.file.Path è migliore, ma fintanto che ci sono ancora molti programmi e libri di testo che utilizzano Java.io.File, se non altro per motivi legacy, non dovrebbe essere considerato deprecato, è troppo importante. Farlo significherebbe semplicemente lanciare una chiave inglese per non ottenere alcun vantaggio. Ad esempio, il framework Android utilizza File per alcune delle sue funzionalità di base per la gestione dei file, come fanno molte altre cose.


Non ha chiesto se Pathfosse meglio. Ha chiesto se Fileera deprecato.
Marchese di Lorne,

1
@EJP Penso che tu sia un po 'troppo pedante. L'OP ha chiesto se java.io.File era obsoleto e io ho risposto che .. Ha anche affermato "Credo che un java.nio.file.Path possa fare tutto ciò che un java.io.File può fare e altro ancora". Stavo semplicemente confermando il suo commento, non valeva la pena di votare.
Andrew S

-9

Per le nuove applicazioni scritte in Java 7, c'è qualche motivo per usare più un oggetto java.io.File o possiamo considerarlo obsoleto?

È un po 'come dire: "Napoleone dovrebbe invadere la Russia, o questi cavoletti di Bruxelles sono davvero gustosi?"

Per quanto riguarda la seconda parte della domanda, puoi davvero considerarla deprecata. A partire da gennaio 2018, non è obsoleto. Ma non c'è nulla che possa impedirti di considerarlo così. È impossibile dire se ciò ti procurerà qualche vantaggio in questa vita o in quella successiva.


5
Non capisco la tua analogia.
Tunaki

Qualsiasi domanda "o" dovrebbe presentare due alternative logiche, entrambe essenzialmente rispondenti alla stessa domanda.
mike rodent,

Mi dispiace, sembra molto pedante in questo contesto. L'idea è "Voglio usare File. Dovrei, sì o no?"
Tunaki

1
Sì, sono d'accordo, è una domanda carica ... soprattutto dal momento che molte API di terze parti ancora utilizzano Filecomunque. Non morirà presto.
Tunaki

3
it isn't deprecated. But there's nothing to stop you *considering* it soLOL.
Don Cheadle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.