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

如何在java中读取文件内容、写入outputstream以及重新读取并存储在内存中的字符串变量中,java,security,jakarta-ee,java-io,Java,Security,Jakarta Ee,Java Io,我需要读取一个文件的内容,使用API编写器(PEMWriter,它将内容的格式转换为所需的格式)将其写入outputstream,然后从这个outputstream重新读取新格式化的内容,并将其存储在一个字符串变量中 有人知道怎么做吗 用代码的话来说: PEMWriter writer = null; Writer out = null; Reader in = null; String priv = null; KeyStore ks = null; Security.addProv

我需要读取一个文件的内容,使用API编写器(PEMWriter,它将内容的格式转换为所需的格式)将其写入outputstream,然后从这个outputstream重新读取新格式化的内容,并将其存储在一个字符串变量中

有人知道怎么做吗

用代码的话来说:

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)行
我很感激在这个问题上能得到一些帮助。提前谢谢

您不能读取流或读取器两次。一旦读到最后,它就在末尾(在
IOUtils.copy(in,out)
中完成)。然后您尝试再次读取它(
IOUtils.toString(in)

要在一个步骤中同时写入文件和字符串,可以使用TeeWriter(如)和StringWriter

或将输入复制到字符串并将字符串写入输出:

 priv = IOUtils.toString(in);
 out.wite(priv);

我相信我的解决方案的答案是使用管道——一个编写器和读取器管道将两者连接在一起。这样我就可以在读卡器中读取我的输出流。我只有在尝试之后才会知道,但研究似乎是解决我问题的最正确方法 近似

 PipedWriter pwriter = new PipedWriter();
    PipedReader preader = new PipedReader(pwriter);

如果出现异常,请不要忘记同时发布stacktrace。
new Long(5000).longValue()
?为什么不干脆
5000L
?受虐狂?:-)另外,我不知道代码与这个问题有什么关系?您没有涉及任何文件,您从空读取器中读取。@JBNizet-我编辑了原始问题以包含以前省略的代码-最初省略是为了避免问题不必要的混乱。我看不出它如何更改任何内容。您仍在从空读取器读取。@JBNizet ks.load进行第一次读取。我使用getPrivateKey获取私钥。现在我用PEMWriter把这个写出来。现在我需要再次读取输出,这样我就可以将它保存到我的字符串priv中。我的逻辑在什么地方出错了吗?谢谢,我明白这一点。但我不明白的是,下面使用writeObject()进行的初始写入是out第一次具有所需内容,因此它至少允许我使用IOUtils.copy()读取一次。它不会抛出异常
out=new BufferedWriter(new OutputStreamWriter(new org.apache.commons.io.output.ByteArrayOutputStream());写入器=新的写入器(输出);writer.writeObject(privateKey);in=new BufferedReader(new org.apache.commons.io.input.NullReader(new Long(5000.longValue()));IOUtils.copy(输入、输出)