我有一些非常标准的代码,它从流中获取一个序列化对象,基本上看起来像这样:
Object getObjectFromStream(InputStream is) {
ObjectInputStream ois = new ObjectInputStream(is);
return ois.readObject();
}
然后我在我的资源文件夹中有一个文件,所以在我的开发机器上,我可以将它作为文件引用,或者作为JarResource引用:
InputStream is = new FileInputStream("/home/.../src/main/resources/serializedObjects/testObject");
InputStream is = this.getClass().getResourceAsStream("/serializedObjects/testObject");
在我的脑海中,两者都应该做同样的事情.然而,当它发生时,两者都解析为有效(非空)流,但FileInputStream正确地从我的getObjectFromStream(InputStream)方法返回一个Object,而getResourceAsStream版本抛出此异常:
java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:800)
at java.io.ObjectInputStream.(ObjectInputStream.java:297)
大多数情况下,我想知道如何解决这个问题,但我也很欣赏理解两个InputStream之间的区别......
希望使用inputStream在套接字上读取一些字节.服务器发送的字节数可能是可变的,客户端事先并不知道字节数组的长度.怎么可能完成?
byte b[];
sock.getInputStream().read(b);
这会导致Net BzEAnSZ出现"可能未初始化错误".救命.
我试图在String中获取HttpServletRequest的主体.这样做的最佳方式是什么?
我有一个InputStream我需要在开头和结尾添加字符,并应该以另一个类型的变量结束InputStream.我怎么能轻易做到这一点?
在我看到的从文件中读取的每个Java实现中,我几乎总是看到用于逐行读取的文件读取器.我的想法是,这将是非常低效的,因为它需要每行系统调用.
我一直在做的是使用输入流并直接获取字节.在我的实验中,这明显更快.我的测试是一个1MB的文件.
//Stream method
try {
Long startTime = new Date().getTime();
InputStream is = new FileInputStream("test");
byte[] b = new byte[is.available()];
is.read(b);
String text = new String(b);
//System.out.println(text);
Long endTime = new Date().getTime();
System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));
}
catch (Exception e) {
e.printStackTrace();
}
//Reader method
try {
Long startTime = new Date().getTime();
BufferedReader br = new BufferedReader(new FileReader("test"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line …Run Code Online (Sandbox Code Playgroud) 我的Android应用程序将使用大而大的文件(即大小在10MB到2GB之间).
我一直想知道智能手机用于稳定存储的硬件是什么,以及软件(文件读取/搜索)注意事项是否与PC硬盘类似.我试图找到有关硬件的信息并且有一些关于它的图片(内部存储,SD卡),但我检查的所有来源都不是全面和/或具体的.我(相互关联的)问题是:
InputStream阅读和搜索方面(skipBytes),使用内部存储和SD卡之间是否存在差异(例如在Android上)(我故意不写"外部存储",因为它不一定是每台设备上的SD卡)?SD卡速度慢吗?BufferedInputStream.read()(例如在a中DataInputStream)来读取它们(并skipBytes()在必要时用于搜索).因此,在底层文件系统中,这可能需要"遍历"整个2GB文件.(例如Android在需要时使用linux函数在文件中搜索.)然而,正在寻求像PC硬盘一样高效吗?在寻求效率方面,SD卡与内部存储有何关系?我知道我的具体应用的基准测试是必须的,但我也欢迎在这个问题上进行理论上的澄清.
重要提示:当我问"......正在寻求与PC硬盘一样高效吗?"时,我(不)只是指绝对值,而是它的机制.也就是说,如果它基于相同的逻辑原理工作(=尽可能跳过大部分),或者存在一些缺点(例如,在SD卡上不能进行这种"基于跳过的"搜索,因此跳过更多 - - 即非比例 - 在智能手机硬件上比在PC硬盘上无用.
我使用InputStream读取一些数据,所以我想读取字符直到新行或'\n'.
通过哪种方式返回0(读取的字节数)InputStream.read?如何处理这种情况?
更新:我的意思是read(byte[] b)或read(byte[] b, int off, int len)返回读取字节数的方法.
我有一些大文件(图像和视频),我需要存储在内容提供商.android文档表明......
如果您公开的字节数据太大而无法放入表本身 - 例如大型位图文件 - 将数据公开给客户端的字段实际上应该包含content:URI字符串.这是允许客户端访问数据文件的字段.该记录还应该有另一个名为"_data"的字段,该字段列出设备上该文件的确切文件路径.此字段不是由客户端读取,而是由ContentResolver读取.客户端将在面向用户的字段上调用ContentResolver.openInputStream(),该字段包含项目的URI.ContentResolver将为该记录请求"_data"字段,并且因为它具有比客户端更高的权限,所以它应该能够直接访问该文件并将该文件的读取包装器返回给客户端. - http://developer.android.com/guide/topics/providers/content-providers.html#creating
我找一个例子有点困难.特别是我希望在ImageView的上下文中使用位图.考虑以下代码准代码(它不起作用)......
ImageView iv = ....
String iconUri = cursor.getString(cursor.getColumnIndex(Table.ICON));
iv.setImageURI(Uri.parse(iconUri));
Run Code Online (Sandbox Code Playgroud)
意见/问题...
setImageURI实现使用内容解析openInputStream,所以这应该工作.
String scheme = mUri.getScheme();
...
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)
|| ContentResolver.SCHEME_FILE.equals(scheme)) {
try {
d = Drawable.createFromStream(
mContext.getContentResolver().openInputStream(mUri),
null);
Run Code Online (Sandbox Code Playgroud)
--frameworks /碱/核心/ JAVA /机器人/插件/ ImageView.java
我搞定了.我从MediaStore和MediaProvider中提取了一些提示.包含数据的文件根据内容提供者(目录),列名,行ID和媒体类型命名.然后内容解析器获取文件描述符,如此...
Uri iconUri = Uri.withAppendedPath(Table.getUri(cursor), Table.ICON);
ib.setImageURI(iconUri);
Run Code Online (Sandbox Code Playgroud)
......内容提供商以实物回应......
@Override
public ParcelFileDescriptor openFile (Uri uri, String mode) {
int imode = 0;
if (mode.contains("w")) imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
if (mode.contains("r")) imode |= ParcelFileDescriptor.MODE_READ_ONLY;
if (mode.contains("+")) imode |= …Run Code Online (Sandbox Code Playgroud) android inputstream android-contentresolver android-contentprovider
我必须按字符读取53 MB的文件.当我使用ifstream在C++中完成它时,它在几毫秒内完成,但使用Java InputStream需要几分钟.Java很慢或者我错过了什么是正常的吗?
另外,我需要用Java完成程序(它使用servlet,我必须从中调用处理这些字符的函数).我想也许用C或C++编写文件处理部分,然后用Java Native Interface将这些函数与我的Java程序连接......这个想法怎么样?
任何人都可以给我任何其他提示......我真的需要更快地阅读文件.我尝试使用缓冲输入,但它仍然没有提供甚至接近C++的性能.
编辑:我的代码跨越几个文件,它非常脏,所以我给出了概要
import java.io.*;
public class tmp {
public static void main(String args[]) {
try{
InputStream file = new BufferedInputStream(new FileInputStream("1.2.fasta"));
char ch;
while(file.available()!=0) {
ch = (char)file.read();
/* Do processing */
}
System.out.println("DONE");
file.close();
}catch(Exception e){}
}
}
Run Code Online (Sandbox Code Playgroud) inputstream ×10
java ×7
android ×2
byte ×1
io ×1
large-files ×1
seek ×1
servlets ×1
smartphone ×1
sockets ×1
text ×1