Foros del Web » Programación para mayores de 30 ;) » Java »

DataInputStream + BufferedReader ¿Cómo?

Estas en el tema de DataInputStream + BufferedReader ¿Cómo? en el foro de Java en Foros del Web. Probando las clases de entrada y salida de ficheros, tras crear un archivo mediante DataOutputStream, he visto que en la API de [URL="http://java.sun.com/j2se/1.5.0/docs/api/java/io/DataInputStream.html"]DataInputStream[/URL] aparece lo ...
  #1 (permalink)  
Antiguo 27/01/2010, 12:52
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
[Solucionado]DataInputStream + BufferedReader ¿Cómo?

Probando las clases de entrada y salida de ficheros, tras crear un archivo mediante DataOutputStream, he visto que en la API de [URL="http://java.sun.com/j2se/1.5.0/docs/api/java/io/DataInputStream.html"]DataInputStream[/URL] aparece lo siguiente

Cita:
String readLine()
Deprecated. This method does not properly convert bytes to characters. As of JDK 1.1, the preferred way to read lines of text is via the BufferedReader.readLine() method. Programs that use the DataInputStream class to read lines can be converted to use the BufferedReader class by replacing code of the form:

DataInputStream d = new DataInputStream(in);

with:

BufferedReader d
= new BufferedReader(new InputStreamReader(in));
El caso es que no consigo que aparezca nada al leer una línea utilizando .readLine(). El archivo de datos es correcto ya que sí puedo leerlo mediante los .read(), pero con readLine() no se muestra el resultado.

Éste es el código, y he probado con las dos variantes que aparecen en rojo, con idéntico resultado
Cita:
try {
DataOutputStream dos = new DataOutputStream(new FileOutputStream("src/DataOutput.txt"));
dos.writeChars("Probandocadena");

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try{
// Open the file that is the first
// command line parameter
InputStreamReader isr = new InputStreamReader(new DataInputStream(new FileInputStream ("src/DataOutput.txt")));
//InputStreamReader isr = new InputStreamReader(new FileInputStream ("src/DataOutput.txt"));

BufferedReader br = new BufferedReader(isr);
String strLine;
//Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
System.out.println (strLine);
}
//Close the input stream
br.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
Obsevando la variable strLine en el debug, parece que sí lee el fichero, pero no es capaz de convertirlo en objeto String.

Entrando más en detalles, en los value de una String normal aparecería [0] = P [1] = r ... mientras que en la cadena recuperada con .readLine, tiene la forma [0] = [1] = P [2] = [3] = r

Saludos y gracias.

Última edición por Xerelo; 28/01/2010 a las 15:17
  #2 (permalink)  
Antiguo 27/01/2010, 19:06
 
Fecha de Ingreso: marzo-2009
Mensajes: 13
Antigüedad: 15 años
Puntos: 1
Respuesta: DataInputStream + BufferedReader ¿Cómo?

Hola.

Usa:
Código PHP:
dos.writeBytes("Probandocadena"); 
Fijate como crea el archivo usando writeChars y como lo hace usando writeBytes.

Saludos.
  #3 (permalink)  
Antiguo 28/01/2010, 04:22
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: DataInputStream + BufferedReader ¿Cómo?

InputStreamReader isr = new InputStreamReader(new DataInputStream(new FileInputStream ("src/DataOutput.txt")));

-->

InputStreamReader isr = new InputStreamReader(new FileInputStream("src/DataOutput.txt"));

De hecho, si tienes que leer un fichero de texto, directamente haces un

BufferedReader theBR = new BufferedReader(new FileReader("src/DataOutput.txt"));

y listo.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #4 (permalink)  
Antiguo 28/01/2010, 12:08
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: DataInputStream + BufferedReader ¿Cómo?

Cita:
Fijate como crea el archivo usando writeChars y como lo hace usando writeBytes.

Saludos.
Lo he probado, y sigue sin mostrarse por pantalla, pero en este caso el value de la String es de la forma

[0] =
[1]=
[2]=
[3]= Símbolo extraño
[4] = P
[5] = r
[6] = o

Cita:
De hecho, si tienes que leer un fichero de texto, directamente haces un

BufferedReader theBR = new BufferedReader(new FileReader("src/DataOutput.txt"));
Obtengo el mismo resultado que intercalando un InputStream, recuerda que el fichero que trato de leer fue guardado con DataOutputStream, no con un Writer.

Sé que existen otros métodos más cómodos para guardar y leer información en ficheros, pero lo que quiero es probar las características de cada uno de ellos.

Lo que no entiendo es que en la API se recomiende usar una alternativa que no funciona. Si lo que están recomendando es no usar DataOutputStream ni DataInputStream, que señalen las clases como deprecated, no sólo el método DataInputStream.readLine()

Gracias por las contestaciones.
  #5 (permalink)  
Antiguo 28/01/2010, 13:02
 
Fecha de Ingreso: marzo-2009
Mensajes: 13
Antigüedad: 15 años
Puntos: 1
Respuesta: DataInputStream + BufferedReader ¿Cómo?

Pues a mi con este codigo me funciona bien:

[URL="http://img64.imageshack.us/img64/7820/imgp.jpg"]Captura[/URL]
  #6 (permalink)  
Antiguo 28/01/2010, 13:35
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: DataInputStream + BufferedReader ¿Cómo?

hola.

No sé si es el caso, pero puede ser problema del fichero. readLine() lee hasta encontrar un fin de línea, si no lo encuentra, hay problemas (devuelve null). Y el problema puede ser la distinta forma de fin de linea de ficheros unix/linux y de windows. Los primero ponen /n y los segundos son dos caracteres /r/n. Si lees un fichero unix desde windows, quizás tengas problemas.

De hecho, en el writeChars("probandocadena") no escribes en el fichero ningún fin de línea, por lo que readLine() tendrás problemas, mientras que read() lo leerá bien. Escribe writeChars("probandocadena/r/n"); o con println().

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 28/01/2010, 15:16
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: DataInputStream + BufferedReader ¿Cómo?

Gracias a todos, creo que ya funciona, aunque a medias.

Tal y como dice pepinliria (gracias por la captura), con writeBytes ahora sí me funciona, incluso sin que exista un retorno de carro, como apuntaba chuidiang. Eso sí, con writeChars, no lo lee ni con \n ni sin ella (estoy en Linux, no sé si será por eso).

Lo que sí es que pensaba que que con el readLine() leería todo el contenido de una "línea" y lo devolvía como cadena. Pero creo que sólo admite leer "líneas" creadas con writeBytes. Si una "línea" empieza por writeInt o writeChar, lo que viene a continuación no lo lee, y lo mismo sucede con los char o ints que vengan después de una cadena.

Cita:
//No lee esta línea
dos.writeInt(22);
dos.writeBytes("Probandocadena");

//No lee la línea de int
dos.writeInt(22);
dos.writeChar('\n');
dos.writeBytes("Probandocadena");

//No lee el char
dos.writeBytes("Probandocadena");
dos.writeChar('p');
Gracias a todos por vuestras respuestas.
  #8 (permalink)  
Antiguo 28/01/2010, 16:31
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: DataInputStream + BufferedReader ¿Cómo?

Si lo estas escribiendo con un DataOutputStream no lo estas guardando con un formato de texto puro, así que es normal que tengas problemas.

Si lo quieres recuperar por lineas, escribelo como un fichero de texto con un writer y luego lo podras leer por lineas con un reader.

Lo mejor es recuperarlo de la misma forma que se almacena, ya que es la forma que da menos problemas. No es un problema del API.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #9 (permalink)  
Antiguo 29/01/2010, 12:58
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: DataInputStream + BufferedReader ¿Cómo?

Como se puede ver en el código que puse al inicio, lo estaba guardando con OutputStream, y como ya he dicho, mi objetivo no era escribir y recuperar una línea de un fichero, sino probar el funcionamiento de los DataStream en concreto.

No digo que tenga que leerse la String de tal o cual manera, pero a mí me parece un fallo/carencia de la API de DataInputStream, que te recomienden usar el método readLine() de BufferedStream para leer líneas, sin especificar que sólo es válido para contenido String y sin comentar que el método de escritura debe ser writeBytes().

Teniendo en cuenta que existe un writeChars() que admite String como parámetro, creo que es fácil confundirse y llegar a la conclusión de que el método adecuado es writeChars(), sobre todo porque existe un método para leer arrays de bytes, así que la relación Bytes-String parece menos inmediata que Char-String.

char => writeChar => readChar
int => writeInt => readInt
byte => writeByte => readByte

String => writeByte => readLine

No, no parece muy evidente.
  #10 (permalink)  
Antiguo 29/01/2010, 15:43
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: DataInputStream + BufferedReader ¿Cómo?

Sólo digo que si lo guardas con DataOutputStream a base de Strings, que no implican lineas, lo normal es leerlo con DataInputStream, sin leerlo linea a linea.
Si lo quieres recuperar linea a linea, entonces es mejor escribirlo linea a linea.

Y lo que te estçan recomendando es que si tienes un fichero con textos separados por lineas, lo leas con BufferedReader/InputStreamReader por que esa es la forma más adecuada y que respeta el encoding. Pero si lo has escrito con DataOutputStream, no es un fichero de texto linea a linea, así que la recomendación no es válida.

En la documentación, en el consejo te lo dice:
Cita:
As of JDK 1.1, the preferred way to read lines of text is via the BufferedReader.readLine() method
Y tu no estás leyendo lineas de texto, estás leyendo Strings puros y duros. En el caso de querer leer Strings, el método es readUTF(), el cual sí que es poco intuitivo... pero no querían llamarlo readString() básicamente por que quieren dejar claro que sólo pueden asegurar que funciona si lo has escrito con un writeUTF().

Así que con String es writeUTF()/readUTF(). En realidad writeBytes(String) no es para escribir Strings y luego recuperarlas ya que descarta información y escribe los bytes uno a uno. Francamente, no se que uso tendrá pero será para algún caso raro. Poco intuitivos los nombres, sí.

El aviso simplemente es para que la gente no se confunda e intente leer un fichero de texto con un DataInputStream, ya que no es para eso. Pero si lo has escrito con un DataOutputStream, no es realmente un fichero de texto.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:00.