Problema con un string

Tengo un String que al mostrarlo por la pantalla se muestra perfectamente pero al almacenarlo en un archivo de texto se almacena como un "cuadrado"
Te dejo la parte del código en la que se me presenta el problema
try {
x=1;
while( entrada.available() > 0 ) {
int nBytes = entrada.read( bufferLectura );
}
//System.out.print( new String(bufferLectura) );
variable=new String(bufferLectura);
var1="fin fila";
var2=variable;
//System.out.println(variable);
FileWriter fichero= null;
PrintWriter pw = null;
try{
fichero = new FileWriter("c:/Archivos de programa/Java/jdk1.6.0_13/bin/prueba.txt");
pw = new PrintWriter(fichero);
pw.println(var2);
System.out.println(var2);
//pw.println(variable);
}catch(Exception e){
e.printStackTrace();
}
finally{
if(null != fichero)
fichero.close();
try{
}catch(Exception e2){
e2.printStackTrace();
}
}
} catch(IOException e) {}

1 respuesta

Respuesta
1
No entiendo muy bien el problema. ¿Cuándo se muestra por pantalla qué muestra? ¿Por qué está mal que muestre "cuadrado"? ¿Cómo debería mostrarse? ¿De qué tipo son "entrada" y "bufferLectura"?
pw.println(var2); //esta linea almacena en el archivo algo como esto "[]"
System.out.println(var2); //pero al mostrar por pantalla la misma variable se muestra "fecha 20"
Necesito saber de qué tipo son var1, var2, variable y bufferLectura. No están definidas en esa parte del código. Puedo suponer que var1, var2 y variable son de tipo String, pero si alguna fuera un Object habría problemas.
si son string
Te dejo todo el código mejor
import java.io.*;
import java.util.*;
import javax.comm.*;
import java.awt.*;
import java.lang.String.*;
public class java1902 implements Runnable,SerialPortEventListener {
  static CommPortIdentifier idPuerto;
  static Enumeration listaPuertos;
  InputStream entrada;
  SerialPort puertoSerie;
  Thread tLectura;
  public java1902() {
    // Si el puerto no está en uso, se intenta abrir
    try {
      puertoSerie = (SerialPort)idPuerto.open( "AplLectura",2000 );
    } catch( PortInUseException e ) {}
    // Se obtiene un canal de entrada
    try {
      entrada = puertoSerie.getInputStream();
    } catch( IOException e ) {}
    // Añadimos un receptor de eventos para estar informados de lo
    // que suceda en el puerto
    try {
      puertoSerie.addEventListener( this );
      } catch( TooManyListenersException e ) {}
    // Hacemos que se nos notifique cuando haya datos disponibles
    // para lectura en el buffer de la puerta
    puertoSerie.notifyOnDataAvailable( true );
    // Se fijan los parámetros de comunicación del puerto
    try {
      puertoSerie.setSerialPortParams( 9600,
        SerialPort.DATABITS_8,
        SerialPort.STOPBITS_1,
        SerialPort.PARITY_NONE );
    } catch( UnsupportedCommOperationException e ) {}
    // Se crea y lanza el thread que se va a encargar de quedarse
    // esperando en la puerta a que haya datos disponibles
    tLectura = new Thread( this );
    tLectura.start();
    }
  public void run() {
    try {
      // En los threads, hay que procurar siempre que haya algún
      // método de escape, para que no se queden continuamente
      // bloqueados, en este caso, la comprobación de si hay datos
      // o no disponibles en el buffer de la puerta, se hace
      // intermitentemente
      Thread.sleep( 20000 );
    } catch( InterruptedException e ) {}
    }
  public void serialEvent( SerialPortEvent _ev ) {
    String variable, variable2, hora, batch, peso,total;
    String fecha1= new String("a");
    String fecha2= new String("b");
    int x;
    switch( _ev.getEventType() ) {
      // La mayoría de los eventos no se trata, éstos son los
// que se producen por cambios en las líneas de control del
// puerto que se está monitorizando
case SerialPortEvent.BI:
      case SerialPortEvent.OE:
      case SerialPortEvent.FE:
      case SerialPortEvent.PE:
      case SerialPortEvent.CD:
      case SerialPortEvent.CTS:
      case SerialPortEvent.DSR:
      case SerialPortEvent.RI:
      case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
        break;
      // Cuando haya datos disponibles se leen y luego se
      // imprime lo recibido en la consola
      case SerialPortEvent. DATA_AVAILABLE:
        byte[] bufferLectura = new byte[8];//valor original 20
        try {
    x=1;
          while( entrada.available() > 0 ) {
            int nBytes = entrada.read( bufferLectura );
            }//en bufferLectura tenemos los datos++++++++++++++++++++++++++++++++++++
          System.out.print( new String(bufferLectura) );
        variable=new String(bufferLectura);
        variable2=variable.substring(0,2);
        if(variable2.equals("FE")){
        fecha1 =variable.substring(6,8);//primera parte fecha
        }
        if(variable2.equals("/0")){
        fecha2 =variable.substring(0,8);//segunda parte fecha
        fecha1.concat(fecha2);//*************************************reviusar la concatenacion
          System.out.print("esta fecha"+fecha1);
        }
        } catch( IOException e ) {}
      };
    }
  public static void main( String[] args ) {
    // Lista de los puertos disponibles en la máquina. Se carga en el
    // mimo momento en que se iniciala JVM de Java
    listaPuertos = CommPortIdentifier.getPortIdentifiers();
    while( listaPuertos.hasMoreElements() ) {
      idPuerto = (CommPortIdentifier)listaPuertos.nextElement();
      if( idPuerto.getPortType() == CommPortIdentifier.PORT_SERIAL ) {
        if( idPuerto.getName().equals("COM3") ) {           // WINDOWS
          // Lector del puerto, se quedará esperando a que llegue algo
          // al puerto
          java1902 lector = new java1902();
        System.out.println("esperando datos de com3");
          }
        }
      }
    }
  }
Perdón el código anterior no era
import java.io.*;
import java.util.*;
import javax.comm.*;
import java.awt.*;
import java.lang.String.*;
import java.sql.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Container;
public class java1902 implements Runnable,SerialPortEventListener {
static CommPortIdentifier idPuerto;
static Enumeration listaPuertos;
InputStream entrada;
SerialPort puertoSerie;
Thread tLectura;
private Statement statment=null;
private Connection conexion=null;
private String dir="C:\\Archivos de programa\\Java\\jdk1.6.0_13\\bin\\pesaje.mdb";//direcion de la base de datos
private String nombre="Prueba";//nombre de la conexion
public java1902() {
try {
puertoSerie = (SerialPort)idPuerto.open( "AplLectura",2000 );
} catch( PortInUseException e ) {}
try {
entrada = puertoSerie.getInputStream();
} catch( IOException e ) {}
try {
puertoSerie.addEventListener( this );
} catch( TooManyListenersException e ) {}
puertoSerie.notifyOnDataAvailable( true );
try {
puertoSerie.setSerialPortParams( 9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE );
} catch( UnsupportedCommOperationException e ) {}
tLectura = new Thread( this );
tLectura.start();
}
public void run() {
try {
Thread.sleep( 20000 );
} catch( InterruptedException e ) {}
}
public void serialEvent( SerialPortEvent _ev ) {
String variable, variable2, variable3, variable4, batch, peso,total,cadena;
String var1= new String("");
String var= new String("a");
String var2= new String("b");
String fecha= new String("c");
String hora= new String("c");
int x;
switch( _ev.getEventType() ) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
// Cuando haya datos disponibles se leen y luego se
// imprime lo recibido en la consola
case SerialPortEvent.DATA_AVAILABLE:
byte[] bufferLectura = new byte[8];//valor original 20
try {
x=1;
while( entrada.available() > 0 ) {
int nBytes = entrada.read( bufferLectura );
}
//System.out.print( new String(bufferLectura) );
variable=new String(bufferLectura);
var1="fin fila";
var2=variable;
//System.out.println(variable);
FileWriter fichero= null;
PrintWriter pw = null;
try{
fichero = new FileWriter("c:/Archivos de programa/Java/jdk1.6.0_13/bin/prueba.txt");
pw = new PrintWriter(fichero);
pw.println(var2);
System.out.println(var2);
//pw.println(variable);
}catch(Exception e){
e.printStackTrace();
}
finally{
if(null != fichero)
fichero.close();
try{
}catch(Exception e2){
e2.printStackTrace();
}
}
} catch(IOException e) {}
};
}
public static void main( String[] args ) {
// Lista de los puertos disponibles en la máquina. Se carga en el
// mimo momento en que se iniciala JVM de Java
listaPuertos = CommPortIdentifier.getPortIdentifiers();
while( listaPuertos.hasMoreElements() ) {
idPuerto = (CommPortIdentifier)listaPuertos.nextElement();
if( idPuerto.getPortType() == CommPortIdentifier.PORT_SERIAL ) {
if( idPuerto.getName().equals("COM3") ) { // WINDOWS
// Lector del puerto, se quedará esperando a que llegue algo
// al puerto
java1902 lector = new java1902();
}
}
}
}
}
Por desgracia ahora tengo que salir. Si puedo luego o mañana temprano te lo miro
Por desgracia no puedo probar el código ya que no tengo a mano forma de leer del puerto serie. Yo creo que el problema debe residir en la lectura del string de ese puerto serie, a partir de un array de bytes. Posiblemente el string leído es capaz de escribirse bien en pantalla pero no en el archivo. Te pongo un par de cosas que puedes probar (primero por separado y luego combinadas) y me dices el resultado.
1)pw = new PrintWriter(fichero,true);
2)pw.println(var2.toString());
3)variable=new String(bufferLectura,"ISO-8859-1");
Si se produce algún resultado diferente o no se arreglar probamos otras cosas
Vale probé lo que me indicaste pero nada paso
Se me ocurre que al ser:
bufferLectura de tipo byte
Por esta razón al intentar guardar en el archivo no entiende lo que debe almacenar
¿No cambió absolutamente nada?
BufferLectura es un array de bytes, con el cual se puede crear un String. Tú dices que si imprimes el string en pantalla sale bien pero al escribirlo en el archivo se guarda mal. Prueba a guardar en el archivo otro String creado por ti (String var = new String("hola");) directamente, para ver si es porque se ha leído del array de bytes o simplemente está escribiendo mal.
Ya probé también a guardar un string como tu me indicas y si lo almacena correctamente
Otras pruebas:
1)variable=new String(bufferLectura,"UTF-8");
2)Guarda el array de bytes así:
final String nombreArch = "algo.txt";
final File arch = new File(nombreArch);
final OutputStream aSalida = new FileOutputStream(arch);
aSalida.write(bufferLectura );
aSalida.flush();
aSalida.close();

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas