Soy relativamente nuevo en Java y estoy intentando escribir una aplicación de Android simple. Tengo un archivo de texto grande con aproximadamente 3500 líneas en la carpeta de activos de mis aplicaciones y necesito leerlo en una cadena. Encontré un buen ejemplo sobre cómo hacer esto, pero tengo una pregunta acerca de por qué la matriz de bytes se inicializa en 1024. ¿No quisiera inicializarla a la longitud de mi archivo de texto? Además, ¿no quisiera utilizar char
, no byte
? Aquí está el código:por qué inicializar esta matriz de bytes a 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();
}
EDITAR: En función de sus sugerencias, probé este enfoque. ¿Es mejor? Gracias.
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();
}
Exactamente. Piense en esto: si crea la matriz de bytes siempre que la longitud de la secuencia de entrada, y si el archivo se dijera, 4 GB de tamaño, estaría cargando los 4 GB de ese archivo en la memoria RAM, ralentizando su computadora y potencialmente causando un bloqueo del sistema. Es por eso que lee 1024 bytes a la vez, para minimizar la cantidad de memoria que utiliza la matriz. – OzzyTheGiant