web-dev-qa-db-ja.com

文字列としてファイルを読み取る

XMLファイルをAndroidでStringとしてロードする必要があります。そのため、TBXML xmlパーサーライブラリにロードして解析できます。いくつかのKBの非常に小さなxmlファイルJava/Androidでファイルを文字列として読み取ることができる既知の高速メソッドはありますか?


これは私が今持っているコードです:

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

最終的に使用されるコードは次のものです。

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

-> 受け入れられた回答 から始まるメソッドセットを作り直しました

@JaredRummlerコメントへの回答:

文字列としてファイルを読み取る

これは、文字列の最後に余分な新しい行を追加しませんか?

最後に改行が追加されないようにするには、コード例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

これを行うには、org.Apache.commons.io.IOUtils.toString(InputStream is, Charset chs)を使用できます。

例えば.

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

正しいライブラリを追加するには:

App/build.gradleファイルに次を追加します。

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

またはMavenリポジトリについては、-> このリンク を参照してください

Jarの直接ダウンロードについては、--- https://commons.Apache.org/proper/commons-io/download_io.cgi を参照してください。

15
Eugene Dudnyk

ファイルについては、サイズが事前にわかっているので、一度にすべて読むだけです!

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