我在开发阶段,我有两个模块,从一个我得到输出作为OutputStream第二个,只接受InputStream.你知道如何转换OutputStream到InputStream(而不是相反,我是说真的这样),我将能够这两部分连接?
谢谢
使用Apache commons的Base64
public byte[] encode(File file) throws FileNotFoundException, IOException {
byte[] encoded;
try (FileInputStream fin = new FileInputStream(file)) {
byte fileContent[] = new byte[(int) file.length()];
fin.read(fileContent);
encoded = Base64.encodeBase64(fileContent);
}
return encoded;
}
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at org.apache.commons.codec.binary.BaseNCodec.encode(BaseNCodec.java:342)
at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:657)
at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:622)
at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:604)
Run Code Online (Sandbox Code Playgroud)
我正在为移动设备制作小应用程序.
在以下情况下发生写入结束异常:两个线程:
A: PipedOutputStream put = new PipedOutputStream();
String msg = "MESSAGE";
output.wirte(msg.getBytes());
output.flush();
B: PipedInputStream get = new PipedOutputStream(A.put);
byte[] get_msg = new byte[1024];
get.read(get_msg);
Run Code Online (Sandbox Code Playgroud)
情况如下:A和B同时运行,A写入管道,B读取它.B只是从管道中读取并清除了该管道的缓冲区.然后A不会在未知的时间间隔内将msg写入管道.但是,在某一时刻,B再次读取管道并java.io.IOException: write end dead发生,因为管道的缓冲区仍然是空的.而且我不想睡眠()线程B等待A写管道,这也是不稳定的.如何避免这个问题并解决它?谢谢
我在内存中创建PDF文档作为OutputStreams.这些应该上传到S3.我的问题是,它无法创建一个PutObjectRequest从OutputStream(直接按这个线程在AWS开发论坛).我aws-java-sdk-s3在Dropwizard应用程序中使用v1.10.8 .
到目前为止我能看到的两个解决方法是:
OutputStream到a InputStream并接受使用两倍量的RAM.OutputStream到一个InputStream并接受额外线程的开销(参见这个答案)如果我找不到更好的解决方案,我会选择#1,因为在我的设置中,它看起来好像能够比线程/ CPU更容易买得起额外的内存.
到目前为止,我是否还有其他任何可能更有效的方式来实现这一目标?
编辑:
我OutputStreams为ByteArrayOutputStream小号
我有一个将选定数据从 Postgres 移动到 Amazon S3 的用例。这应该一步完成。我正在编写一个java程序来完成这个任务。
我找到了一种分两步复制数据的方法。我使用 CopyManager 库和 copyOut 方法将数据获取到本地。之后,我使用 Java 将相同的文件移至 S3 中。
postgres 代码将数据获取到我的本地
CopyManager copyManager = new CopyManager((BaseConnection) con);
FileWriter fileWriter = new FileWriter("file.csv");
copyManager.copyOut("COPY (SELECT stmt) TO STDOUT WITH DELIMITER '\t' CSV HEADER", fileWriter);
Run Code Online (Sandbox Code Playgroud)
AWS代码从本地转移到S3
AmazonS3 conn = new AmazonS3Client(credentials);
conn.setEndpoint("xxx.com");
conn.putObject(
bucket1.getName(),
"request.json",
new File("file.csv")
);
Run Code Online (Sandbox Code Playgroud)
我希望它会一次性发生,而不是写入文件然后将文件移动到 S3。
我正在使用API(Jasper Reports)生成PDF,我想在内存中完成大部分工作.我已经能够将生成的文件作为一个OutputStream,现在我只是在寻找一个实现器,用于将内存保存在内存中InputStream.
我可以使用哪些类,既可以作为OutputStream和InputStream在内存中的数据?
java ×6
amazon-s3 ×2
inputstream ×2
outputstream ×2
base64 ×1
ioexception ×1
java-io ×1
postgresql ×1