2008-10-22 8 views

Répondre

7

Utilisez le package Apache Commons IOUtils. En particulier, la classe IOUtils fournit un ensemble de méthodes à lire à partir de flux, de lecteurs, etc. et gère toutes les exceptions, etc.

par exemple.

InputStream is = ... 
String contents = IOUtils.toString(is); 
// or 
List lines = IOUtils.readLines(is) 
1
String content = (new RandomAccessFile(new File("test.txt"))).readUTF(); 

Malheureusement Java est très pointilleux sur le fichier source étant UTF8 valide si, ou vous obtiendrez un EOFException ou UTFDataFormatException.

+0

Il vous manque une citation de fermeture là ... – itsadok

+0

Je ne pense pas que ce soit un Java étant "pointilleux" sur le texte que vous lisez avec readUTF(), c'est juste que vous l'utilisez mal. Lisez ceci: http://java.sun.com/javase/6/docs/api/java/io/DataInput.html#modified-utf-8 –

0

Vous devez créer votre propre fonction, je suppose. Le problème est que les routines de lecture de Java (celles que je connais au moins) prennent généralement un argument buffer d'une longueur donnée.

Une solution que j'ai vu est d'obtenir la taille du fichier, créer un tampon de cette taille et lire le fichier à la fois. Espérant que le fichier n'est pas un fichier gigaoctet ou un fichier XML ...

La méthode habituelle est d'avoir un tampon de taille fixe ou d'utiliser readLine et de concaténer les résultats dans un StringBuffer/StringBuilder.

2

Fonctions auxiliaires. J'utilise essentiellement certains d'entre eux, en fonction de la situation

    méthode
  • de chat que les tuyaux InputStream à une méthode OutputStream
  • qui appelle le chat à un ByteArrayOutputStream et extrait le tableau d'octets, ce qui permet de lecture rapide d'un dossier complet à un tableau d'octets
  • Implémentation d'Iterator < Chaîne > construite à l'aide d'un lecteur; il l'enveloppe dans un BufferedReader et de la READLINE sur next()
  • ...

Soit rouler votre propre ou utiliser quelque chose de commons-io ou votre bibliothèque utilitaire préféré.

1

Pour donner un exemple d'une telle fonction d'assistance:

String[] lines = NioUtils.readInFile(componentxml); 

La clé est d'essayer de fermer le BufferedReader même si une IOException est levée.

/** 
* Read lines in a file. <br /> 
* File must exist 
* @param f file to be read 
* @return array of lines, empty if file empty 
* @throws IOException if prb during access or closing of the file 
*/ 
public static String[] readInFile(final File f) throws IOException 
{ 
    final ArrayList lines = new ArrayList(); 
    IOException anioe = null; 
    BufferedReader br = null; 
    try 
    { 
     br = new BufferedReader(new FileReader(f)); 
     String line; 
     line = br.readLine(); 
     while(line != null) 
     { 
      lines.add(line); 
      line = br.readLine(); 
     } 
     br.close(); 
     br = null; 
    } 
    catch (final IOException e) 
    { 
     anioe = e; 
    } 
    finally 
    { 
     if(br != null) 
     { 
      try { 
       br.close(); 
      } catch (final IOException e) { 
       anioe = e; 
      } 
     } 
     if(anioe != null) 
     { 
      throw anioe; 
     } 
    } 
    final String[] myStrings = new String[lines.size()]; 
    //myStrings = lines.toArray(myStrings); 
    System.arraycopy(lines.toArray(), 0, myStrings, 0, lines.size()); 
    return myStrings; 
} 

(si vous voulez juste une chaîne, changer la fonction d'ajouter chaque ligne à un StringBuffer (ou StringBuilder dans java5 ou 6)

0

Je ne pense pas que la lecture à l'aide BufferedReader est une bonne idée car BufferedReader renvoie uniquement le contenu de la ligne sans le délimiteur.Lorsque la ligne ne contient rien d'autre qu'un caractère de retour à la ligne, BR renverra une valeur nulle, mais n'atteindra toujours pas la fin du flux

+0

Non. Lorsque BufferedReader voit deux séparateurs de ligne consécutifs, readLine() renvoie une chaîne vide. Il ne renvoie que null lorsqu'il atteint la fin du fichier. –

0

String org.apache.commons. io.FileUtils.readFileToString (Fichier)

5

Je pense que l'aide d'un scanner est tout à fait OK en ce qui concerne des outils Java concision embarqués:

Scanner s = new Scanner(new File("file")); 
StringBuilder builder = new StringBuilder(); 
while(s.hasNextLine()) builder.append(s.nextLine()); 

En outre, il est trop assez souple, (par exemple support d'expressions régulières, analyse de nombres).

+0

bonne solution. façon plus propre que tout le reste – Janusz

0

Choisissez-en un ici.

How do I create a Java string from the contents of a file?

Le favori était:

private static String readFile(String path) throws IOException { 
    FileInputStream stream = new FileInputStream(new File(path)); 
    try { 
    FileChannel fc = stream.getChannel(); 
    MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()); 
    /* Instead of using default, pass in a decoder. */ 
    return CharSet.defaultCharset().decode(bb).toString(); 
    } 
    finally { 
    stream.close(); 
    } 
} 

Publié par erickson

0

Ou la façon dont Java 8:

try { 
    String str = new String(Files.readAllBytes(Paths.get("myfile.txt"))); 
    ... 
} catch (IOException ex) { 
    Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); 
} 

On peut passer d'un jeu de caractères approprié au constructeur de chaîne.

Questions connexes