Java 如何将inputstream的内容复制或存储到字节数组中?

Java 如何将inputstream的内容复制或存储到字节数组中?,java,servlets,file-upload,Java,Servlets,File Upload,我正在使用ApacheCommonsFileUpload库上载文件。我想将InputStream的内容复制到一个单字节数组中。我怎么能这么做 try { List<FileItem> items = new ServletFileUpload( new DiskFileItemFactory()).parseRequest(request); for (FileItem item : items) { if (item.isFo

我正在使用ApacheCommonsFileUpload库上载文件。我想将InputStream的内容复制到一个单字节数组中。我怎么能这么做

try {
    List<FileItem> items = new ServletFileUpload(
            new DiskFileItemFactory()).parseRequest(request);
    for (FileItem item : items) {
        if (item.isFormField()) {
            // Process regular form field (input
            // type="text|radio|checkbox|etc", select, etc).
            String fieldname = item.getFieldName();
            String fieldvalue = item.getString();
            out.println("returned");
        } else {
            // Process form file field (input type="file").
            String fieldname = item.getFieldName();
            String filename = FilenameUtils.getName(item.getName());
            InputStream input = item.getInputStream();
            if (fieldname.equals("file")) {
                // please help me here.
                byte[] allbyte = ???
            }
        }
    }
}
试试看{
列表项=新建ServletFileUpload(
新建DiskFileItemFactory()).parseRequest(请求);
用于(文件项:项){
if(item.isFormField()){
//处理常规表单字段(输入
//type=“text | radio | checkbox | etc”,选择等)。
字符串fieldname=item.getFieldName();
String fieldvalue=item.getString();
out.println(“返回”);
}否则{
//处理表单文件字段(输入类型=“文件”)。
字符串fieldname=item.getFieldName();
字符串filename=FilenameUtils.getName(item.getName());
InputStream输入=item.getInputStream();
if(fieldname.equals(“文件”)){
//请帮帮我。
字节[]所有字节=???
}
}
}
}

使用
ByteArrayOutputStream
怎么样

ByteArrayOutputStream out = new ByteArrayOutputStream();

int b = input.read();
while (b != -1) {
    out.write(b);
    b = input.read();
}
allbyte = out.toByteArray();

使用DataInputStream。它有一个readfull()方法,可以读取所有字节

DataInputStream dis = new DataInputStream(inputStream);
byte[] allBytes = new byte[inputStream.available()];
dis.readFully(allBytes);
有关详细信息,请参阅

使用库中的实用程序方法:


它给你一条直线。通常,请尝试查找一个现有的库,该库可以满足您的需要,并且具有大量方便的方法。

您尝试过吗?应该注意,
ByteArrayOutputStream.toByteArray()
分配一个新数组,并将字节复制到其中。换言之,您不只是首先获得用于收集数据的数组的引用。如果您正在处理相当大的文件,并且重复复制字节的成本变得很高,那么这可能与此相关。我不确定您是否可以依靠
inputStream.available()
为您提供上载数据大小的真实表示。Available仅返回“在不被该输入流的方法的下一个调用方阻塞的情况下,可以从此输入流读取(或跳过)的字节数的估计值”。@gregkopf inputStream.Available()返回程序中可以读取的字节数。这不是一个问题,因为分配多余的长度没有用,因为我们只能读取其中的一部分,而另一部分将为null,这只会浪费内存。应该注意的是,与JDK版本一样,Apache Commons
ByteArrayOutputStream.toByteArray()
分配一个新数组,并将字节复制到其中。换言之,您不只是首先获得用于收集数据的数组的引用。如果您正在处理相当大的文件,并且重复复制字节的成本变得很高,那么这可能与此相关。如果我们有一个
InputStream
(图像)并希望在其上执行某些方法(而不将其保存在服务器上),将其写入字节数组并传递给方法比将其作为
InputStream
传递更好吗?
import org.apache.commons.io.IOUtils;

InputStream input;
byte[] bytes = IOUtils.toByteArray(input);