我目前的情况是:我必须读取文件并将内容放入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 Commons FileUpload包。
我只想补充一点,Apache Commons IO有流支持实用程序来执行复制。 (顺便说一下,将文件放入输入流是什么意思?你能告诉我们你的代码吗?)
编辑:
好的,你想对项目的内容做什么?在字节数组中有一个item.get()
which returns整个事物。
Aaditi
item.getSize()
将返回上传的file size。
InputStream - Android SDK | Android Developers
int available()返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。下一次调用可能是同一个线程或另一个线程。单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。
qazxswpoi
这是一个真正的老线程,但当我搜索问题时,它仍然是第一个弹出的东西。所以我只是想补充一下:
InputStream inputStream = conn.getInputStream();
int length = inputStream.available();
为我工作。而且比这里的其他答案简单得多。
我会读入ByteArrayOutputStream然后调用toByteArray()来获得结果字节数组。您不需要提前定义大小(尽管如果您知道它可能是一个优化。在许多情况下您不会)
如果不读取它,您无法确定流中的数据量;但是,您可以询问文件的大小:
http://java.sun.com/javase/6/docs/api/java/io/File.html#length()
如果这不可能,您可以将从输入流中读取的字节写入ByteArrayOutputStream,该Get Bytes from Inputstream将根据需要增长。
您可以使用Utils.java的getBytes(inputStream)获取InputStream的大小,请检查以下链接
IoUtils.toByteArray(inputStream).length
对于InputStream
Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()
对于Optional <MultipartFile>
ByteArrayInputStream
当明确处理.available()
然后与此页面上的一些注释相反时,您可以使用https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#available()函数来获取大小。在开始阅读它之前必须要这样做。
来自JavaDocs:
返回可从此输入流中读取(或跳过)的剩余字节数。返回的值是count-pos,它是从输入缓冲区中读取的剩余字节数。
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;
}
,你可以使用一点反射来获得流大小而不读取整个内容。这是一个示例方法:
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: ";
}
我相信,这可以扩展到支持额外的输入流。
使用此方法,您只需传递InputStream
try {
InputStream connInputStream = connection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
int size = connInputStream.available();