Java 如何从多部分获取BufferedInputStream?

Java 如何从多部分获取BufferedInputStream?,java,multipart,bufferedinputstream,Java,Multipart,Bufferedinputstream,我试图从上传的cvs文件中获取BufferedInputStream 我正在使用从cvs文件派生的多部分 当我第一次得到Multipart时,它是一个BufferedInputStream,但是缓冲区都是空的 但如果我深入观察,在郊狼输入流中还有另一个缓冲区,它有数据 我怎样才能到达第二个缓冲区?我的代码如下 当然,当它到达时会抛出一个空异常 而((multiPartDataPos=stream.read(buffer))>=0) 我做错了什么?我是不是误解了郊狼输入流就是我想要的数据 公共

我试图从上传的cvs文件中获取BufferedInputStream

我正在使用从cvs文件派生的多部分

当我第一次得到Multipart时,它是一个BufferedInputStream,但是缓冲区都是空的

但如果我深入观察,在郊狼输入流中还有另一个缓冲区,它有数据

我怎样才能到达第二个缓冲区?我的代码如下

当然,当它到达时会抛出一个空异常

而((multiPartDataPos=stream.read(buffer))>=0)

我做错了什么?我是不是误解了郊狼输入流就是我想要的数据

公共字节[]handleUploadedFile(多部分多部分)引发EOFEException{

    Multipart multiPartData = null;
    BufferedInputStream stream = null;

    int basicBufferSize = 0x2000;

    byte[] buffer = new byte[basicBufferSize];

    int bufferPos = 0;

    try {

        while (multiPart.hasNext()) {

            int multiPartDataPos = bufferPos;

            multiPartData = (Multipart) multiPart.next();

            stream = new BufferedInputStream(multiPartData.getInputStream());

            while ((multiPartDataPos = stream.read(buffer)) >= 0) {

                int len = stream.read(buffer, multiPartDataPos, buffer.length - multiPartDataPos);
                multiPartDataPos += len;
            }

            bufferPos = bufferPos + multiPartDataPos;
        }

    } ...

你的代码没有任何意义

while ((multiPartDataPos = stream.read(buffer)) >= 0) {
此时,您已将
multiPartDataPos
字节读入
buffer
,因此
buffer[0..multiPartDataPos-1]
包含刚才读取的数据

    int len = stream.read(buffer, multiPartDataPos, buffer.length - multiPartDataPos);
此时您正在进行另一次读取,该读取可能返回-1,否则将从
multiPartPos
multiPartDataPos+len-
添加一些数据

    multiPartDataPos += len;
此步骤仅在
len>0
时有效

你对缓冲区什么也不做,下次在循环中你会重击你刚读到的任何东西

    int len = stream.read(buffer, multiPartDataPos, buffer.length - multiPartDataPos);
在Java中读取任何流的正确方法如下:

while ((count = in.read(buffer)) > 0)
{
    // use buffer[9..count-1], for example out.write(buffer, 0, count);
}

我不明白您为什么认为需要访问底层流,或者它将为您提供什么您还没有的功能。

您的代码没有任何意义

while ((multiPartDataPos = stream.read(buffer)) >= 0) {
此时,您已将
multiPartDataPos
字节读入
buffer
,因此
buffer[0..multiPartDataPos-1]
包含刚才读取的数据

    int len = stream.read(buffer, multiPartDataPos, buffer.length - multiPartDataPos);
此时您正在进行另一次读取,该读取可能返回-1,否则将从
multiPartPos
multiPartDataPos+len-
添加一些数据

    multiPartDataPos += len;
此步骤仅在
len>0
时有效

你对缓冲区什么也不做,下次在循环中你会重击你刚读到的任何东西

    int len = stream.read(buffer, multiPartDataPos, buffer.length - multiPartDataPos);
在Java中读取任何流的正确方法如下:

while ((count = in.read(buffer)) > 0)
{
    // use buffer[9..count-1], for example out.write(buffer, 0, count);
}

我不明白您为什么认为需要访问底层流,或者它将为您提供什么您还没有的功能。

结果证明更好的解决方案是使用将数据从InputStream移动到ByteArrayOutputStream,然后返回ByteArrayOutputStream.toByteArray()


事实证明,更好的解决方案是使用将数据从InputStream移动到ByteArrayOutputStream,然后返回ByteArrayOutputStream.toByteArray()


谢谢@EJP,我希望我今天晚些时候可以尝试一下。我尝试了你的方法,但我一直得到一个空的BufferedInputStream。我尝试使用常规的InputStream,并且更成功。尽管我相信使用BufferedInputStream会更有效。定义“empty
BufferedInputStream
”。通过读取
InputStream
e> BufferedInputStream应该与直接读取
InputStream
相同,而不是一次获取的数据量。除非您误用了
available(),
当然。谢谢@EJP,我希望今天晚些时候我能试试。我尝试了你的方法,但我一直得到一个空的BufferedInputStream。我尝试了使用常规的InputStream,并且更成功。尽管我相信使用BufferedInputStream会更有效。定义“empty
BufferedInputStream
”。读取
InputStream通过
BufferedInputStream
读取的m
应该与直接读取
InputStream
相同,而不是一次获取的数据量。当然,除非您误用了
available(),