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;
}}

1 Respuesta

Respuesta
1
Aquí lo dice todo
private InputStream in = null; //se le tiene que pasar como parametro el archivo
Subtitulo[] subs = readFile(in);
¿Le estas metiendo al readfile un valor NULL como parámetro no te das cuenta? Jajaja La manera correcta de leer un archivo es esta
File archivo = null; FileReader fr = null; BufferedReader br = null;
// Apertura del fichero y creacion de BufferedReader para poder
// hacer una lectura comoda (disponer del metodo readLine()).
archivo = new File ("C:\\archivo.txt");
fr = new FileReader (archivo);
br = new BufferedReader(fr);
// Lectura del fichero String linea;
while((linea=br.readLine())!=null) System.out.println(linea);
if( null != fr ){ fr.close(); }
Pruébalo y me cuentas.
Hola, gracias por contestar. El código que pones funciona, pero es genérico para leer cualquier fichero. Yo lo que quiero es que la lectura la haga el método readFile que tengo creado por eso intentaba pasarle el archivo por parámetro pero no lo logré.
Mi fichero tiene un texto específico formado por tiempos, texto y caracteres. Es por eso que intento usar el método.
A ver si me puedes indicar como hacer eso.
Gracias de nuevo.
Un saludo.
Mandame al mail tu correo y tu modelo de archivo para probar el código.
[email protected]
Hey una pregunta, estoy probando tu código y tengo un problemita con esto
1) Subtitulo[] subs = readFile(in); y esto tambien
2) private Subtitulo[] readFile(InputStream in)
_____
1) ¿Subtitulo qué cosa es? Una clase (¿dónde esta definina?), un método(¿de qué tipo?), una variable(¿de qué tipo?)
2) private que subtitulo, le falta algo, private class? private void ? esa parte no la entiendo.
_____
Imagino que debes tener una clase subtitulo para poder hacer referencia a una variable de tipo subtitulo, ¿podrías pasarme esa clase por favor? O simplemente mandame al maiil todo el proyecto java con el código completo ya que con lo que trengo me sale error en todo lo que sea el vector subtitulo
Acabo de revisar tu mail, y he encontrado un error, pero un error totalmente garrafal, has confundido la inicialización de la clase leesubtitulo con un método.
He creado una clase main nueva, el método main tendría la siguiente estructura
public static void main(String[] args) throws FileNotFoundException {
leesubtitulo lee=new leesubtitulo();
lee.leesubtitulo();
}
Ahora en su clase lee subtitulo he añadido un simple void a su constructor
public void leesubtitulo() throws FileNotFoundException.... y tambien he cambiado el
f.exist() por f!=null,
____
Luego al correr el metodo main, saldria un reporte como este.
ID = 1
INICIO = 00:00:51,960
FIN = 00:00:55,970
MIllis inicio = 51959
MIllis final = 51959
Linea 1 = Esta es la Tierra en la época
Linea 2 = en que los dinosaurios deambulaban...
ID = 2
INICIO = 00:00:56,300
FIN = 00:00:58,800
MIllis inicio = 56299
MIllis final = 56299
Linea 1 = ...por un planeta verde y fértil.
Lo mismo ocurre hasta tener el ID = 2083, así que creo que con añadir un simple void a su constructor de leesubtitutlo, el problema esta arreglado.
_____
OJO: He cambiado el .srt a .txt para ver si el archivo tiene la estructura correcta, y he sacado los comentarios y el ejemplo, solo he deado la siguiente estructura
1
00:00:51,960 --> 00:00:55,970
Esta es la Tierra en la época
En que los dinosaurios deambulaban...


2
00:00:56,300 --> 00:00:58,800
... por un planeta verde y fértil.


3
00:01:06,230 --> 00:01:09,730
Un pedazo de piedra
de tan sólo 10 km ancho...


6
00:01:26,710 --> 00:01:31,340
Un billón de kgs. De polvo
y piedras saltaron a la atmósfera...

...
...
Sin esa estructura no iba a poder leer bien el archivo porque hay cosas ahí que no tienen nada que ver...
Le explico, los datos en java se pueden iniciazliar con un signo de igual en cualquier método, ahora hay otra manera de iniciarlizar los datos, esta manera es mediante el constructor, al hacer referencia a otra clase, se le hace =new Nuevaclase() y los paréntesis vendría a ser un constructor tácito que no aparece en la clase, pero ud lo ha definico al usar el public leesubittulo, esto seria iwal al new leesubtitulo(), por eso es que no puede abrir el archivo, al convertirlo en un método, problema arreglado.
Solo he usado modificado las clase leesubtitutlo y he creado una clase Main, sus otras 2 clases de subtitutlo y Tab2 no las he tocado para nada.
Espero haberlo ayudado, cualquier inquietud no dudes en preguntarme, para eso estamos, para ayudar y espero haberlo hecho.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas