我现在的情况是:我要读一个文件,并把内容插入InputStream
。 后来,我需要将内容放置InputStream
成字节数组需要(据我所知)的大小InputStream
。 有任何想法吗?
按照要求,我会证明我是从上传的文件创建输入流
InputStream uploadedStream = null;
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
java.util.List items = upload.parseRequest(request);
java.util.Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
uploadedStream = item.getInputStream();
//CHANGE uploadedStreambyte = item.get()
}
}
所述请求是HttpServletRequest
对象,它是像FileItemFactory
和ServletFileUpload
是从Apache通用FileUpload包。
Answer 1:
我只是想补充一点,Apache的百科全书IO具有流支持实用程序来执行复制。 (顺便说一句,你怎么通过将文件转换成一个InputStream是什么意思?你能告诉我们你的代码?)
编辑:
好吧,你想要什么与项目的内容呢? 有一个item.get()
返回一个字节数组整个事情。
EDIT2
item.getSize()
返回上传的文件大小 。
Answer 2:
这是一个非常古老的线程,但它仍然弹出,当我用Google搜索这个问题的第一件事。 所以,我只想补充一点:
InputStream inputStream = conn.getInputStream();
int length = inputStream.available();
为我工作。 和许多在这里比其他的答案简单。
Answer 3:
我会读成ByteArrayOutputStream ,然后调用toByteArray()来获得结果的字节数组。 你不需要预先定义大小(虽然它可能是一种优化,如果你知道这一点 。在很多情况下,你不会)
Answer 4:
您不能确定在流的数据量没有阅读它; 你可以,但是,询问文件的大小:
http://java.sun.com/javase/6/docs/api/java/io/File.html#length()
如果这是不可能的,你可以写你从输入流中读取的字节数ByteArrayOutputStream按要求将增长。
Answer 5:
您可以使用Utils.java的的getBytes(的inputStream)获得InputStream的大小检查此下面的链接
从InputStream中获取字节
Answer 6:
对于InputStream的
IoUtils.toByteArray(inputStream).length
对于可选<MultipartFile>
Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()
Answer 7:
当明确地处理一个ByteArrayInputStream
则相反,一些此页面,您可以使用上的意见.available()
函数来获取大小。 只要有你开始从中读取之前做到这一点。
从JavaDoc中:
返回可以从该输入流中读取(或跳过)的剩余字节数。 返回的值是计数 - POS,这是有待从输入缓冲器读出的字节数。
https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#available()
Answer 8:
如果你知道你InputStream
是FileInputStream
或ByteArrayInputStream
,你可以使用一个小反射来获取在流大小不读的全部内容 。 下面是一个例子方法:
static long getInputLength(InputStream inputStream) {
try {
if (inputStream instanceof FilterInputStream) {
FilterInputStream filtered = (FilterInputStream)inputStream;
Field field = FilterInputStream.class.getDeclaredField("in");
field.setAccessible(true);
InputStream internal = (InputStream) field.get(filtered);
return getInputLength(internal);
} else if (inputStream instanceof ByteArrayInputStream) {
ByteArrayInputStream wrapper = (ByteArrayInputStream)inputStream;
Field field = ByteArrayInputStream.class.getDeclaredField("buf");
field.setAccessible(true);
byte[] buffer = (byte[])field.get(wrapper);
return buffer.length;
} else if (inputStream instanceof FileInputStream) {
FileInputStream fileStream = (FileInputStream)inputStream;
return fileStream.getChannel().size();
}
} catch (NoSuchFieldException | IllegalAccessException | IOException exception) {
// Ignore all errors and just return -1.
}
return -1;
}
这可以扩展到支持额外的输入流,我敢肯定。
Answer 9:
使用这种方法,你只需要传递的InputStream
public String readIt(InputStream is) {
if (is != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
is.close();
return sb.toString();
}
return "error: ";
}
Answer 10:
try {
InputStream connInputStream = connection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
int size = connInputStream.available();
INT可用()返回可以从该输入流不被此输入流的方法的下一次调用无阻塞读取(或跳过)的字节数的估计值。 接下来的调用可能是同一个线程,另一个线程。 单个读或跳过此许多字节不会堵塞,但是可以读或跳过更少的字节。
InputStream的- Android SDK中| Android开发者
文章来源: Determine the size of an InputStream