java - txt - ¿Cuál es la forma más sencilla de leer un archivo en String?
manejo de archivos en java netbeans (9)
Descubrí que la respuesta aceptada en realidad no siempre funciona, porque //Z
puede aparecer en el archivo. Otro problema es que si no tiene el conjunto de caracteres correcto, pueden ocurrir muchas cosas inesperadas que pueden hacer que el escáner lea solo una parte del archivo.
La solución es usar un delimitador que usted está seguro de que nunca ocurrirá en el archivo. Sin embargo, esto es teóricamente imposible. Lo que PODEMOS hacer es usar un delimitador que tenga una probabilidad tan pequeña de ocurrir en el archivo que sea insignificante: dicho delimitador es un UUID , que se admite de forma nativa en Java.
String content = new Scanner(file, "UTF-8")
.useDelimiter(UUID.randomUUID().toString()).next();
Esta pregunta ya tiene una respuesta aquí:
Estoy tratando de leer un archivo de texto simple en una cadena. Por supuesto, existe la forma habitual de obtener el flujo de entrada e iterar con readLine () y leer los contenidos en String.
Habiendo hecho esto cientos de veces en el pasado, me preguntaba cómo puedo hacer esto en líneas de código mínimas. ¿No hay algo en java como String fileContents = XXX.readFile(myFile/*File*/)
... en lugar de algo tan simple como esto?
Sé que hay bibliotecas como Apache Commons IO que proporcionan tales simplificaciones o incluso puedo escribir una clase Util simple para hacer esto. Pero todo lo que me pregunto es: esta es una operación tan frecuente que todos necesitan, ¿por qué no proporciona Java una función tan simple? ¿No existe realmente un solo método en algún lugar para leer un archivo en una cadena con alguna codificación predeterminada o especificada?
Desde Java 7 (Descripción de la API) en adelante puedes hacer:
new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
Donde filePath es una cadena que representa el archivo que desea cargar.
Esto debería funcionar para usted:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public static void main(String[] args) throws IOException {
String content = new String(Files.readAllBytes(Paths.get("abc.java")));
}
No escriba su propia clase de utilidad para hacer esto: recomendaría usar Guava , que está lleno de todo tipo de bondades. En este caso, querrá la clase com.google.common.io.Files (si realmente solo está leyendo un archivo) o CharStreams para una lectura más general. Tiene métodos para leer los datos en una lista de cadenas ( readLines
) o totalmente ( toString
).
También tiene métodos útiles similares para datos binarios. Y luego está el resto de la biblioteca ...
Estoy de acuerdo en que es molesto que no haya nada similar en las bibliotecas estándar. Diablos, el solo hecho de poder proporcionar un CharSet
a un FileReader
haría la vida un poco más simple ...
Otro enfoque alternativo es:
¿Cómo creo una cadena Java a partir del contenido de un archivo?
Otra opción es utilizar las bibliotecas de código abierto provistas de utilidades.
http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html
¿Por qué Java no proporciona una API util tan común?
a) mantener las API genéricas para que el programador maneje la codificación, el almacenamiento en búfer, etc.
b) hacer que los programadores trabajen y escriban / compartan bibliotecas utilitarias de código abierto: D ;-)
Puedes usar apache commons IO ..
FileInputStream fisTargetFile = new FileInputStream(new File("test.txt"));
String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8");
Sí, puede hacer esto en una línea (aunque para un manejo de IOException
robusto no querría hacerlo).
String content = new Scanner(new File("filename")).useDelimiter("//Z").next();
System.out.println(content);
Esto utiliza un java.util.Scanner
, que le indica que delimite la entrada con /Z
, que es el final del anclaje de cadena. En última instancia, esto hace que la entrada tenga un token real, que es el archivo completo, por lo que se puede leer con una llamada a next()
.
Hay un constructor que toma un File
y una String charSetName
(entre otras muchas sobrecargas). Estos dos constructores pueden lanzar la FileNotFoundException
, pero como todos los métodos de Scanner
, ninguna IOException
puede lanzarse más allá de estos constructores.
Puede consultar el propio Scanner
a través del método ioException()
si se produjo una IOException
o no. También es posible que desee close()
explícitamente close()
el Scanner
después de leer el contenido, por lo que tal vez lo mejor sea almacenar la referencia del Scanner
en una variable local.
Ver también
Preguntas relacionadas
- Validación de entrada utilizando java.util.Scanner : tiene muchos ejemplos de uso más típico
Opciones de biblioteca de terceros
Para completar, estas son algunas opciones realmente buenas si tiene estas bibliotecas de terceros de gran reputación y muy útiles:
Guava
com.google.common.io.Files
contiene muchos métodos útiles. Los pertinentes aquí son:
-
String toString(File, Charset)
- Usando el conjunto de caracteres dado, lee todos los caracteres de un archivo en una
String
- Usando el conjunto de caracteres dado, lee todos los caracteres de un archivo en una
-
List<String> readLines(File, Charset)
- ... lee todas las líneas de un archivo en una
List<String>
, una entrada por línea
- ... lee todas las líneas de un archivo en una
Apache Commons / IO
org.apache.commons.io.IOUtils
también ofrece una funcionalidad similar:
-
String toString(InputStream, String encoding)
- Usando la codificación de caracteres especificada, obtiene el contenido de un
InputStream
como unaString
- Usando la codificación de caracteres especificada, obtiene el contenido de un
-
List readLines(InputStream, String encoding)
- ... como una lista (sin procesar) de
String
, una entrada por línea
- ... como una lista (sin procesar) de
Preguntas relacionadas
Tristemente no.
Estoy de acuerdo en que una operación tan frecuente debería tener una implementación más fácil que la copia de la línea de entrada en línea en el bucle, pero tendrá que escribir un método auxiliar o usar una biblioteca externa.
Utilizando Apache Commons IO .
import org.apache.commons.io.FileUtils;
//...
String contents = FileUtils.readFileToString(new File("/path/to/the/file"), "UTF-8")
Puede ver de javadoc para el método para más detalles.