2008-11-12 16 views
29

Tengo un archivo (llamado "number.txt") que quiero leer en una matriz en Java. ¿Cómo exactamente hago esto? Es un archivo "1-dimensional" directo, que contiene 100 números.Java: leer un archivo en una matriz

El problema es que recibo una excepción todo el tiempo. Aparentemente no puede encontrarlo (estoy seguro de que está escrito correctamente). Al consultar ejemplos de código, no especifica la ruta completa del archivo, solo el nombre del archivo en sí. ¿Cómo haría eso si fuera necesario?

Además, al leer el archivo, ¿la matriz contendrá automáticamente todas las líneas del archivo, o tendré que hacer un ciclo que copie cada línea al correspondiente subíndice i?

He oído hablar de la clase BufferedReader, ¿para qué sirve y cómo se correlaciona con la entrada de lectura?

Respuesta

63

Aquí es un código de ejemplo para ayudarle a empezar:

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()]); 
    } 
} 

Y una prueba de unidad de ejemplo:

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); 
     } 
    } 
} 

Espero que esto ayude.

+17

volver a reddit con usted! – toolkit

+2

¿No debería incluirse 'bufferedReader.close()' dentro de un bloque 'try {} finally {}'? – LukeGT

+0

@ LukeGT- Sí, debería ser para el código de producción. Estos métodos de ejemplo simplemente lanzan una excepción. – toolkit

0

Debería poder usar barras diagonales en Java para referirse a ubicaciones de archivos.

La clase BufferedReader se utiliza para envolver otros lectores de archivos cuyo método de lectura puede no ser muy eficiente. Una descripción más detallada se puede encontrar en el Java APIs.

El uso del Toolkit de BufferedReader es probablemente lo que necesita.

3

Apache Commons I/O proporciona FileUtils # readLines(), que debería estar bien para todos los archivos, excepto los grandes: http://commons.apache.org/io/api-release/index.html. La distribución 2.1 incluye FileUtils.lineIterator(), que sería adecuado para archivos grandes. Las bibliotecas de guayaba de Google incluyen utilidades similares.

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 ya mencionó que han visto ejemplos. Esta respuesta no aborda ninguna de las preguntas que hicieron. – allingeek

+3

Esto es para JAVA 7+ –

+3

En Java 8, puede simplemente llamar a 'Files.readAllLines (filePath)' que es equivalente a pasar 'StandardCharsets.UTF_8' como el juego de caracteres. – emlai

Cuestiones relacionadas