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

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

当我第一次获得Multipart时,它是BufferedInputStream,但是缓冲区全为null。

java - 如何从Multipart获取BufferedInputStream?-LMLPHP

但是,如果我往下看,则CoyoteInputStream中还有另一个缓冲区,其中包含数据。

java - 如何从Multipart获取BufferedInputStream?-LMLPHP

如何获得第二个缓冲区?我的代码如下。

当然,当它到达


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


我究竟做错了什么?我是否误认为CoyoteInputStream是我想要的数据?

公共字节[] 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;
        }

    } ...

最佳答案

您的代码没有任何意义。

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-下有效。

而且您对缓冲区什么也没做;下次在循环中,您将破坏刚刚阅读的内容。

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

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


我不明白为什么您认为需要访问基础流,或者这将为您提供您尚不具备的权限。

10-01 23:48