确定一个InputStream的大小(Determine the size of an InputS

2019-06-25 18:23发布

我现在的情况是:我要读一个文件,并把内容插入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对象,它是像FileItemFactoryServletFileUpload是从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:

如果你知道你InputStreamFileInputStreamByteArrayInputStream ,你可以使用一个小反射来获取在流大小不读的全部内容 。 下面是一个例子方法:

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