문제

I am reading a .jpg file over InputStream using this code but I am receiving NULNUL...n stream after some text. Ii am reading this file link to file and link of file that I received , link is Written File link.

    while ((ret = input.read(imageCharArray)) != -1) {
    packet.append(new String(imageCharArray, 0, ret));

    totRead += ret;
            imageCharArray = new char[4096];
       }


   file = new File(
     Environment.getExternalStorageDirectory()
       + "/FileName_/"
       + m_httpParser.filename + ".jpg");
   PrintWriter printWriter = new PrintWriter(file);
   // outputStream = new FileOutputStream(file);  //also Used FileoutputStream for writting
   // outputStream.write(packet.toString().getBytes());//
   // ,
   printWriter.write(packet.toString());
   // outputStream.close();
   printWriter.close();
 }

I have also tried FileoutputStream but hardlucj for this too as commented in my code.

Edit I have used this also. I have a content length field upto which i am reading and writing

    byte[] bytes = new byte[1024];
int totalReadLength = 0;

// read untill we have bytes
while ((read = inputStream.read(bytes)) != -1
        && contentLength >= (totalReadLength)) {

    outputStream.write(bytes, 0, read);
    totalReadLength += read;
    System.out.println(" read size ======= "
            + read + " totalReadLength = "
            + totalReadLength);

}
도움이 되었습니까?

해결책

String is not a container for binary data, and PrintWriter isn't a way to write it. Get rid of all, all, the conversions between bytes and String and vice versa, and just transfer the bytes with input and output streams:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

If you need to constrain the number of bytes read from the input, you have to do that before calling read(), and you also have to constrain the read() correctly:

while (total < length && (count = in.read(buffer, 0, length-total > buffer.length ? buffer.length: (int)(length-total))) > 0)
{
    total += count;
    out.write(buffer, 0, count);
}

다른 팁

I tested it in my Nexus4 and it's working for me. Here is the snippet of code what I tried :

public void saveImage(String urlPath)throws Exception{ 
        String fileName = "kumar.jpg";
        File folder = new File("/sdcard/MyImages/");
        // have the object build the directory structure, if needed.
        folder.mkdirs();


        final File output = new File(folder,
                fileName);
        if (output.exists()) {
            output.delete();
        }

        InputStream stream = null;
        FileOutputStream fos = null;
        try {

            URL url = new URL(urlPath);
            stream = url.openConnection().getInputStream();
//          InputStreamReader reader = new InputStreamReader(stream);
            DataInputStream dis = new DataInputStream(url.openConnection().getInputStream());
            byte[] fileData = new byte[url.openConnection().getContentLength()];
             for (int x = 0; x < fileData.length; x++) { // fill byte array with bytes from the data input stream
                    fileData[x] = dis.readByte();

                }
             dis.close();
            fos = new FileOutputStream(output.getPath());
            fos.write(fileData);



        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

Just Call the above function in a background thread and pass your url. It'll work for sure. Let me know if it helps.

You can check below code.

 destinationFile = new File(
 Environment.getExternalStorageDirectory()
   + "/FileName_/"
   + m_httpParser.filename + ".jpg");

BufferedOutputStream buffer = new BufferedOutputStream(new FileOutputStream(destinationFile));
byte byt[] = new byte[1024];
int i;
for (long l = 0L; (i = input.read(byt)) != -1; l += i ) {
   buffer.write(byt, 0, i);
}
buffer.close();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top