确定InputStream的大小

问题描述 投票:53回答:10

我目前的情况是:我必须读取文件并将内容放入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 Commons FileUpload包。

java arrays size inputstream
10个回答
12
投票

我只想补充一点,Apache Commons IO有流支持实用程序来执行复制。 (顺便说一下,将文件放入输入流是什么意思?你能告诉我们你的代码吗?)

编辑:

好的,你想对项目的内容做什么?在字节数组中有一个item.get() which returns整个事物。

Aaditi

item.getSize()将返回上传的file size


-1
投票
InputStream - Android SDK | Android Developers

int available()返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。下一次调用可能是同一个线程或另一个线程。单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。

qazxswpoi


38
投票

这是一个真正的老线程,但当我搜索问题时,它仍然是第一个弹出的东西。所以我只是想补充一下:

InputStream inputStream = conn.getInputStream();
int length = inputStream.available();

为我工作。而且比这里的其他答案简单得多。


34
投票

我会读入ByteArrayOutputStream然后调用toByteArray()来获得结果字节数组。您不需要提前定义大小(尽管如果您知道它可能是一个优化。在许多情况下您不会)


17
投票

如果不读取它,您无法确定流中的数据量;但是,您可以询问文件的大小:

http://java.sun.com/javase/6/docs/api/java/io/File.html#length()

如果这不可能,您可以将从输入流中读取的字节写入ByteArrayOutputStream,该Get Bytes from Inputstream将根据需要增长。


4
投票

您可以使用Utils.java的getBytes(inputStream)获取InputStream的大小,请检查以下链接

IoUtils.toByteArray(inputStream).length


4
投票

对于InputStream

Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()

对于Optional <MultipartFile>

ByteArrayInputStream

0
投票

当明确处理.available()然后与此页面上的一些注释相反时,您可以使用https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#available()函数来获取大小。在开始阅读它之前必须要这样做。

来自JavaDocs:

返回可从此输入流中读取(或跳过)的剩余字节数。返回的值是count-pos,它是从输入缓冲区中读取的剩余字节数。

InputStream


0
投票

如果你知道你的FileInputStreamByteArrayInputStreamstatic 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; } ,你可以使用一点反射来获得流大小而不读取整个内容。这是一个示例方法:

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: ";
}

我相信,这可以扩展到支持额外的输入流。


-1
投票

使用此方法,您只需传递InputStream

    try {
        InputStream connInputStream = connection.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }

    int size = connInputStream.available();
© www.soinside.com 2019 - 2024. All rights reserved.