简体   繁体   English

使用 openFileInput(Uri) 和多线程打开多个文件

[英]Opening multiple files with openFileInput(Uri) and multithreading

I'm trying to open multiple files with multiple threads using context.getContentResolver().openInputStream(Uri) but it seems that when reading, all the threads read from the same file.我正在尝试使用context.getContentResolver().openInputStream(Uri)打开具有多个线程的多个文件,但似乎在读取时,所有线程都从同一个文件中读取。 I've tried making the method synchronized but did not work.我试过使方法synchronized但没有奏效。 Here is the code:这是代码:

private String getVideoData(Uri uri) {
        String res = null;
        MyActivity activity = ActivityTransferer.getInstance().getActivity();

        try { 
            InputStream fis = activity.getContentResolver().openInputStream(uri);

            if (fis != null) {
                ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();

                byte[] bytes = new byte[4096];

                int read = fis.read(bytes);

                while (read != -1) {
                    byteOutputStream.write(bytes);
                    read = fis.read(bytes);
                }

                byte[] data = byteOutputStream.toByteArray();

                res = java.util.Base64.getEncoder().encodeToString(data);

                fis.close();
                byteOutputStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return res;
}

And the code that calls this method is:而调用这个方法的代码是:

private EncryptedFile encryptUri(Uri uri) {
        EncryptedFile res = null;
        MyActivity activity = ActivityTransferer.getInstance().getActivity();

        String type = activity.getContentResolver().getType(uri);

        if (type != null) {
            String data;
            System.out.println("Path: " + uri.getPath());
            System.out.println("Type: " + type);
            if (type.startsWith("video")) {

                data = getVideoData(uri);
                res = new EncryptedVideo();
                System.out.println("Data: " + data);
                res.encrypt(data, password);

            }
            else {

                data = getImageData(uri);
                res = new EncryptedPicture();
                res.encrypt(data, password);

            }
        }

        return res;
}

which is called from:这是从以下调用的:

while (!toEncrypt.isEmpty()) {
        file = toEncrypt.poll();

        encrypted = encryptUri(file);

        result.add(encrypted);
}

Printing the first 100 bytes of byte[] data = byteOutputStream.toByteArray();打印byte[] data = byteOutputStream.toByteArray();的前 100 个byte[] data = byteOutputStream.toByteArray(); I get:我得到:

I/System.out: 0-0-0-24-102-116-121-112-109-112-52-50-0-0-0-0-109-112-52-50-105-115-111-109-0-0-0-24-98-101-97-109-1-0-0-0-1-0-0-0-0-0-0-0-2-0-0-0-0-0--126-6-109-111-111-118-0-0-0-108-109-118-104-100-0-0-0-0-0-0-0-0-0-0-0-0-0-0-2-88-0-0--86-30-0-1-0-0-1-0-0-0-0-0-0-0-0-0-0-0-

and on other thread:并在其他线程上:

I/System.out: 0-0-0-24-102-116-121-112-109-112-52-50-0-0-0-0-109-112-52-50-105-115-111-109-0-0-0-24-98-101-97-109-1-0-0-0-1-0-0-0-0-0-0-0-2-0-0-0-0-0--126-6-109-111-111-118-0-0-0-108-109-118-104-100-0-0-0-0-0-0-0-0-0-0-0-0-0-0-2-88-0-0--86-30-0-1-0-0-1-0-0-0-0-0-0-0-0-0-0-0-

Printing with:打印:

for (int i = 0; i < 100; i++)
    System.out.print(data[i] + "-");

with Base64 encoding (also same o both obviously):使用 Base64 编码(显然也相同):

AAAAGGZ0eXBtcDQyAAAAAG1wNDJpc29tAAAAGGJlYW0BAAAAAQAAAAAAAAACAAAAAACCBm1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAAlgAAKoeAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAEnZdHJhawAAAFx0a2hkAAAABwAAAAAAAAAAAAAAAQAAAAAAAKoeAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAKAAAABYAAAAABJdW1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAAlgAAKoeVcQAAAAAACJoZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAAAAAAEkrbWluZgAAABR2bWhkAAAAAAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAABI63N0YmwAAACPc3RzZAAAAAAAAAABAAAAf2F2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAACgAFgAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAApYXZjQwFkAB7/4QARZ2QAHqy0BQFtKQUCAgbQoTUBAAVo7gbiwAAAABhzdHRzAAAAAAAAAAEAABEDAAAACgAAAChzdHNjAAAAAAAAAAIAAAABAAAAEwAAAAEAAADmAAAABAAAAAEAAEQgc3RzegAAAAAAAAAAAAARAwAAATAAAAAgAAAAIAAAACAAAAAgAABiUAAABAAAAADwAAAAkAAAARAAAAHAAAAGMAAAEaAAABbwAAAIoAAACvAAAAGgAAAEAAAAC0AAAA8gAAAckAAABhAAAATAAAAOkAAABgAAABRwAAAK0AAAD8AAAAKgAAAIsAAAEmAAAAngAAAMAAAAEQAAAACAAAAGMAAAFtAAADDAAAAMoAAACJAAAAcAAAAEsAAACMAAAAUgAAAKcAAABpAAAAPgAAAIoAAACtAAAA9QAAAHoAAACxAAAAGgAAAFAAAAD9AAABAAAAARoAAABUAAAAJAAAALEAAADPAAABiAAAAGAAAAChAAAAVQAAAGIAAAFYAAAATwAAAOgAAAEtAAAADgAAAHEAAADaAAACoQAAAG0AAAD0AAAA6QAAAH0AAAEGAAAAJwAAAMoAAADeAAAAbAAAAIcAAAE0AAAATgAAAJMAAAFNAAAACgAAAI0AAAFwAAACZAAAAJUAAAByAAAAZAAAAD4AAACCAAAARgAAAPkAAABBAAAA1gAAANYAAADDAAAAZAAAAJkAAAD1AAAABgAAAF0AAAEiAAACpQAAAGkAAAB8AAABWgAAAE0AAADDAAAAkAAAAJwAAACpAAAAEgAAAGYAAAG2AAABTwAAAHIAAAD4AAAACgAAAEoAAADiAAAChQAAAKMAAACmAAAAewAAAE8AAAC/AAAASgAAARUAAABbAAAAawAAAMMAAAB4AAAAtwAAAEcAAACmAAAAHQAAAHUAAADSAAAA+AAAAIwAAABHAAAAOAAAAE8AAACdAAAATgAAALAAAABpAAAAPQAAAHQAAACoAAAAYwAAAG8AAAChAAAACgAAAGoAAADSAAACJwAAADAAAABdAAAAyQAAADcAAACsAAAAagAAAMsAAABZAAAAHAAAAIAAAABpAAABDwAAAGsAAAEsAAAADQAAAGUAAAHyAAAB3wAAAI8AAABvAAAAEAAAAD8AAACZAAAA1QAAAQQAAABhAAAAGgAAAE8AAADrAAAA6gAAAK4AAADGAAAABgAAADgAAAC0AAABwwAAAL4AAABsAAAAbAAAAEAAAACCAAAARgAAAKcAAABkAAAAPAAAAIEAAACTAAAAaQAAAH4AAAB3AAAAEAAAAGUAAACjAAABpwAAAFsAAADCAAAAQwAAAIEAAAEcAAAAWgAAALIAAAB8AAAAGAAAAGwAAADEAAABcgAAAGkAAACTAAAAFwAAADUAAACEAAAAmgAAAUcAAABOAAAAZgAAAN8AAACrAAAAwgAAADgAAABZAAAAMgAAAFkAAADdAAABQQAAAHkAAAAsAAAAQQAAACAAAABeAAAAqgAAANEAAABXAAAAMQAAAI4AAABMAAAAxwAAANQAAABeAAAAGQAAAKUAAACxAAABlgAAAHoAAAEnAAAAKwAAAEgAAADsAAAAdwAAARUAAABbAAAAXAAAAP4AAABaAAAAtAAAASMAAABHAAAAKwAAAK8AAAB2AAABLAAAAEMAAADfAAAAIQAAAJEAAAERAAABRgAAAH8AAABtAAAAEQAAAFkAAACOAAABUQAAAMMAAABhAAAAIgAAAFcAAAeeAAABTAAAAF8AAAE4AAAAMgAAAFoAAAF1AAAAXQAAAPgAAABeAAAANwAAAKkAAAA2AAAAcQAAALIAAABeAAAARQAAAG0AAACkAAAAVgAAAHEAAACRAAAABwAAAD0AAAD9AAACDQAAAHoAAABrAAAAbQAAAEkAAADTAAAAMwAAAP4AAAB9AAAAYwAAAJkAAACaAAAASgAAADoAAACRAAAABwAAAG0AAADYAAAB9QAAADYAAABcAAAA7QAAADYAAACkAAAAdQAAAMUAAABcAAAAHwAAAJkAAABYAAABEgAAAGUAAAEsAAAALQAAAF8AAAIOAAAAWwAAAQcAAADMAAAACgAAASQAAAENAAADdwAAAVMAAABcAAAAOwAAAFgAAABFAAAAeAAAAIAAAACGAAAAJAAAAG4AAACQAAAAwQAAAGcAAABGAAAAOQAAAJwAAAAxAAAAwQAAAKEAAADHAAAAMQAAAHsAAABcAAAAfQAAAMsAAABSAAAAgQAAAFYAAAB5AAAAdwAAAFwAAACwAAAARQAAAJYAAACcAAAAfAAAAGcAAACwAAAAPwAAAL4AAACnAAAAzwAAAI8AAABWAAAAZQAAAGQAAABVAAAAlAAAAHkAAABvAAAAkQAAADIAAADZAAAAVgAAAScAAABfAAAAvQAAALkAAAA4AAAA4AAAAGYAAAEJAAAAkQAAAIQAAAC1AAAAQwAAAHoAAACSAAAAYQAAAJ4AAAAzAAAAewAAAI4AAABwAAAApgAAADMAAABVAAAAcwAAAFcAAACCAAAAGwAAAGgAAACYAAAAgQAAAHcAAAA5AAAAOQAAAFgAAABqAAAAkQAAAEAAAABuAAAANgAAAGsAAAArAAAAbAAAAKQAAAA8AAAAgwAAABQAAACAAAAAigAAAWwAAABlAAAATwAAAJkAAAAGAAAAjQAAANwAAAFyAAABBAAAABAAAAAmAAAAUQAAAAMAAABSAAAAAwAAAKMAAAAGAAAAxAAAAWwAAAHgAAAAcwAAAEAAAACwAAAAlQAAAE4AAACOAAAAVAAAALgAAABfAAAAqgAAAOEAAAALAAAAowAAAM8AAAJUAAAAwAAAABkAAADpAAAAGQAAAbEAAAL+AAACcAAAANoAAAD8AAAAmAAAALYAAAByAAAAswAAAAIAAAB4AAAADQAAAQUAAAF+AAABeAAAAHkAAAClAAAAlgAAAKoAAABpAAAAzgAAAAIAAACGAAAADQAAAPsAAAGdAAABnwAAAH4AAACnAAAAkwAAAFYAAABUAAAApAAAAAIAAACTAAAAAgAAAM0AAACLAAAAnQAAAIYAAABJAAAAbQ

By the way, ActivityTransferer.getInstance().getActivity() returns the current Context.顺便说一下, ActivityTransferer.getInstance().getActivity()返回当前的上下文。

Please if you could help me I'd appreciate it a lot.请如果你能帮助我,我将不胜感激。 Thank you!谢谢!

Fixed it!修复!

The solution in this case is to make the method private String getVideoData(Uri uri) static and synchronized ( private static synchronized String getVideoData(Uri uri) ).这种情况下的解决方案是使方法private String getVideoData(Uri uri)静态和同步( private static synchronized String getVideoData(Uri uri) )。 I think the problem is that some operation used in the code is using an static method or variable.我认为问题在于代码中使用的某些操作使用了静态方法或变量。 So by making the method static and synchronized it will wait for other threads to finish before starting the operation.因此,通过使方法静态和同步,它将在开始操作之前等待其他线程完成。

In this case, InputStream fis = activity.getContentResolver().openInputStream(uri);在这种情况下, InputStream fis = activity.getContentResolver().openInputStream(uri); is probably what is causing the problem.可能是导致问题的原因。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM