-2

我有自定义socket客户端服务器数据(文件或文本)传输代码。现在,当我传输二进制文件时,一些字节转换为超出范围的字符。所以我以十六进制字符串发送它们。这样可行。但是对于另一个问题,这不是解决方案。这也有性能问题。

我从Java 代码中获得了帮助 To convert byte to Hexadecimal

当我从网上下载图像时,也会发生同样的事情。一些字节变成了别的东西。我已经逐字节比较了字节。转换成字符串显示?而不是符号。我已经尝试过阅读器和字节数组输入流。我已经尝试了网络上的所有示例。我可能会犯什么错误?

我的代码将字节保存到文件:

void saveFile(String strFileName){  


 try{  
         URL url = new URL(strImageRoot + strFileName);  
         BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));  
         BufferedWriter bw = new BufferedWriter(new FileWriter(strImageDownloadPath + strFileName));  
         String line = null;  
         while ( (line = reader.readLine()) != null) {  
            bw.write(line);  
         }  
     }catch(FileNotFoundException fnfe){  
        System.out.println("FileNotFoundException occured!!!");  
     }catch(IOException ioe){  
     }catch(Exception e){  
        System.out.println("Exception occured : " + e);  
     }finally{  
        System.out.println("Image downloaded!!!");  
     }  
}   
4

3 回答 3

1

我在构建 Socket 客户端服务器应用程序时遇到了类似的问题。字节会是一些奇怪的字符,我尝试了各种方法来尝试比较它们。然后我遇到了一个讨论,其中 some1 向我指出我应该使用 datainputstream、dataoutstream 并让它进行字节之间的转换。这对我完全有用。我根本没有碰过字节。

于 2012-04-21T03:27:51.027 回答
1

使用此代码

           File root = android.os.Environment.getExternalStorageDirectory();               

           File dir = new File (root.getAbsolutePath() + "/image");
           if(dir.exists()==false) {
                dir.mkdirs();
           }

           URL url = new URL("http://4.bp.blogspot.com/-zqJs1fVcfeY/TiZM7e-pFqI/AAAAAAAABjo/aKTtTDTCgKU/s1600/Final-Fantasy-X-Night-Sky-881.jpg");
           //URL url = new URL(DownloadUrl);
           //you can write here any link
           File file = new File(dir,"Final-Fantasy-X-Night-Sky-881.jpg");



           long startTime = System.currentTimeMillis();


            //Open a connection to that URL. 
           URLConnection ucon = url.openConnection();


            //* Define InputStreams to read from the URLConnection.

           InputStream is = ucon.getInputStream();
           BufferedInputStream bis = new BufferedInputStream(is);


            //* Read bytes to the Buffer until there is nothing more to read(-1).

           ByteArrayBuffer baf = new ByteArrayBuffer(6000);
           int current = 0;
           while ((current = bis.read()) != -1) {
              baf.append((byte) current);
           }


            //Convert the Bytes read to a String. 
           FileOutputStream fos = new FileOutputStream(file);
           fos.write(baf.toByteArray());
           fos.flush();
           fos.close();
于 2012-04-21T06:15:40.707 回答
1

您应该借助此链接:How to encode decode in base64 in Android

您可以通过编码从文件中获取的字节数组作为字符串发送到Base64. 这也减少了传输的数据量。

在接收端,只需使用解码字符串Base64并获取字节数组。

然后您可以使用@Deepak Swami 的解决方案将字节保存在文件中。

我最近发现 PHP 服务 API 不知道什么是字节数组。任何 String 都可以同时是字节流,因此 API 要求请求参数中包含 Base64 字符串。请看帖子:

php中的字符串到字节数组

在 URL 中传递 base64 编码的字符串

因此,Base64 非常重要,因为它还允许您在首选项中保存字节数组,并且如果您必须使用序列化通过网络发送文件数据,则可以提高性能。

快乐编码:-)

于 2018-10-13T10:07:24.520 回答