私はJavaには比較的新しいので、簡単なアンドロイドアプリを作成しようとしています。アプリケーションのassetsフォルダに約3500行の大きなテキストファイルがあり、それを文字列に読み込む必要があります。私はこれを行う方法についての良い例を見つけましたが、バイト配列が1024に初期化される理由について質問があります。テキストファイルの長さに初期化したくないのですか?また、byte
ではなくchar
を使用したいですか?コードは次のとおりです。このバイト配列を1024に初期化する理由
private void populateArray(){
AssetManager assetManager = getAssets();
InputStream inputStream = null;
try {
inputStream = assetManager.open("3500LineTextFile.txt");
} catch (IOException e) {
Log.e("IOException populateArray", e.getMessage());
}
String s = readTextFile(inputStream);
// Add more code here to populate array from string
}
private String readTextFile(InputStream inputStream) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
inputStream.length
byte buf[] = new byte[1024];
int len;
try {
while ((len = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}
outputStream.close();
inputStream.close();
} catch (IOException e) {
Log.e("IOException readTextFile", e.getMessage());
}
return outputStream.toString();
}
EDIT:あなたの提案に基づいて、このアプローチを試しました。それはもっと良いですか?ありがとう。
private void populateArray(){
AssetManager assetManager = getAssets();
InputStream inputStream = null;
Reader iStreamReader = null;
try {
inputStream = assetManager.open("List.txt");
iStreamReader = new InputStreamReader(inputStream, "UTF-8");
} catch (IOException e) {
Log.e("IOException populateArray", e.getMessage());
}
String String = readTextFile(iStreamReader);
// more code here
}
private String readTextFile(InputStreamReader inputStreamReader) {
StringBuilder sb = new StringBuilder();
char buf[] = new char[2048];
int read;
try {
do {
read = inputStreamReader.read(buf, 0, buf.length);
if (read>0) {
sb.append(buf, 0, read);
}
} while (read>=0);
} catch (IOException e) {
Log.e("IOException readTextFile", e.getMessage());
}
return sb.toString();
}
正確に。これについて考えてみましょう。バイト配列を入力ストリームの長さだけ長くし、ファイルのサイズが4GBであれば、そのファイルの4GBすべてをRAMにロードし、コンピュータの速度を落とし、潜在的にシステムクラッシュを引き起こす可能性があります。これは、一度に1024バイトを読み込んで、アレイで使用されているメモリの量を最小限に抑える理由です。 – OzzyTheGiant