[技术总结]利用java网络通讯实现文件传输的编码问题.

前言: 总结了一下使用不当的char 和 byte 数组转换. 已经相关的问题.

1. 用到的类. FileReader  和 FileWriter ,操作方式 char[] 数组,

  if (TransState == this.FT_ONTRANSFILEBODY){
     // sendstr =transfilename;
      try {
        FileReader fr = new FileReader(transfilename);
        char buf[] = new char[2048];
        int i=0;
      while((i=fr.read(buf,0,2048))!=-1){
        // sendstr = buf.toString(); char[] to bytebuffer?
        //转换 buffer
        //Converter convertor= ByteToCharConverter.getDefault();

        byte[] bytes = new byte[i];
        //?? char byte 转换?
        for(int k=0;k<i;k++)
          bytes[k] = (byte) buf[k]; 强制转换真是愚蠢至极啊!!
    
   //?
        appendSendData(bytes);
       // initiateSend();
        System.out.println("ok i am sending /:"+ i+" /bytes");
      }
      System.out.println("ok i send over!");
      fr.close();

        byte[] bytes = new byte[i];
        //?? char byte 转换?
        for(int k=0;k<i;k++)
          bytes[k] = (byte) buf[k]; 强制转换真是愚蠢至极啊!!
    
   //?
        appendSendData(bytes);
       // initiateSend();
        System.out.println("ok i am sending /:"+ i+" /bytes");
      }
      System.out.println("ok i send over!");
      fr.close();

        byte[] bytes = new byte[i];
        //?? char byte 转换?
        for(int k=0;k<i;k++)
          bytes[k] = (byte) buf[k]; 强制转换真是愚蠢至极啊!!
    
   //?
        appendSendData(bytes);
       // initiateSend();
        System.out.println("ok i am sending /:"+ i+" /bytes");
      }
      System.out.println("ok i send over!");
      fr.close();

        byte[] bytes = new byte[i];
        //?? char byte 转换?
        for(int k=0;k<i;k++)
          bytes[k] = (byte) buf[k]; 强制转换真是愚蠢至极啊!!
    
   //?
        appendSendData(bytes);
       // initiateSend();
        System.out.println("ok i am sending /:"+ i+" /bytes");
      }
      System.out.println("ok i send over!");
      fr.close();

 服务器端:

else if(TransState == this.FT_ONTRANSFILEBODY){
         char[] buf = new char[2048];
         //?接收文件模式?
         int c =0;
         try {
         while ( (c = inbuffer.read(buf)) != -1) {
          //?writefile
          //try test. buf 0   –  6.
         String eof = new String(buf,0,6);
             if (eof.equals("FILEOK")) // 如果返回 fileok 关闭,退出.
             {
                   fw.close();
                   System.out.println(" Server recv End");
                   this.TransState = this.FT_TRANSFILEBODYOK;
                   break;
             }

             if (fw == null) fw = new FileWriter("c:\\code\\" + recvfilename);
             fw.write(buf, 0, c); //不断的写入文件中.
            }

结果是:服务器端收到的文件的大小和原文件不一致.仔细想想原来是在转化  char[] ->> byte[] 的时候得问题..

使用另外一种方式操作 byte[]的   InputStream / OutputStream 直接操作字节,

这会省去了char[] ->> byte[]的转换,数据也就正常了. 服务器接收一端对应的处理修改一下就可以了. 

稍后查了一下: 使用Converter 是可以将 char[] 转换成 byte [], 因为 char 涉及到编码问题, 如果是中文的话也认为是一个字符,读出来的时候 在强制转化的时候就抱错了, 比如: CA 转化成byte就只是 49了..所以丢掉了一些数据.

// 举个例子

String str =”英”;
//取得GB2312编码的字节
byte[] bytesGB2312 = str.getBytes(“GB2312”);

//取得平台缺省编码的字节(solaris为ISO8859_1,windows为GB2312)
byte[] bytesDefault = str.getBytes();

//用指定的编码将字节转换成字符串
String newStrGB = new String(bytesGB2312, “GB2312”);

再来一个高低位调换的函数: 如果利用原有Server或者Server不能做修改(通常是c/c++)就会遇到这个问题的.

 /**
   * 将int转为低字节在前,高字节在后的byte数组
   */
  private static byte[] toLH(int n) {
    byte[] b = new byte[4];
    b[0] = (byte) (n & 0xff);
    b[1] = (byte) (n >> 8 & 0xff);
    b[2] = (byte) (n >> 16 & 0xff);
    b[3] = (byte) (n >> 24 & 0xff);
    return b;
  }

呵呵.总而言之就是不要做理论的巨人 行动的矮子. 下面我就要把用户列表管理部分和引擎连接起来了.基本上很快就能传接起来了..

Leave a comment

0 Comments.

Leave a Reply


[ Ctrl + Enter ]

click to change验证码

无觅相关文章插件