2013-04-02 85 views
2

我面临的情况是,我必须将300 MB的数据写入XML。使用流我没有面临OutOfMemory异常,完美地执行了任务。如何从FileOutputStream对象检索字符串值?

现在我必须将FileOutputStream对象转换为实际数据并将其作为String传递给其他方法。

我试过了,我没有得到预期的结果。请让我知道如何将FileOutputStream对象转换为字符串值

+0

因此,您需要使用刚写入的数据将数据传递给另一个对象,或者是其他地方的数据? – Skepi

+0

我必须读取此FileOutputStream对象并将该字符串值传递给其他进程的另一个方法。 –

+0

所以你想要:从文件中读取行,并将此行传递给另一个方法参数,true? – Sajmon

回答

3

如果您字符串太大,你试图在同一时间,以保持它在内存中,它会总是因为你的OutOfMemoryError独立于您使用的读者的事实。

所以,问题不在于你的读者。问题是你的String对象(你想传递的对象)。

如果你需要将一个巨大的文件存储/传递给String变量,那么你的架构肯定有问题。

你的错误是你正试图把你的XML文本放入Java String变量中。你应该避免在内存中存储大对象,这是关键点。

通常文本是一个压缩的对象,压缩比为0.1 - 0.01。

尝试使用ZipOutputStream/ZipInputStream(或一些类似的库) - 它们在读取/写入文件的流中正常工作。

在我的实践中,它可以很好地处理大型XML文件。

+0

感谢您的回复。正如你所提到的,我们需要改变架构。没有其他选择。 +1清楚地解释它。 –

0

你是如何在文件中写的? FileOutputStream的创建是可以的,但是当你使用FileOutputStream编写时,你必须传递一些东西给它。当您将数据传递给FileOutputStream.write(some_data)时,为什么不同时在StringBuffer中写同样的数据?

+0

StringBuffer内部使用append方法。在编写大量数据时,它会给你OutOfMemory异常。 –

+0

您是否试图一次追加整个数据?你如何在outputStream中写入,全部以一个字节或一个字节为单位?如果你正在逐字节写入,在同一个循环中,如果你对StringBuffer进行了追加,它是否会抛出异常?你也可以检查:[链接](http://stackoverflow.com/questions/2431040/java-outofmemoryerror-with-stringbuilder) –

0

您无法从FileOutputStream读取。尝试使用FileReader来读取文件中的数据。

你不能使用你最初用来创建文件的数据吗?如果没有,你可以使用XML解析器像SAXJDOM读取数据

+0

现在我有FileOutputStream对象,我必须将其转换为字符串。我们如何做到这一点? –

+0

我很困惑你想做什么。你写了一个文件吗?你期望通过将FileOutputStream对象转换为字符串?你为什么需要这样做? – Skepi

+0

实际上,我正在做这个逻辑的方法应该返回一个字符串值,这将在其他一些方法中使用。我试过fileOutputStream.toString(),它正在返回对象。但是我需要返回一个字符串值。 –