2012-04-01 7 views
0

J'ai un simple fichier de dictionnaire de texte, qui contient des mots, séparés par ';' Mon problème est de lire tous les mots et les stocker dans la carte sans charger tous les fichiers dans une chaîne (Le fichier de dictionnaire peut être très énorme). Voici mon code, où je suis en train d'imprimer ces mots à une console:Lire un caractère et ajouter à une chaîne tampon java

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.Map; 

public class Dictionary { 
private static Dictionary instance; 
private Map DictionaryMap; 
private String delimiter; 

private Dictionary() { 

} 

private Dictionary(String dictfile, String delimiter) throws FileNotFoundException, IOException 
{ 
    FileReader fr = new FileReader(dictfile); 
    int position = 0; 
    StringBuffer buffer = new StringBuffer(); 
    while ((position = fr.read()) != -1) { 
     char symbol = (char) fr.read(); 
     if(symbol != ';') { 
      buffer.append(symbol); 
      System.out.println("Char is : "+symbol+" ;"); 
     } else { 
      System.out.println("String is "+buffer+" ;"); 
      buffer.delete(0, buffer.length()-1); 
     } 
    } 
} 

public void loadFromFile(File dictfile, String delimiter) { 

} 

public String getDelimiter() { 
    return delimiter; 
} 

public void setDelimiter(String delimiter) { 
    this.delimiter = delimiter; 
} 

Mais quand je suis en train d'exécuter ce code sur exemple de fichier dict.txt, qui contient:

test1; test2;

Certains des symboles entre délimiteur (char ';') n'a pas affiche:

Char est: e; Char est: t; String est et; Char est: e; Char est: t; Char est:;
Char est: \ uffff;

Ma question pourquoi cela ne fonctionne pas correctement et comment lire les caractères de fileinputstream (dans mon cas) sans type casting?

+1

Commentaires généraux. Si le fichier est volumineux, vous pouvez améliorer la vitesse en utilisant BufferedReader à la place. Cela va lire le fichier en morceaux dans un tampon interne. Vous avez besoin de toute la vitesse que vous pouvez obtenir en traitant des fichiers. Une méthode alternative de lecture à partir du fichier est StreamTokenizer où vous pouvez spécifier le délimiteur ("," dans votre cas) et il va vous nourrir des jetons. – Optimist

Répondre

1

Vous appelez le fr.read() deux fois par ex.

while ((position = fr.read()) != -1) { 
    char symbol = (char) fr.read(); 

Par conséquent, vous ignorez l'entrée.

Cela devrait être:

while ((position = fr.read()) != -1) { 
    char symbol = (char) position; 

En outre, il est généralement pas une bonne idée de lire le caractère fichier 1 à un moment - vous devriez essayer d'utiliser un char [] comme un tampon et utiliser la méthode read(char[] cbuf, int off, int len), ou pour la simplicité, utilisez un BufferedReader.

Questions connexes