Java Android,从输入流创建文件挂起,同时循环

Java Android,从输入流创建文件挂起,同时循环,java,android,retrofit,fileoutputstream,Java,Android,Retrofit,Fileoutputstream,上面的代码应该从输入流创建一个pdf文件。但是,它卡在while循环中。它打印 try { Log.d("TEST", "start converting..."); File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "out.pdf"); file.createNewFile(); OutputStream

上面的代码应该从输入流创建一个pdf文件。但是,它卡在while循环中。它打印

try {

    Log.d("TEST", "start converting...");

    File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "out.pdf");
    file.createNewFile();
    OutputStream out = new FileOutputStream(file);

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

    while ((read = resp.getBody().in().read(bytes)) != -1) {
        out.write(bytes, 0, read);
        Log.d("TEST", "looping");
    }

    Log.d("TEST", "finish converting");

} catch (IOException e) {
    e.printStackTrace();
}

一直如此。有什么想法吗?

基于此javadoc for TypedInput:

以流形式读取字节。除非另有规定,否则本方法可以 只能叫一次。来电者有责任关闭电话 小溪

我猜每次调用in()都会创建一个新的InputStream。因此,您永远不会退出while循环,因为每次通过时都会有一个新的InputStream

相反,只需像这样调用()一次,看看是否可以解决问题:

looping

resp变量是什么类型?@DerGolem只是一个typo@user230137它的类型是Response,改型Response object在while中放入一条Log语句,它将输出读取的内容。知道它认为每次读取多少字节会很有用。@DerGolem不工作,因为读取类型为int
    InputStream in = null;

    try {

        Log.d("TEST", "start converting...");

        File file = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
                "out.pdf");
        file.createNewFile();
        OutputStream out = new FileOutputStream(file);

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

         in = resp.getBody().in();

        while ((read = in.read(bytes)) != -1) {
            out.write(bytes, 0, read);
            Log.d("TEST", "looping");
        }

        Log.d("TEST", "finish converting");

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (in != null) {
             in.close();
        }
    }