我需要读取文件的内容,使用API Writer(PEMWriter - 将内容格式转换为所需格式)将它们写入输出流,然后从此输出流重新读取新格式化的内容并存储到一个String变量。
任何人都知道怎么做?
代码:
PEMWriter writer = null;
Writer out = null;
Reader in = null;
String priv = null;
KeyStore ks = null;
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
ks.load(new FileInputStream(MyConfig.KEYTOOL_FILE),
MyConfig.PASSWORD.toCharArray());
KeyPair keyPair = getPrivateKey(ks, "myKey",
MyConfig.PASSWORD.toCharArray());
PrivateKey privateKey = keyPair.getPrivate();
out = new BufferedWriter (new OutputStreamWriter(new org.apache.commons.io.output.ByteArrayOutputStream()));
writer = new PEMWriter(out);
writer.writeObject(privateKey);
in = new BufferedReader (new org.apache.commons.io.input.NullReader( new Long(5000).longValue()));
IOUtils.copy(in, out);
priv = IOUtils.toString(in);
上面的代码应该有效,因为它有一个Writer(out),它使用bouncy castle api填充PEMWriter的内容。当尝试使用Reader(in)重新读取out的内容并将它们存储到String(priv)时,会出现问题。我得到一个IO异常,说明在文件结束后读取。这发生在IOUtils.copy(in, out);
行。
我对这个问题有所帮助。提前致谢。
答案 0 :(得分:1)
您无法两次阅读信息流或阅读器。一旦它被读到最后它就在最后(完成IOUtils.copy(in, out)
)。然后你尝试再次阅读它(IOUtils.toString(in)
)。
要一步编写文件和字符串,您可以使用TeeWriter(如this one)和StringWriter
或者将输入复制到String并将字符串写入out:
priv = IOUtils.toString(in);
out.wite(priv);
答案 1 :(得分:-1)
我相信我的解决方案的答案是使用管道 - 写入器和读取器管道将两者连接在一起。这样我就可以在读者中读出我的流出。我只会在尝试之后知道,但是对于我的问题似乎最正确的研究 类似于
PipedWriter pwriter = new PipedWriter();
PipedReader preader = new PipedReader(pwriter);