web-dev-qa-db-fra.com

Lire le fichier en tant que chaîne

Je dois charger un fichier xml sous forme de chaîne dans Android afin de pouvoir le charger dans la bibliothèque de l'analyseur xml TBXML et l'analyser. L'implémentation que j'ai maintenant pour lire le fichier en tant que chaîne prend environ 2 secondes, même pour un très petit fichier XML de quelques Ko. Existe-t-il une méthode rapide connue permettant de lire un fichier sous forme de chaîne dans Java/Android?


C'est le code que j'ai maintenant:

public static String readFileAsString(String filePath) {
    String result = "";
    File file = new File(filePath);
    if ( file.exists() ) {
        //byte[] buffer = new byte[(int) new File(filePath).length()];
        FileInputStream fis = null;
        try {
            //f = new BufferedInputStream(new FileInputStream(filePath));
            //f.read(buffer);

            fis = new FileInputStream(file);
            char current;
            while (fis.available() > 0) {
                current = (char) fis.read();
                result = result + String.valueOf(current);
            }
        } catch (Exception e) {
            Log.d("TourGuide", e.toString());
        } finally {
            if (fis != null)
                try {
                    fis.close();
                } catch (IOException ignored) {
            }
        }
        //result = new String(buffer);
    }
    return result;
}
49
Panos

Le code finalement utilisé est le suivant:

http://www.Java2s.com/Code/Java/File-Input-Output/ConvertInputStreamtoString.htm

public static String convertStreamToString(InputStream is) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
      sb.append(line).append("\n");
    }
    reader.close();
    return sb.toString();
}

public static String getStringFromFile (String filePath) throws Exception {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    //Make sure you close all streams.
    fin.close();        
    return ret;
}
136
Panos

Retravaillé le jeu de méthodes provenant de -> la réponse acceptée

@ JaredRummler Une réponse à votre commentaire:

Lire le fichier en tant que chaîne

Est-ce que cela ne va pas ajouter une nouvelle ligne supplémentaire à la fin de la chaîne?

Pour éviter l'ajout d'une nouvelle ligne à la fin, vous pouvez utiliser une valeur booléenne définie lors de la première boucle, comme vous le ferez dans l'exemple de code Boolean firstLine

public static String convertStreamToString(InputStream is) throws IOException {
   // http://www.Java2s.com/Code/Java/File-Input-Output/ConvertInputStreamtoString.htm
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    Boolean firstLine = true;
    while ((line = reader.readLine()) != null) {
        if(firstLine){
            sb.append(line);
            firstLine = false;
        } else {
            sb.append("\n").append(line);
        }
    }
    reader.close();
    return sb.toString();
}

public static String getStringFromFile (String filePath) throws IOException {
    File fl = new File(filePath);
    FileInputStream fin = new FileInputStream(fl);
    String ret = convertStreamToString(fin);
    //Make sure you close all streams.
    fin.close();
    return ret;
}
15
CrandellWS

Vous pouvez utiliser org.Apache.commons.io.IOUtils.toString(InputStream is, Charset chs) pour le faire.

par exemple.

IOUtils.toString(context.getResources().openRawResource(<your_resource_id>), StandardCharsets.UTF_8)

Pour ajouter la bibliothèque correcte:

Ajoutez les éléments suivants à votre fichier app/build.gradle:

dependencies {
    compile 'org.Apache.directory.studio:org.Apache.commons.io:2.4'
}

ou pour le repo Maven voir -> ce lien

Pour télécharger directement le fichier jar, voir-> https://commons.Apache.org/proper/commons-io/download_io.cgi

15
Eugene Dudnyk

Avec les fichiers, nous connaissons la taille à l’avance, lisez-la en une fois!

String result;
File file = ...;

long length = file.length();
if (length < 1 || length > Integer.MAX_VALUE) {
    result = "";
    Log.w(TAG, "File is empty or huge: " + file);
} else {
    try (FileReader in = new FileReader(file)) {
        char[] content = new char[(int)length];

        int numRead = in.read(content);
        if (numRead != length) {
            Log.e(TAG, "Incomplete read of " + file + ". Read chars " + numRead + " of " + length);
        }
        result = new String(content, 0, numRead);
    }
    catch (Exception ex) {
        Log.e(TAG, "Failure reading " + this.file, ex);
        result = "";
    }
}
4
Adam Fanello