Java 生成inputstream的资源高效方式是什么?
我不熟悉JavaIO。目前,我有这些代码行,它们根据字符串生成输入流Java 生成inputstream的资源高效方式是什么?,java,inputstream,Java,Inputstream,我不熟悉JavaIO。目前,我有这些代码行,它们根据字符串生成输入流 String sb = new StringBuilder(); for(...){ sb.append(...); } String finalString = sb.toString(); byte[] objectBytes = finalString.getBytes(StandardCharsets.UTF_8); InputStream inputStream = new ByteArrayInputStre
String sb = new StringBuilder();
for(...){
sb.append(...);
}
String finalString = sb.toString();
byte[] objectBytes = finalString.getBytes(StandardCharsets.UTF_8);
InputStream inputStream = new ByteArrayInputStream(objectBytes);
也许我误解了什么,但是除了使用getBytes()
,还有没有更好的方法从字符串生成InputStream
例如,如果字符串非常大,为50MB,并且由于资源限制无法创建另一个副本(另50MB为getBytes()),则可能会抛出内存不足错误
我只是想知道上面的代码行是否是从字符串生成InputStream
的有效方法。例如,有没有一种方法可以在不使用额外内存的情况下将字符串“流”到输入流中?像一个读者
-像字符串上的抽象?试试这样的东西(不要承诺打字错误:)
InputStreamReader使用字符集将字节转换为字符。BufferedReader允许您读取字符块
对于非常大的输入流,您可能希望分块处理输入,而不是将整个流读入内存,然后进行处理。我认为您需要的是一个定义为: 源为字符串的字符流
为了有效地使用它,您需要确切地知道希望读取的字节的位置。它支持随机访问和顺序访问,因此您可以通过
char
读取整个String
,char
,如果您愿意的话。您正在生成数据,实际上是在写入,并且您几乎想立即使用数据,即读取
Unix技术是通过管道将一个进程的输出传输到另一个进程的输入。在java中,还需要至少两个线程。他们将同步生产和消费
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
new Thread(() -> writeAllYouveGot(out)).start();
readAllYouveGot(in);
在这里,我启动了一个线程,用一个Runnable编写,它在out
上调用一些自定义方法。与其使用新线程
,不如选择一个新线程
虽然异步行为是最佳的,但管道I/O的使用相当少。甚至可以在PipedInputStream上设置管道的大小。之所以很少使用,是因为需要第二个线程
要完成这些工作,可能需要将二进制输入/输出流包装在newInputStreamReader(in,“UTF-8”)
和newOutputStreamWriter(out,“UTF-8”)
中
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
new Thread(() -> writeAllYouveGot(out)).start();
readAllYouveGot(in);