如何读取文件内容,写入outputstream并重新读取并存储在java中的内存中的字符串变量中

时间:2013-05-28 21:23:27

标签: java security java-ee java-io

我需要读取文件的内容,使用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);行。 我对这个问题有所帮助。提前致谢。

2 个答案:

答案 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);