Quel est le moyen le plus simple de lire un fichier dans Ssortingng?

J’essaie de lire un simple fichier texte dans une chaîne. Bien sûr, il y a la manière habituelle d’obtenir le stream d’entrée et de l’itérer avec readLine () et de lire le contenu dans Ssortingng.

Ayant fait cela des centaines de fois dans le passé, je me demandais comment puis-je le faire avec un minimum de lignes de code? N’y a-t-il pas quelque chose dans Java comme Ssortingng fileContents = XXX.readFile(myFile/*File*/) .. plutôt que tout ce qui semble aussi simple que cela?

Je sais qu’il existe des bibliothèques comme Apache Commons IO qui fournissent de telles simplifications ou même je peux écrire une simple classe Util pour ce faire. Mais tout ce que je me demande, c’est qu’il s’agit d’une opération si fréquente dont tout le monde a besoin, alors pourquoi Java ne fournit-il pas une fonction aussi simple? N’y a-t-il pas vraiment une méthode unique pour lire un fichier dans une chaîne avec un encodage par défaut ou spécifié?

Oui, vous pouvez le faire en une seule ligne (bien que pour une gestion robuste d’ IOException vous ne le voudriez pas).

 Ssortingng content = new Scanner(new File("filename")).useDelimiter("\\Z").next(); System.out.println(content); 

Cela utilise un java.util.Scanner , lui indiquant de délimiter l’entrée avec \Z , qui est la fin de l’ancre de chaîne. Cela fait en sorte que l’entrée a un jeton réel, qui est le fichier entier, de sorte qu’il peut être lu avec un appel à next() .

Il y a un constructeur qui prend un File et une Ssortingng charSetName (parmi beaucoup d’autres surcharges). Ces deux constructeurs peuvent FileNotFoundException , mais, comme toutes les méthodes Scanner , aucune IOException ne peut être générée au-delà de ces constructeurs.

Vous pouvez interroger le Scanner lui-même via la méthode ioException() si une IOException s’est produite ou non. Vous pouvez également vouloir close() explicitement close() le Scanner après avoir lu le contenu. Il est donc préférable de stocker la référence du Scanner dans une variable locale.

Voir également

  • Tutoriels Java – Essentiels d’E / S – Analyse et formatage

Questions connexes

  • Validation des entrées à l’aide de java.util.Scanner – contient de nombreux exemples d’utilisation plus courante

Options de bibliothèque tierces

Pour être complet, il existe de très bonnes options si vous avez ces bibliothèques tierces très réputées et très utiles:

Goyave

com.google.common.io.Files contient de nombreuses méthodes utiles. Les pertinents ici sont:

  • Ssortingng toSsortingng(File, Charset)
    • En utilisant le jeu de caractères donné, lit tous les caractères d’un fichier dans une Ssortingng
  • List readLines(File, Charset)
    • … lit toutes les lignes d’un fichier dans une List , une entrée par ligne

Apache Commons / IO

org.apache.commons.io.IOUtils offrent également des fonctionnalités similaires:

  • Ssortingng toSsortingng(InputStream, Ssortingng encoding)
    • À l’aide du codage de caractères spécifié, obtient le contenu d’un object InputStream tant que Ssortingng
  • List readLines(InputStream, Ssortingng encoding)
    • … en tant que liste (brute) de Ssortingng , une entrée par ligne

Questions connexes

  • Les bibliothèques Java tierces gratuites les plus utiles (supprimées)?

À partir de Java 7 (Description de l’API) , vous pouvez effectuer les tâches suivantes:

new Ssortingng(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);

Où filePath est une chaîne représentant le fichier que vous souhaitez charger.

Vous pouvez utiliser apache commons IO ..

 FileInputStream fisTargetFile = new FileInputStream(new File("test.txt")); Ssortingng targetFileStr = IOUtils.toSsortingng(fisTargetFile, "UTF-8"); 

Cela devrait fonctionner pour vous:

 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public static void main(Ssortingng[] args) throws IOException { Ssortingng content = new Ssortingng(Files.readAllBytes(Paths.get("abc.java"))); } 

Utiliser Apache Commons IO .

 import org.apache.commons.io.FileUtils; //... Ssortingng contents = FileUtils.readFileToSsortingng(new File("/path/to/the/file"), "UTF-8") 

Vous pouvez voir de javadoc pour la méthode pour plus de détails.

N’écrivez pas votre propre classe util pour ce faire – je vous recommande d’utiliser Guava , qui est plein de toutes sortes de bonnes choses. Dans ce cas, vous voudriez soit la classe Files (si vous lisez vraiment un fichier) ou CharStreams pour une lecture plus générale. Il a des méthodes pour lire les données dans une liste de chaînes ( readLines ) ou totalement ( toSsortingng ).

Il a également des méthodes utiles pour les données binarys. Et puis il y a le rest de la bibliothèque …

Je suis d’accord que c’est ennuyant qu’il n’y ait rien de similaire dans les bibliothèques standard. Heck, juste être capable de fournir un CharSet à un FileReader rendrait la vie un peu plus simple …

Une autre approche alternative est:

Comment créer une chaîne Java à partir du contenu d’un fichier?

Autre option: utiliser les utilitaires fournis par les bibliothèques open source
http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html

Pourquoi Java ne fournit-il pas une API util usuelle?
a) garder les API génériques afin que l’encodage, la mise en mémoire tampon, etc. soient gérés par le programmeur.
b) faire en sorte que les programmeurs travaillent et écrivent / partagent les bibliothèques opensource util: D 😉

Malheureusement non.

Je conviens que cette opération fréquente devrait avoir une implémentation plus facile que la copie de ligne en ligne en boucle, mais vous devrez soit écrire une méthode d’assistance, soit utiliser une bibliothèque externe.

J’ai découvert que la réponse acceptée ne fonctionnait pas toujours, car \\Z pouvait apparaître dans le fichier. Un autre problème est que si vous ne possédez pas le bon jeu de caractères, tout un tas de choses inattendues peuvent se produire, ce qui peut amener le scanner à ne lire qu’une partie du fichier.

La solution est d’utiliser un délimiteur dont vous êtes certain qu’il ne se produira jamais dans le fichier. Cependant, cela est théoriquement impossible. Ce que nous POUVONS faire, c’est utiliser un délimiteur qui a si peu de chance de se produire dans le fichier qu’il est négligeable: un tel délimiteur est un UUID , qui est nativement pris en charge en Java.

 Ssortingng content = new Scanner(file, "UTF-8") .useDelimiter(UUID.randomUUID().toSsortingng()).next(); 

ci-dessous est le code simple pour lire le contenu du fichier dans la chaîne

  try { Ssortingng line; File file = new File("C:/LEO/abc.txt"); FileReader fr = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fr); HashMap< String, Integer> objHashMap = new HashMap<>(); while((line = bufferedReader.readLine()) != null) { String lineWords[] = line.split(" "); for(String singleWord:lineWords) { System.out.println(singleWord); } } for(String keyObject:objHashMap.keySet()) { System.out.println(keyObject + ": " + objHashMap.get(keyObject)); } } catch(Exception exception) { System.out.println("IOException occured"); exception.printStackTrace(); }