leer el archivo completo sin usar el bucle en java


103

Posible duplicado:
cómo crear una cadena Java a partir del contenido de un archivo Archivo de
texto completo a una cadena en Java

Estoy intentando leer el contenido de un archivo usando FileReader. Pero quiero leer el archivo sin leer línea por línea. ¿Es posible leer el archivo completo sin bucle? Estoy usando el siguiente código

 try
 {
     File ff=new File("abc.txt");
     FileReader fr=new FileReader(ff);

     String s;
     while(br.read()!=-1)
     {
          s=br.readLine();
     }
 }

 catch(Exception ex)
 {
     ex.printStackTrace();
 }

Este código no se compilará para empezar.
Arya Pourtabatabaie

Hay una solución Java 11 de una línea para esto: stackoverflow.com/a/52301018/942774
Hendrik

Respuestas:


129

Si el archivo es pequeño , puede leer todos los datos una vez:

File file = new File("a.txt");
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();

String str = new String(data, "UTF-8");

4
No funciona para los activos de Android sa de InputStream (sin duración)
akauppi

10
¿Qué tan pequeño es "pequeño"?
plata

8
@silver Todo el contenido del archivo se almacenará en la memoria. Por lo tanto, evite leer archivos de 5GB como este :-)
Thibaut D.

2
Nota: file.length()puede devolver 0 para archivos bajo /proc. Y en esos casos, este fragmento devolverá una cadena vacía.
Mygod

1
También readpuede que no llene todo el búfer. Puede funcionar en la práctica con la mayoría de los JRE, pero no hay garantía en la API.
Daniel Lubarov

179

Solución Java 7 de una línea

List<String> lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8);

o

 String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);

1
No puedo encontrar esos archivos en Android.
akauppi

23
¡No todas las respuestas de Java tienen que ser adecuadas para Android, @akauppi! ¡Solo busque una solución compatible con Android desde otra respuesta!
Isaac Woods

String text = Files.readString(Paths.get("file"));es incluso más corto, asumiendo que desea una salida de cadena UTF-8.
Eagterrian Knight

Y si ya tiene el objeto Archivo, puede hacerlo file.toPath()adentroreadAllBytes
Kartik Chugh

Importante para Android: Call requires API level 26: java.nio.file.Files#readAllBytes- lo mismo para readString.
Neph

33

Puede intentar usar Scanner si está usando JDK5 o superior.

Scanner scan = new Scanner(file);  
scan.useDelimiter("\\Z");  
String content = scan.next(); 

O también puedes usar Guayaba

String data = Files.toString(new File("path.txt"), Charsets.UTF8);

4
Tenga en cuenta que el escáner debe cerrarse después de su uso.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. Solo un pequeño error tipográfico. :-)
pisaruk

1
Este código con Scannersolo leer los primeros 1024 bytes del archivo. Mira el código fuente. Leyó el búfer y lo verificó con esta expresión regular. Esto siempre es válido, luego devuelve todo el contenido del búfer. Por defecto, el búfer tiene un tamaño de 1024 bytes.
Enyby

2
Este es un MAL enfoque. La solución correcta (para Java 1.7 y superior) es Files.readAllLines(). Para los JRE heredados, FileInputStream.read()probablemente sea lo mejor. No estoy seguro de si es portátil para todas las plataformas (es decir, Ctl-Z se reconoce en todas partes), y es fácil no hacer un Scanner.close().
paulsm4

33

Si está utilizando Java 5/6, puede utilizar Apache Commons IO para leer el archivo a la cadena. La clase org.apache.commons.io.FileUtilscontiene varios métodos para leer archivos.

por ejemplo, usando el método FileUtils#readFileToString:

File file = new File("abc.txt");
String content = FileUtils.readFileToString(file);

1
Esta es probablemente la solución más sencilla con una biblioteca de terceros.
plata

3
Código mínimo para escribir; Muchas más bibliotecas para agregar al proyecto.
Please_Dont_Bully_Me_SO_Lords

2
El método readFileToString (File) del tipo FileUtils está obsoleto
JavaSheriff

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.