我必须将数据写入Amazon S3
并使用OutputStream
将数据写入其InputStream
,如下所示
final PipedOutputStream outputStream = new PipedOutputStream();
final PipedInputStream inputStream;
try {
inputStream = new PipedInputStream(outputStream);
new Thread(
new Runnable() {
@Override
public void run() {
PutObjectRequest putObjectRequest = new PutObjectRequest(S3EnvironmentConfigurator.BucketTypes.source.name(), getProposalName(uniqueId), inputStream, null);
amazonS3Client.putObject(putObjectRequest);
try {
inputStream.close();
} catch (IOException e) {
}
}
}
).start();
现在amazonS3Client.putObject
看起来像
@Override
public PutObjectResult putObject(@Nonnull final PutObjectRequest putObjectRequest)
throws AmazonClientException, AmazonServiceException {
try {
InputStreamReader is = new InputStreamReader(new GZIPInputStream(putObjectRequest.getInputStream()));
StringBuilder sb=new StringBuilder();
BufferedReader br = new BufferedReader(is);
String read = br.readLine();
while(read != null) {
System.out.println(read);
read =br.readLine();
}
} catch (IOException e) {
//ignore
}
return super.putObject(putObjectRequest);
所需
我该怎么做
while (putObjectRequest.getInputStream() is not completely available) {
// wait
}
// write inputStream, the entire InputStream is ready and available for processing
答案 0 :(得分:1)
一旦边写入关闭其OutputStream
,InputStream
将传递尚未读取的任何字节,然后下一个read()
将返回-1以指示结束输入。
值字节作为
int
返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1。此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常。
如果在完成时边写不能close()
,那么在写入过程结束之前,读者将阻止等待更多输入。
答案 1 :(得分:1)
您可以将所有数据复制到字节缓冲区,从而确保您已从输入流中读取所有数据。然后基于此缓冲区创建新的输入流。类似的东西:
byte[] array = IOUtils.toByteArray(inputStream);
InputStream newInputStream = new ByteArrayInputStream(array);
来自apache commons的