我正在尝试从上传的cvs文件中获取BufferedInputStream。
我正在使用从cvs文件派生的Multipart。
当我第一次得到Multipart时,它是一个BufferedInputStream,但缓冲区全为空。
但如果我深入了解,CoyoteInputStream中还有另一个缓冲区,它有数据。
如何进入第二个缓冲区?我的代码如下。
当然,当它到达
时它会抛出一个空的异常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;
}
} ...
答案 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
}