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();
 }
Adesh singh
fuente
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");
imxylz
fuente
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);
Evgeniy Dorofeev
fuente
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);
Jayamohan
fuente
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);
Pablo Vargas
fuente
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