Android,读取二进制数据并将其写入文件

时间:2011-02-17 17:09:43

标签: python android sockets file-io

我试图从服务器读取图像文件,代码如下。它继续进入例外。我知道正在发送正确的字节数,因为我在收到时打印出来。我像这样从python发送图像文件

#open the image file and read it into an object
        imgfile = open (marked_image, 'rb')  
        obj = imgfile.read()

       #get the no of bytes in the image and convert it to a string
        bytes = str(len(obj))


        #send the number of bytes
        self.conn.send( bytes + '\n')




        if self.conn.sendall(obj) == None:
            imgfile.flush()
            imgfile.close()
            print 'Image Sent'
        else:
            print 'Error'

这是android部分,这是我遇到问题的地方。有关接收图像并将其写入文件的最佳方法的任何建议吗?

//read the number of bytes in the image
       String noOfBytes =  in.readLine();


       Toast.makeText(this, noOfBytes, 5).show();

       byte bytes [] = new byte [Integer.parseInt(noOfBytes)];

       //create a file to store the retrieved image
       File photo = new File(Environment.getExternalStorageDirectory(),  "PostKey.jpg");

       DataInputStream dis = new DataInputStream(link.getInputStream());
       try{


        os =new FileOutputStream(photo);

        byte buf[]=new byte[1024];

        int len;

        while((len=dis.read(buf))>0)
        os.write(buf,0,len);

        Toast.makeText(this, "File recieved", 5).show();

        os.close();
        dis.close();
       }catch(IOException e){

           Toast.makeText(this, "An IO  Error Occured", 5).show();
       }
编辑:我似乎仍然无法让它发挥作用。从那以后我一直在这里,我所有努力的结果要么导致文件不是完整的大小,要么是应用程序崩溃。我知道在发送服务器端之前文件没有损坏。据我所知,它肯定会发送,因为python中的send all方法发送全部或在发生错误时抛出异常,到目前为止它从未抛出异常。所以客户端搞砸了。我必须从服务器发送文件,所以我不能使用Brian建议的建议。

3 个答案:

答案 0 :(得分:1)

从服务器获取位图的最佳方法是执行以下操作。

HttpClient client = new DefaultHttpClient();

HttpGet get = new HttpGet("http://yoururl");

HttpResponse response = client.execute(get);
InputStream is = response.getEntity().getContent();

Bitmap image = BitmapFactory.decodeStream(is);

这将为您提供位图,将其保存到文件中执行以下操作。

FileOutputStream fos = new FileOutputStream("yourfilename");
image.compress(CompressFormat.PNG, 1, fos);
fos.close();

您也可以将两者合并,直接写入磁盘

HttpClient client = new DefaultHttpClient();

HttpGet get = new HttpGet("http://yoururl");

HttpResponse response = client.execute(get);
InputStream is = response.getEntity().getContent();

FileOutputStream fos = new FileOutputStream("yourfilename");

byte[] buffer = new byte[256];
int read = is.read(buffer);

while(read != -1){
    fos.write(buffer, 0, read);
    read = is.read(buffer);
}

fos.close();
is.close();

希望这会有所帮助;

答案 1 :(得分:0)

我不确定我理解你的代码。您正在致电dis.readFully(bytes);dis的内容写入byte数组。但是你不对数组做任何事情,然后尝试通过缓冲区将dis的内容写入FileOutputStream

尝试注释掉dis.readFully(bytes);行。

作为旁注,我会写日志而不是弹出一个吐司,比如字节数或发生异常时:

...
} catch (IOException e) {
    Log.e("MyTagName","Exception caught " + e.toString());
    e.printStackTrace();
}

您可以查看这些链接,了解将文件写入SD卡的示例:

答案 2 :(得分:-1)

我在Ubuntu论坛成员的帮助下解决了这个问题。这是问题的字节读数。它正在削减图像中的一些字节。解决方案是只发送整个图像并从方程中一起删除字节的发送