我们有一个Java套接字连接应用程序,可以从gps设备接收数据。现在的问题有时是我们收到损坏的数据并在设备上检查日志时,一切都很好。首先使用了BufferedReader,并怀疑是罪魁祸首。我们搬到inpustream的问题仍然存在。损坏是随机的,不是固定的时间间隔。以下是代码段。

public void run() {

     String completeMessage="";
     //BufferedReader readerBuffer = null;
     InputStream is = null;
     BufferedWriter writeBuffer = null;

     try {
         //readerBuffer = new BufferedReader(new InputStreamReader(sockConn1.getInputStream()));
         is = sockConn1.getInputStream();
         writeBuffer = new BufferedWriter(new OutputStreamWriter(sockConn1.getOutputStream()));

         int readChar=0;

         sockConn1.setSoTimeout(120000);
         //dbConnection = connectionPool.getConnection();
         //dbConnection.setAutoCommit(false);
           int readChar
            while ((readChar=is.read()) != -1)
             {

                 System.out.println("Char value: "+(char)readChar) ;
                  if (readChar == '*') {
                   try {

                     //writeBuffer.write("@@\r\n\r\n");
                     //writeBuffer.flush();
                     //db processing
                    dbConnection.commit();
                   }
                   catch (SQLException ex){
                         ex.printStackTrace();
                            try{
                            dbConnection.rollback();
                            }
                            catch (Exception rollback){
                                rollback.printStackTrace();
                            }
                  }
                  catch (Exception e){
                        e.printStackTrace(System.out);
                            try{
                            dbConnection.rollback();
                            }
                            catch (Exception rollback){
                                rollback.printStackTrace(System.out);
                            }
                  }
                  finally{
                        try{
                            if ( dbStmt != null ){
                              dbStmt.close();
                            }
                        }
                        catch(SQLException ex){
                            ex.printStackTrace(System.out);
                        }
                      }
                completeMessage="";
                }

             }
          }
          catch (SocketTimeoutException ex){
               ex.printStackTrace();
          }
          catch (IOException ex){
               ex.printStackTrace();
          }
          catch (Exception ex){
               ex.printStackTrace();
          }
          finally{
            try{
                if ( dbConnection != null ){
                  dbConnection.close();
                }
            }
            catch(SQLException ex){
                 ex.printStackTrace();
            }
            try{
                if ( writeBuffer != null ){
                    writeBuffer.close();
                }
            }
            catch(IOException ex){
               ex.printStackTrace(System.out);
            }
          }

      }

最佳答案

这儿存在一个问题。您将二进制数据读/写为文本:


InputStream,OutputStream =二进制数据
读者,作家=文字


这是通过:


新的InputStremReader(inputStream,charEncoding)
新的OutputStreamWriter(outputStream,charEncoding)


字符串到字节的桥接方式是:


新的String(bytes,charEncoding)
string.getBygtes(charEncoding)


其中charEncoding是可选参数,默认为操作系统编码。

使用UTF-8(Unicode多字节编码),如果做错了,很快就会遇到麻烦。另外,其他编码的字节也有问题。

因此,请勿使用阅读器/书写器。

read()传递一个int,文件末尾为-1,否则为字节值。
似乎使用read()进行的测试会丢掉一个字节,而后续的读取不会测试-1。

10-08 13:22