如何读取资产到inputFileStream?

时间:2018-04-16 08:01:36

标签: android firebase firebase-storage

我的目标是将图片放入资源文件夹中,稍后将其上传到Firebase存储。由于图像文件将与应用程序一起打包,我需要使用Firebase的putStream方法来上传文件。但是,我无法将图像文件读入流。

我尝试过的事情:

public static InputStream readAssetsFileToStream(String fileName, Context context) {
    AssetManager assManager = context.getAssets();
    InputStream is = null;
    try {
        is = assManager.open(fileName);
    } catch (Exception e) {
        e.getMessage();
    } finally {
        try {
            if (is != null)
                is.close();
        } catch (Exception e2) {
            e2.getMessage();
        }
    }
    InputStream isOutput = new BufferedInputStream(is);
    return isOutput;
}

然后需要上传文件的位置:

public  void uploadFile() throws IOException {

        Log.i("Firebase", "Upload started!");

       InputStream is = readAssetsFileToStream("abc", getApplicationContext());



        int size = is.available();
        byte[] buffer = new byte[size]; //declare the size of the byte array with size of the file
        is.read(buffer); //read file
        is.close(); //close file

        String streamData = new String(buffer);
     //   Uri file = Uri.fromFile(new File("path/to/raw/book.pdf"));sourc

      //  StorageReference riversRef = mStorageRef.child("/quadcopter.pdf");


        mStorageRef.putStream(is)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        // Get a URL to the uploaded content
                        Uri downloadUrl = taskSnapshot.getDownloadUrl();
                        Log.i("Firebase", downloadUrl.toString());
                        Log.i("Firebase", "Upload Successful!");
                    }


                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        Log.i("Firebase", "Upload failed");
                        Log.i("Firebase", exception.getMessage());
                        // ...
                    }
                }).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                Log.i("Firebase", "Upload Complete!");

            }
        }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                Log.i("Firebase", String.valueOf(taskSnapshot.getBytesTransferred()));
            }
        });
    }

上传文件时,我收到错误:

    int size = is.available();

说,

java.io.IOException: BufferedInputStream is closed

我的项目结构:

enter image description here

我需要上传&#39; abc.jpg&#39;文件。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

readAssetsFileToStream的finally块中关闭流:

finally {
        try {
            if (is != null)
                is.close();
        } catch (Exception e2) {
            e2.getMessage();
        }

你总是返回一个封闭的流。可用性检查正确返回流已关闭。顺便说一句:你只能处理一次流。

由于AssetsManager.open()是自动关闭的,你可以写:

try(InputStream is = assManager.open(fileName)) {}

删除finally块。这将在使用后自动关闭您的流。

但我建议你进行重构。返回流总是让您在解决问题时遇到困难。根据您的需要,您可以将其作为文件或字节[]返回。两者都有优势和问题。