1498 votes

Comment créer un Java Chaîne à partir du contenu d'un fichier?

J'ai été en utilisant ce langage pour un certain temps maintenant. Et il semble être la plus répandue, au moins dans les sites que j'ai visité.

Quelqu'un aurait-il mieux/différent moyen de lire un fichier en une chaîne de caractères en Java?

private String readFile( String file ) throws IOException {
    BufferedReader reader = new BufferedReader( new FileReader (file));
    String         line = null;
    StringBuilder  stringBuilder = new StringBuilder();
    String         ls = System.getProperty("line.separator");

    while( ( line = reader.readLine() ) != null ) {
        stringBuilder.append( line );
        stringBuilder.append( ls );
    }

    return stringBuilder.toString();
}

1515voto

erickson Points 127945

Lire tout le texte à partir d'un fichier

Voici un compact, robuste idiome pour Java 7, enveloppé dans une méthode utilitaire:

static String readFile(String path, Charset encoding) 
  throws IOException 
{
  byte[] encoded = Files.readAllBytes(Paths.get(path));
  return new String(encoded, encoding);
}

Lire des lignes de texte à partir d'un fichier

Java 7 ajout d'une méthode pratique pour lire un fichier sous forme de lignes de texte, représenté comme un List<String>. Cette approche est "figé", parce que la ligne de séparateurs sont supprimés à la fin de chaque ligne.

List<String> lines = Files.readAllLines(Paths.get(path), encoding);

L'utilisation de la mémoire

La première méthode, qui préserve les sauts de ligne, peuvent temporairement nécessitent de la mémoire de plusieurs fois la taille du fichier, parce que pour un court laps de temps, le fichier raw contenu (un tableau d'octets), et au décodage des caractères (qui est de 16 bits, même si encodé sur 8 bits dans le fichier) résident en mémoire à la fois. Il est plus sûr d'appliquer à des fichiers que vous savez être petite par rapport à la mémoire disponible.

La deuxième méthode, la lecture des lignes, est généralement plus efficace en terme de mémoire, car l'entrée octets de la mémoire tampon pour le décodage n'a pas besoin de contenir la totalité du fichier. Cependant, il n'est pas encore adapté pour les fichiers sont très volumineux par rapport à la mémoire disponible.

Pour la lecture de gros fichiers, vous avez besoin d'une conception différente de votre programme, un qui lit un morceau de texte à partir d'un flux de données, les traite, puis se déplace vers le prochain, la réutilisation de la même taille de bloc de mémoire. Ici, les "grands" dépend de l'ordinateur et de spécifications. Aujourd'hui, ce seuil pourrait être de plusieurs gigaoctets de RAM.

L'encodage des caractères

Une chose qui est absent de l'échantillon dans le post original est l'encodage des caractères. Il existe quelques cas particuliers où la plate-forme par défaut est ce que vous voulez, mais ils sont rares, et vous devriez être en mesure de justifier vos choix.

L' StandardCharsets classe de définir des constantes pour les codages nécessaires de tous les temps d'exécution Java:

String content = readFile("test.txt", StandardCharsets.UTF_8);

La plate-forme par défaut est disponible à partir de l' Charset de la classe elle-même:

String content = readFile("test.txt", Charset.defaultCharset());

Note: Cette réponse remplace en grande partie mon Java 6 version. L'utilitaire de Java 7 en toute sécurité simplifie le code, et le vieux la réponse, qui a utilisé un mappé octets de la mémoire tampon, empêchant le fichier qui a été lu à être supprimé jusqu'à ce que le mappés en mémoire tampon a été nettoyée. Vous pouvez consulter l'ancienne version via le "édité" lien sur cette réponse.

346voto

Willi aus Rohr Points 1744

Commons FileUtils.readFileToString:

public static String readFileToString(File file)
                       throws IOException

Lit le contenu d'un fichier dans une Chaîne à l'aide de l'encodage par défaut pour la VM. Le fichier est toujours fermé.

Paramètres:

  • file - le fichier à lire, ne doit pas être null

Retourne:
le contenu du fichier, jamais null

Jette: - IOException - dans le cas d'une erreur d'e/S

Depuis:
Commons IO 1.3.1

Edit par Oscar Reyes

J'ai trouvé le code utilisé ( indirectement ) par la classe:

IOUtils.java sous Licence Apache 2.0

public static long copyLarge(InputStream input, OutputStream output)
       throws IOException {
   byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
   long count = 0;
   int n = 0;
   while (-1 != (n = input.read(buffer))) {
       output.write(buffer, 0, n);
       count += n;
   }
   return count;
}

Très similaire à celui utilisé par Ritche_W

180voto

Pablo Grisafi Points 2674

À partir de cette page, une solution en ligne:

 String text = new Scanner( new File("poem.txt") ).useDelimiter("\\A").next();

ou

String text = new Scanner( new File("poem.txt"), "UTF-8" ).useDelimiter("\\A").next();

Si vous souhaitez définir le jeu de caractères

78voto

Dónal Points 61837

Si vous êtes à la recherche d'une alternative qui n'implique pas une 3ème partie de la bibliothèque (par exemple commons IO), vous pouvez utiliser le Scanner de classe

private String readFile(String pathname) throws IOException {

    File file = new File(pathname);
    StringBuilder fileContents = new StringBuilder((int)file.length());
    Scanner scanner = new Scanner(file);
    String lineSeparator = System.getProperty("line.separator");

    try {
        while(scanner.hasNextLine()) {        
            fileContents.append(scanner.nextLine() + lineSeparator);
        }
        return fileContents.toString();
    } finally {
        scanner.close();
    }
}

70voto

finnw Points 24592

La goyave est une méthode similaire à celle de Commons IOUtils que Willi aus Rohr mentionné:

import com.google.common.base.Charsets;
import com.google.common.io.Files;

// ...

String text = Files.toString(new File(path), Charsets.UTF_8);

EDIT par Oscar Reyes

C'est l' (simplifié) du code sous-jacent à la cité de la bibliothèque:

InputStream in = new FileInputStream(file);
byte[] b  = new byte[file.length()];
int len = b.length;
int total = 0;

while (total < len) {
  int result = in.read(b, total, len - total);
  if (result == -1) {
    break;
  }
  total += result;
}

return new String( b , Charsets.UTF_8 );

Edit (par Jonik): Le ci-dessus ne correspond pas au code source de ces dernières Goyave versions. Pour la source de courant, voir les classes des Fichiers, CharStreams, ByteSource et CharSource dans com.google.commun.io paquet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X