- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 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/
我尝试使用 C# 创建管道。代码非常简单,但是当执行带有 CreatePipe() 调用的行时,我得到一个 System.AccessViolationException 并显示以下错误消息: Att
我正在尝试将推箱子求解器(用 C++ 编写)添加到我的 C# 程序中(我的程序中有一个类可以处理 C++ 接口(interface)的编码)。我的程序加载了加载 solver.exe 的 solver
我正在尝试弄清楚如何在 ContentProvider.openFile 中传递数据流。要发送的数据是在 JNI 中创建的。我尝试使用传输线程创建管道,但由于管道损坏而遇到了很多麻烦。所以我想我可以将
如何在Linux中使用“CreatePipe”和“CreateProcessW”功能,当我在Linux中编译C++代码时,出现一些错误,如下所示:在此范围内未声明“CreatePipe”。未在此范围内
我有一个使用 ContentProvider 类的应用程序。在 openFile 方法中,我需要能够解码文件并作为数据流返回。所以我决定使用内置管道。 问题是如果我使用 createPipe 方法,我
我目前有这个代码: main :: IO () main =
请注意,虽然我是在 Android 环境下问这个问题,但它更像是一个关于 pipe(2) 的一般 unix 问题 ... 要将大量数据从一个进程传输到另一个进程,可以使用 ParcelFileDesc
我正在尝试使用 CreateProcess 和 CreatePipe 从 Visual Studio 2010 中的 Windows 窗体 C++/CLR 应用程序中执行进程。 在我的 Windows
与 my recent question on MediaRecorder and createPipe() 相关,并在 this other SO question 中讨论了 createPipe(
我正在尝试制作一个录制音频的示例,数据存储由应用程序处理,而不是 MediaRecorder。用例包括将录音存储在内部存储器上或加密录音。 原则上,这应该使用 createPipe() 在 Parce
How to read output from cmd.exe using CreateProcess() and CreatePipe() 我一直在尝试创建一个子进程来执行 cmd.exe,命令行指
我想通过使用 ParcelFileDescriptor.createPipe() 将 InputStream 从一个 Android 服务“发送”到在不同进程中运行的另一个服务。 ,一个流到流的复制线
我是一名优秀的程序员,十分优秀!