web-dev-qa-db-fra.com

Fichier texte entier vers une chaîne en Java

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 ..

51
Betamoo

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:

  • afin de lire le texte du fichier , utilisez FileInputStream
  • Si les performances sont importantes et que vous lisez des fichiers volumineux, il est conseillé d'envelopper le flux dans BufferedInputStream.
  • le flux doit être fermé par l'appelant
20
Neeme Praks

Apache commons-io a:

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.

45
Bozho

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.

25
Jon Skeet

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?

23
dimo414

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

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 
2
nullpointer

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);
1
SzB

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

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;
0
mir

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
      }
0
SzB