Читать файл As String
Мне нужно загрузить xml файл как String в android, чтобы я мог загрузить его в библиотеку XML-анализаторов TBXML и проанализировать его. Реализация Теперь я должен прочитать файл, поскольку String занимает около 2 секунд даже для очень маленького 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;
}
Ответы
Ответ 1
В конечном итоге используется следующий код:
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;
}
Ответ 2
Для этого вы можете использовать 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 repo см. → эта ссылка
Для прямого jar download see- > https://commons.apache.org/proper/commons-io/download_io.cgi
Ответ 3
Переработан метод, исходящий из → принятого ответа
@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;
}
Ответ 4
С файлами мы знаем размер заранее, поэтому просто прочитайте все сразу!
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 = "";
}
}
Ответ 5
это работает для меня
i use this path
String FILENAME_PATH = "/mnt/sdcard/Download/Version";
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;
}