Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成inputstream的资源高效方式是什么?_Java_Inputstream - Fatal编程技术网

Java 生成inputstream的资源高效方式是什么?

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

我不熟悉JavaIO。目前,我有这些代码行,它们根据字符串生成输入流

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