2008-11-12 9 views
29

J'ai un fichier (appelé "number.txt") que je veux lire dans un tableau en Java. Comment puis-je aller de l'avant et faire cela? C'est un fichier "unidimensionnel" simple, contenant 100 nombres.Java: Lecture d'un fichier dans un tableau

Le problème est que j'obtiens une exception à chaque fois. Apparemment, il ne peut pas le trouver (je suis sûr que c'est orthographié correctement). Lorsque vous parcourez des exemples de code, il ne spécifie pas le chemin complet du fichier, mais seulement le nom du fichier lui-même. Comment pourrais-je faire cela si c'est nécessaire?

Egalement, lors de la lecture du fichier, le tableau contiendra-t-il automatiquement toutes les lignes du fichier, ou devrais-je faire une boucle qui copie chaque ligne dans l'indice correspondant i?

J'ai entendu parler de la classe BufferedReader, de son but, et de la manière dont elle corelate à la lecture des entrées.

Répondre

63

Voici quelques exemples de code pour vous aider à démarrer:

package com.acme; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

public class FileArrayProvider { 

    public String[] readLines(String filename) throws IOException { 
     FileReader fileReader = new FileReader(filename); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     List<String> lines = new ArrayList<String>(); 
     String line = null; 
     while ((line = bufferedReader.readLine()) != null) { 
      lines.add(line); 
     } 
     bufferedReader.close(); 
     return lines.toArray(new String[lines.size()]); 
    } 
} 

et une unité d'essai exemple:

package com.acme; 

import java.io.IOException; 

import org.junit.Test; 

public class FileArrayProviderTest { 

    @Test 
    public void testFileArrayProvider() throws IOException { 
     FileArrayProvider fap = new FileArrayProvider(); 
     String[] lines = fap 
       .readLines("src/main/java/com/acme/FileArrayProvider.java"); 
     for (String line : lines) { 
      System.out.println(line); 
     } 
    } 
} 

Hope this helps.

+17

retour à reddit avec vous! – toolkit

+2

Le 'bufferedReader.close()' ne devrait-il pas être enveloppé dans un bloc 'try {} finally {}'? – LukeGT

+0

@ LukeGT- Oui, il devrait pour le code de production. Ces méthodes d'exemple lèvent simplement une exception. – toolkit

0

Vous devriez pouvoir utiliser les barres obliques en Java pour faire référence aux emplacements de fichiers.

La classe BufferedReader est utilisée pour l'encapsulation d'autres lecteurs de fichiers dont la méthode de lecture peut ne pas être très efficace. Une description plus détaillée peut être trouvée dans le Java APIs.

L'utilisation de BufferedReader par Toolkit est probablement ce dont vous avez besoin.

3

Apache Commons I/O fournit FileUtils # readLines(), ce qui devrait convenir à tous les gros fichiers: http://commons.apache.org/io/api-release/index.html. La distribution 2.1 inclut FileUtils.lineIterator(), qui serait approprié pour les fichiers volumineux. Les bibliothèques Guava de Google incluent des utilitaires similaires.

32
import java.io.File; 

import java.nio.charset.Charset; 
import java.nio.file.Files; 
import java.nio.file.Path; 

import java.util.List; 

// ... 

Path filePath = new File("fileName").toPath(); 
Charset charset = Charset.defaultCharset();   
List<String> stringList = Files.readAllLines(filePath, charset); 
String[] stringArray = stringList.toArray(new String[]{}); 
+0

@Northener déjà mentionné qu'ils ont vu des exemples. Cette réponse ne répond à aucune des questions qu'ils ont posées. – allingeek

+3

Ceci est pour JAVA 7+ –

+3

En Java 8, vous pouvez simplement appeler 'Files.readAllLines (filePath)', ce qui équivaut à passer 'standardCharsets.UTF_8' comme charset. – emlai

Questions connexes