Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用openFileInput(Uri)和多线程打开多个文件_Java_Android_Multithreading_File_Android Studio - Fatal编程技术网

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

Java 使用openFileInput(Uri)和多线程打开多个文件,java,android,multithreading,file,android-studio,Java,Android,Multithreading,File,Android Studio,我试图使用context.getContentResolver().openInputStream(Uri)打开多个具有多个线程的文件,但似乎在读取时,所有线程都从同一个文件读取。我尝试过使方法同步,但没有成功。代码如下: private String getVideoData(Uri uri) { String res = null; MyActivity activity = ActivityTransferer.getInstance().getActivi

我试图使用
context.getContentResolver().openInputStream(Uri)
打开多个具有多个线程的文件,但似乎在读取时,所有线程都从同一个文件读取。我尝试过使方法
同步
,但没有成功。代码如下:

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;
}
调用此方法的代码是:

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;
}
这被称为:

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

        encrypted = encryptUri(file);

        result.add(encrypted);
}
打印
byte[]data=byteOutputStream.toByteArray()的前100个字节我得到:

0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-

在另一个线程上:

0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-

打印时使用:

for (int i = 0; i < 100; i++)
    System.out.print(data[i] + "-");
顺便说一下,
ActivityTransfer.getInstance().getActivity()
返回当前上下文

如果你能帮我,我会非常感激的。谢谢大家!

修好了

本例中的解决方案是使方法
私有字符串getVideoData(Uri-Uri)
静态并同步(
私有静态同步字符串getVideoData(Uri-Uri)
)。我认为问题在于代码中使用的某些操作使用的是静态方法或变量。因此,通过使方法保持静态和同步,它将等待其他线程完成,然后再开始操作


在本例中,
InputStream fis=activity.getContentResolver().openInputStream(uri)可能是导致问题的原因。

您没有显示线程的位置。如果您的线程正在调用
getVideoData()
,那么请确保您没有以某种方式为所有这些线程使用相同的
uri
值。@Commonware此方法是从线程本身调用的,这就是为什么它在所有线程中读取相同的文件对我来说没有意义的原因。是的,
uri
总是不同的,我已经测试过了。“看起来……所有线程都从同一个文件中读取。”你到底是如何做出这个决定的?请显示刚才添加的调用@greeble31的代码。我知道它读取相同的文件,因为当我添加视频时,它总是相同的,如果您打印
byte[]data=byteOutputStream.toByteArray()你会得到同样的答案。你能幽默一下,把打印出来的内容加到你的问题里吗?
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