我正在尝试从上传的cvs文件中获取BufferedInputStream。
我正在使用从cvs文件派生的Multipart。
当我第一次获得Multipart时,它是BufferedInputStream,但是缓冲区全为null。
但是,如果我往下看,则CoyoteInputStream中还有另一个缓冲区,其中包含数据。
如何获得第二个缓冲区?我的代码如下。
当然,当它到达
而((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);
}
我不明白为什么您认为需要访问基础流,或者这将为您提供您尚不具备的权限。