如何从Multipart获取BufferedInputStream?

时间:2016-02-08 01:14:30

标签: java multipart bufferedinputstream

我正在尝试从上传的cvs文件中获取BufferedInputStream。

我正在使用从cvs文件派生的Multipart。

当我第一次得到Multipart时,它是一个BufferedInputStream,但缓冲区全为空。

Sorry. Potato Quality

但如果我深入了解,CoyoteInputStream中还有另一个缓冲区,它有数据。

Another Potato, but we're saving money by using XP's Paint

如何进入第二个缓冲区?我的代码如下。

当然,当它到达

时它会抛出一个空的异常
  

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

我做错了什么?我错误地认为CoyoteInputStream是我想要的数据吗?

public byte [] handleUploadedFile(Multipart multiPart)抛出EOFException {

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

    } ...

2 个答案:

答案 0 :(得分:1)

您的代码没有任何意义。

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

时有效

你对缓冲区一无所知;而下一次循环你将会破坏你刚才读到的东西。

在Java中读取任何流的正确方法如下:

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

我不明白为什么你认为需要访问基础流,或者它会给你什么,你还没有。

答案 1 :(得分:-1)

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

Multipart multiPartData = null;
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int read;
byte[] input = new byte[4096];
InputStream is;

try {
    multiPartData = (Multipart)multipart.next();
    is = multiPartData.getInputStream();
    while ((read = is.read(input, 0, input.length)) != -1) {
        buffer.write(input, 0, read);
    }

    buffer.flush();
    return buffer.toByteArray(); // just a test right now
}