0

ソケットから画像ファイルを読み取るために次のコードを使用しています。サーバーとAndroidマシンのファイルのサイズが同じであるため、サーバーからすべてのバイトを読み取ります。このファイルを開くと、ファイルが開かれず、ファイルが破損しているか大きすぎるというエラーが生成されます。

                public Bitmap fileReceived(InputStream is)
        throws FileNotFoundException, IOException {

        Bitmap bitmap = null;  
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        String fileName = "a.png";
        String imageInSD = baseDir + File.separator + fileName;
            System.out.println(imageInSD);
        if (is!= null) {
            FileOutputStream fos = null;
            BufferedOutputStream bos = null;
            try {

                fos = new FileOutputStream(imageInSD);
                bos = new BufferedOutputStream(fos);
                byte[] aByte = new byte[1024];
                int bytesRead;

                while ( true  ) {  
                    bytesRead = is.read(aByte);

                    bos.write(aByte, 0, bytesRead);
                if ( is.available()==0)
                    break;
                }  

                bos.flush();
                bos.close();
          //      is.reset();

        // here it give error i.e --- SkImageDecoder::Factory returned null
               bitmap = BitmapFactory.decodeFile(imageInSD);



            } catch (IOException ex) {
                // Do exception handling
                Log.i("IMSERVICE", "exception ");
            }
        }

        return bitmap;
    }
4

1 に答える 1

0

これには使用しないでくださいavailable()。確実に機能しません。

ドキュメントの状態:

[available()]読み取ることができるバイト数の見積もりを返します[...]このメソッドの戻り値を使用して、このストリーム内のすべてのデータを保持することを目的としたバッファーを割り当てることは決して正しくありません。

それを好きにしてください:

while ( (bytesRead = is.read(aByte)) > 0 ) {
    bos.write(aByte, 0, bytesRead);
}
于 2012-12-27T19:22:33.970 に答える