Cómo abrir fichero con InputStream
Tengo la clase leesubtitulo que se encarga de abrir un fichero y pasarlo al método readFile para que separe datos en un vector. Posteriormente estos datos los tengo que imprimir por pantalla. Pues veréis, al imprimir pantalla me sale el valor "null" así que deduzco que el InputStream no funciona como debería pero no se cuál puede ser la causa.
public class leesubtitulo {
File f = new File("C:\\nombrefichero.txt");
private InputStream in = null;
Subtitulo[] subs = readFile(in);
{
try {
in = new BufferedInputStream(new FileInputStream(f));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* Lee archivo con el formato de subtitulos pasado como ejemplo
* y retorna cada linea que no es el numero del subtitulo ni tampoco
* lineas en blanco
* @param in Stream hacia el archivo que contiene los subtirulos
* @return Arreglo de subtitulos
*/
private Subtitulo[] readFile(InputStream in) {
Vector<Subtitulo> v = new Vector<Subtitulo>();
StringBuffer strBuf = new StringBuffer();
try {
int chars = 0;
boolean filaContador = true;
boolean tiempos = false;
int sub = 0;
Subtitulo subtitulo = null;
while ((chars = in.read()) != -1) {
//salta lineas en blanco
if (strBuf.length() == 0 && ((char) chars == '\n' || (char) chars == '\r')) {
//al encontrar un retorno de carro y sin ningun caracter adicionado al buffer
//se entiende que se trata de una linea vacía
if ((char) chars == '\r') {
//ademas, se establece que la siguiente línea sea saltada (filaContador =true)
filaContador = true;
continue;
}
//sino, lo que se encontró fue una nueva linea, se solicita continuar al
//siguiente caracter
if ((char) chars == '\n') {
continue;
}
}
//salta las filas que tienen el numero
if (filaContador) {
//lee toda una linea
while (chars != -1 && (char) chars != '\r') {
chars = in.read();
}
//una vez leida toda la linea, se restaura la bandera para que no la salte de nuevo
filaContador = false;
//tambien se indica que la siguiente linea es de tiempos
tiempos = true;
continue;
}
//adiciona caracter al buffer para ir formando todas las palabras
strBuf.append((char) chars);
if ((char) chars == '\n' || (char) chars == '\r') {
String strAux = strBuf.toString().trim();
if (!strAux.equals("")) {
//si se trata de la línea de tiempos, es porque se va a iniciar un nuevo subtitulo
if (tiempos) {
//si ya existe un subtitulo, se debe adicionar al vector y resetear la variable
if (subtitulo != null) {
v.addElement(subtitulo);
subtitulo = null;
}
//indica que la linea de tiempos ya no se debe leer hasta la proxima vez
tiempos = false;
//crea el subtitulo pasando el consecutivo y la linea de tiempos
subtitulo = new Subtitulo(++sub, strAux);
} else {
subtitulo.addLinea(strAux);
}
//borra el buffer para continar con la lectura
strBuf.delete(0, strBuf.length());
}
}
}
//si aun queda un subtitulo por agregar, entonces hacerlo
if (subtitulo != null) {
v.addElement(subtitulo);
subtitulo = null;
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (Exception ex) {
}
}
}
//copiar a un arreglo
Subtitulo[] split = new Subtitulo[v.size()];
v.copyInto(split);
return split;
}}
public class leesubtitulo {
File f = new File("C:\\nombrefichero.txt");
private InputStream in = null;
Subtitulo[] subs = readFile(in);
{
try {
in = new BufferedInputStream(new FileInputStream(f));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* Lee archivo con el formato de subtitulos pasado como ejemplo
* y retorna cada linea que no es el numero del subtitulo ni tampoco
* lineas en blanco
* @param in Stream hacia el archivo que contiene los subtirulos
* @return Arreglo de subtitulos
*/
private Subtitulo[] readFile(InputStream in) {
Vector<Subtitulo> v = new Vector<Subtitulo>();
StringBuffer strBuf = new StringBuffer();
try {
int chars = 0;
boolean filaContador = true;
boolean tiempos = false;
int sub = 0;
Subtitulo subtitulo = null;
while ((chars = in.read()) != -1) {
//salta lineas en blanco
if (strBuf.length() == 0 && ((char) chars == '\n' || (char) chars == '\r')) {
//al encontrar un retorno de carro y sin ningun caracter adicionado al buffer
//se entiende que se trata de una linea vacía
if ((char) chars == '\r') {
//ademas, se establece que la siguiente línea sea saltada (filaContador =true)
filaContador = true;
continue;
}
//sino, lo que se encontró fue una nueva linea, se solicita continuar al
//siguiente caracter
if ((char) chars == '\n') {
continue;
}
}
//salta las filas que tienen el numero
if (filaContador) {
//lee toda una linea
while (chars != -1 && (char) chars != '\r') {
chars = in.read();
}
//una vez leida toda la linea, se restaura la bandera para que no la salte de nuevo
filaContador = false;
//tambien se indica que la siguiente linea es de tiempos
tiempos = true;
continue;
}
//adiciona caracter al buffer para ir formando todas las palabras
strBuf.append((char) chars);
if ((char) chars == '\n' || (char) chars == '\r') {
String strAux = strBuf.toString().trim();
if (!strAux.equals("")) {
//si se trata de la línea de tiempos, es porque se va a iniciar un nuevo subtitulo
if (tiempos) {
//si ya existe un subtitulo, se debe adicionar al vector y resetear la variable
if (subtitulo != null) {
v.addElement(subtitulo);
subtitulo = null;
}
//indica que la linea de tiempos ya no se debe leer hasta la proxima vez
tiempos = false;
//crea el subtitulo pasando el consecutivo y la linea de tiempos
subtitulo = new Subtitulo(++sub, strAux);
} else {
subtitulo.addLinea(strAux);
}
//borra el buffer para continar con la lectura
strBuf.delete(0, strBuf.length());
}
}
}
//si aun queda un subtitulo por agregar, entonces hacerlo
if (subtitulo != null) {
v.addElement(subtitulo);
subtitulo = null;
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (Exception ex) {
}
}
}
//copiar a un arreglo
Subtitulo[] split = new Subtitulo[v.size()];
v.copyInto(split);
return split;
}}
Respuesta de dimondi21
1