gpt4 book ai didi

安卓:ParcelFileDescriptor "createpipe"方法 64KB 错误

转载 作者:行者123 更新时间:2023-11-29 14:33:19 28 4
gpt4 key购买 nike

我有一个使用 ContentProvider 类的应用程序。在 openFile 方法中,我需要能够解码文件并作为数据流返回。所以我决定使用内置管道。

问题是如果我使用 createPipe 方法,我只能将 64KB 写入其中。之后我无法将数据写入管道。另请注意,在数据完全解码并写入管道之前我无法读取。

package com.aujas.html.viewer.content;
public class LocalFileContentProvider extends ContentProvider {

private static final String URI_PREFIX = "content://com.aujas.html.viewer.localfile.dec/";
public static File file;
public String filename;
public ParcelFileDescriptor[] parcels;

public static String constructUri(String url) {
String editString = url.replaceAll("%20", " ");
int n = editString.length();
String uri = editString.substring(5, n - 1);
Log.d("URI", uri);
return URI_PREFIX + uri + "\"";
}

public ParcelFileDescriptor openFile(Uri uri, String mode) {

Log.d("OPEN", uri.getPath());
return parcels[0];

}

@Override
public boolean onCreate() {
return true;
}

@Override
public int delete(Uri uri, String s, String[] as) {
throw new UnsupportedOperationException(
"Not supported by this provider");
}

@Override
public String getType(Uri uri) {
throw new UnsupportedOperationException(
"Not supported by this provider");
}

@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
throw new UnsupportedOperationException(
"Not supported by this provider");
}

@Override
public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
throw new UnsupportedOperationException(
"Not supported by this provider");
}

@Override
public int update(Uri uri, ContentValues contentvalues, String s,
String[] as) {
throw new UnsupportedOperationException(
"Not supported by this provider");
}

class DecryptAsync extends AsyncTask<String, Integer, String> {

@Override
protected String doInBackground(String... paramArrayOfParams) {
// TODO Auto-generated method stub
try {
file = new File(paramArrayOfParams[0]);
Log.d("DecrypOpened", file.toString());
parcels = ParcelFileDescriptor.createPipe();
Log.d("filebeindec", LocalFileContentProvider.file.toString());
FileInputStream fis = new FileInputStream(LocalFileContentProvider.file);

android.os.ParcelFileDescriptor.AutoCloseOutputStream out = new android.os.ParcelFileDescriptor.AutoCloseOutputStream(parcels[1]);
Cipher ecipher;
Cipher dcipher;
SecretKey key;
String input = "768f8a949de079da";
byte[] encoded = new BigInteger(input, 16).toByteArray();
key = new SecretKeySpec(encoded, "DES");
byte[] iv = new byte[] { (byte) 0x8E, 0x12, 0x39, (byte) 0x9C,
0x07, 0x72, 0x6F, 0x5A };
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
ecipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
dcipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
byte[] buf = new byte[1024];
InputStream in = new CipherInputStream(fis, dcipher);
int numRead = 0;
int n = 1;
while ((numRead = in.read(buf)) >= 0) {
n++;
out.write(buf, 0, numRead);
Log.d("Error", "SD");
if (n == 64) {
out.flush();
out.flush();
n = 0;
}
}

Log.d("Decypt Done", out.toString());
} catch (Exception e) {
Log.d("AsyncError", e.toString());
}
return null;
}

@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}

}

当我执行这个时,我只能写入 64KB。由于我每次写入使用 1KB,所以我得到 64 条日志,之后什么也没有发生。这些管道有尺寸限制吗?有解决方法吗?感谢和问候红糖

最佳答案

Linux 内核(至少是融入 Android 的版本)对管道有 64k 的缓冲区限制。

因此,您不能写入整个文件(大于 64k 的文件)。你要做的是

a) 创建管道

b) 创建 writer 线程,它将写入此管道。它会阻塞并等待读取器线程从管道读取内容。

c) 开始这个线程

d) 将读取器文件描述符返回给客户端。

那么,将会发生什么,作者和读者将同时进行写作和阅读。 Writer 将在填充缓冲区时阻塞,而 reader 将在清空缓冲区时阻塞。

关于安卓:ParcelFileDescriptor "createpipe"方法 64KB 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11138696/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com