Java a-t-il une instruction d'une ligne à lire dans un fichier texte, comme ce que C # a?
Je veux dire, y a-t-il quelque chose d'équivalent à ceci en Java?
String data = System.IO.File.ReadAllText("path to file");
Si non ... quel est le "moyen optimal" de faire cela ...?
Modifier:
Je préfère un moyen parmi les bibliothèques standard Java ... Je ne peux pas utiliser de bibliothèques tierces ..
Autant que je sache, il n’existe pas de librairie unique avec des bibliothèques standard . Une approche typique avec des bibliothèques standard serait quelque chose comme ceci:
public static String readStream(InputStream is) {
StringBuilder sb = new StringBuilder(512);
try {
Reader r = new InputStreamReader(is, "UTF-8");
int c = 0;
while ((c = r.read()) != -1) {
sb.append((char) c);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return sb.toString();
}
Remarques:
String str = FileUtils.readFileToString(file, "utf-8");
Mais cet utilitaire n'existe pas dans les classes Java standard. Si vous (pour une raison quelconque) ne voulez pas de bibliothèques externes, vous devrez le réimplémenter. Ici quelques exemples et vous pouvez également voir comment il est implémenté par commons-io ou Guava.
Pas dans les principales bibliothèques Java, mais vous pouvez utiliser Guava :
String data = Files.asCharSource(new File("path.txt"), Charsets.UTF_8).read();
Ou pour lire des lignes:
List<String> lines = Files.readLines( new File("path.txt"), Charsets.UTF_8 );
Bien sûr, je suis sûr qu'il existe d'autres bibliothèques tierces qui faciliteraient la tâche de la même manière - je connais tout simplement mieux Guava.
Java 7 améliore cette situation déplorable avec la classe Files
(à ne pas confondre avec la classe de Guava du même nom ), vous pouvez obtenir toutes les lignes d'un fichier - sans bibliothèques externes - avec:
List<String> fileLines = Files.readAllLines(path, StandardCharsets.UTF_8);
Ou dans une chaîne:
String contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
// or equivalently:
StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(path)));
Si vous avez besoin de quelque chose d’extérieur avec un JDK propre, cela fonctionne très bien. Cela dit, pourquoi écrivez-vous Java sans goyave?
Dans Java 8 (pas de bibliothèques externes), vous pouvez utiliser des flux. Ce code lit un fichier et place toutes les lignes séparées par ',' dans une chaîne.
try (Stream<String> lines = Files.lines(myPath)) {
list = lines.collect(Collectors.joining(", "));
} catch (IOException e) {
LOGGER.error("Failed to load file.", e);
}
Avec JDK/11, vous pouvez lire un fichier complet dans une chaîne Path
sous forme de chaîne à l'aide deFiles.readString(Path path)
:
try {
String fileContent = Files.readString(Path.of("/foo/bar/gus"));
} catch (IOException e) {
// handle exception in i/o
}
la documentation de la méthode du JDK se lit comme suit:
/**
* Reads all content from a file into a string, decoding from bytes to characters
* using the {@link StandardCharsets#UTF_8 UTF-8} {@link Charset charset}.
* The method ensures that the file is closed when all content have been read
* or an I/O error, or other runtime exception, is thrown.
*
* <p> This method is equivalent to:
* {@code readString(path, StandardCharsets.UTF_8) }
*
* @param path the path to the file
*
* @return a String containing the content read from the file
*
* @throws IOException
* if an I/O error occurs reading from the file or a malformed or
* unmappable byte sequence is read
* @throws OutOfMemoryError
* if the file is extremely large, for example larger than {@code 2GB}
* @throws SecurityException
* In the case of the default provider, and a security manager is
* installed, the {@link SecurityManager#checkRead(String) checkRead}
* method is invoked to check read access to the file.
*
* @since 11
*/
public static String readString(Path path) throws IOException
Aucune bibliothèque externe nécessaire. Le contenu du fichier sera mis en mémoire tampon avant la conversion en chaîne.
Path path = FileSystems.getDefault().getPath(directory, filename);
String fileContent = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
Voici 3 façons de lire un fichier texte sur une ligne, sans nécessiter de boucle. J'ai documenté 15 façons de lire un fichier en Java et celles-ci sont extraites de cet article.
Notez que vous devez toujours parcourir la liste renvoyée, bien que l'appel réel pour lire le contenu du fichier ne nécessite qu'une ligne, sans boucle.
1) Java.nio.file.Files.readAllLines () - Codage par défaut
import Java.io.File;
import Java.io.IOException;
import Java.nio.file.Files;
import Java.util.List;
public class ReadFile_Files_ReadAllLines {
public static void main(String [] pArgs) throws IOException {
String fileName = "c:\\temp\\sample-10KB.txt";
File file = new File(fileName);
List fileLinesList = Files.readAllLines(file.toPath());
for(String line : fileLinesList) {
System.out.println(line);
}
}
}
2) Java.nio.file.Files.readAllLines () - Encodage explicite
import Java.io.File;
import Java.io.IOException;
import Java.nio.charset.StandardCharsets;
import Java.nio.file.Files;
import Java.util.List;
public class ReadFile_Files_ReadAllLines_Encoding {
public static void main(String [] pArgs) throws IOException {
String fileName = "c:\\temp\\sample-10KB.txt";
File file = new File(fileName);
//use UTF-8 encoding
List fileLinesList = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
for(String line : fileLinesList) {
System.out.println(line);
}
}
}
3) Java.nio.file.Files.readAllBytes ()
import Java.io.File;
import Java.io.IOException;
import Java.nio.file.Files;
public class ReadFile_Files_ReadAllBytes {
public static void main(String [] pArgs) throws IOException {
String fileName = "c:\\temp\\sample-10KB.txt";
File file = new File(fileName);
byte [] fileBytes = Files.readAllBytes(file.toPath());
char singleChar;
for(byte b : fileBytes) {
singleChar = (char) b;
System.out.print(singleChar);
}
}
}
Pas tout à fait un one-liner et probablement obsolète si vous utilisez JDK 11 tel que posté par nullpointer. Toujours utile si vous avez un flux d'entrée non fichier
InputStream inStream = context.getAssets().open(filename);
Scanner s = new Scanner(inStream).useDelimiter("\\A");
String string = s.hasNext() ? s.next() : "";
inStream.close();
return string;
Aucune bibliothèque externe nécessaire. Le contenu du fichier sera mis en mémoire tampon avant la conversion en chaîne.
String fileContent="";
try {
File f = new File("path2file");
byte[] bf = new byte[(int)f.length()];
new FileInputStream(f).read(bf);
fileContent = new String(bf, "UTF-8");
} catch (FileNotFoundException e) {
// handle file not found exception
} catch (IOException e) {
// handle IO-exception
}