2016-03-25 11 views
3

Die Oracle-Dokumentation sagt here, dass die Files.readAllLines(Path path, Charset cs) Methode die Zeilen aus einer Datei als List<String> zurückgibt.
Was wird es zurückgeben, wenn die Datei nicht existiert? Auch welche Implementierung von List<String> wird es zurückgeben?Was wird readAllLines zurückgeben, wenn die Datei nicht existiert?

+0

'IOException', wahrscheinlich, und der 'List ' -Typ ist _deliberately_ unspezifiziert und kann geändert werden. (Ich würde allerdings auf einen 'unmodiableList'-Wrapper um eine 'ArrayList' setzen.) –

+1

@LouisWasserman: Also kann ich nicht sicher sein, ob' List.get() 'O (n) oder O (1) ist für die zurückgegebene 'List'? – In78

+0

@ ln78 Ich würde mir darüber keine Sorgen machen; Sie sollten sich ziemlich wohl fühlen, vorausgesetzt, es ist O (1), nur nicht, ob es veränderbar ist oder nicht. –

Antwort

2

Was wird es zurück, wenn die Datei nicht existiert?

Es wird nichts zurückgeben. Wie die JavaDoc sagt es, die readAllLines Methode wird eine IOException im Falle von E/A-Fehler werfen.

Insbesondere, wenn die Datei nicht existiert, wirft die Implementierung von JDK 8, die ich verwende, eine java.nio.file.NoSuchFileException, die eine Unterklasse von IOException ist.

Auch welche Implementierung von List<String> wird es zurückgeben?

Das ist wirklich nicht deine Sorge. Deshalb gibt es Interfaces und Encapsulation, also schaut man nicht hinein. Die wichtige Sache ist, dass es ein Objekt ist, das den Vertrag der List Schnittstelle respektiert.

Wenn Sie es wissen müssen, können Sie dies überprüfen, indem Sie das zurückgegebene Objekt .getClass() aufrufen. Die Implementierung von JDK 8, die ich verwende, gibt java.util.ArrayList zurück. Eine andere Implementierung könnte etwas anderes zurückgeben. Wie ich bereits erwähnt habe, sollten wir nicht einmal versuchen zu sehen, was es ist, um jedes Risiko zu vermeiden, die Kapsel zu brechen.

3

Hier sind die geworfenen Ausnahmen von Files#readAllLines(Path, Charset)

es tatsächlich eine Try-mit-Ressourcen verwendet ein BufferedReader mit den path als Parameter der Instanziierung. Wenn die Datei nicht existiert, wird innerhalb des Konstruktors ein IOException geworfen.

Würfe:

java.io.IOExceptionwenn ein I/O-Fehler tritt aus der Datei zu lesen oder einem fehlerhaft oder nicht zuzuordnenden Bytefolge

java.lang.SecurityException Im Falle des Standardanbieter gelesen wird, und ein Sicherheitsmanager installiert ist, wird die checkRead-Methode aufgerufen überprüfen Lesezugriff auf die Datei.


Ein ArrayList<String> ist als die exakte Umsetzung der List<String>

public static List<String> readAllLines(Path path, Charset cs) throws IOException { 
    try (BufferedReader reader = newBufferedReader(path, cs)) { 
     List<String> result = new ArrayList<>();   <-------- HERE 
     for (;;) { 
      String line = reader.readLine(); 
      if (line == null) 
       break; 
      result.add(line); 
     } 
     return result; 
    } 
} 
0

Onward Java7 verwendet: Es NoSuchFileException, wenn die Datei nicht existiert werfen.

können Sie mehr studieren: FileNotFoundException vs. NoSuchFileException

+0

Eigentlich nein, nicht in jedem aktuellen jvm, es wird eine java.nio.file.NoSuchFileException –

+0

werfen Sie könnten JDK7 oder JDK8 verwenden. – CrawlingKid

+0

Nun Ihre Antwort zunächst einfach nur FileNotFoundException angegeben und ich antwortete mit nicht in jedem aktuellen jvm. Sogar 7 ist offiziell Ende des Lebens. –

2

Einfach genug zum Testen?

Exception in thread "main" java.nio.file.NoSuchFileException 

Wie der tatsächliche Typ des Rückgabewerts. Die Rückkehrunterschrift sagt nur List und das ist alles, was Sie vertrauen können. Having said, dass die aktuellen Oracle-Klassenbibliotheken Arraylist zurück:

List<String> readAllLines = Files.readAllLines(path, Charset.defaultCharset()); 
System.out.println(readAllLines.getClass()); 

Gibt die Ausgabe:

class java.util.ArrayList 

, die in der Quelle von zu sehen ist:

List<String> result = new ArrayList<>(); 
Verwandte Themen