2013-04-02 5 views
2

Я столкнулся с ситуацией, когда мне приходится записывать 300 МБ данных в XML. Используя Streams, я отлично выполнил задачу без исключения OutOfMemory.Как получить значение String из объекта FileOutputStream?

Теперь я должен преобразовать объект FileOutputStream в фактические данные и передать его как String другим способом.

Я пробовал, и я не получаю ожидаемого результата. Просьба дать мне знать как конвертировать FileOutputStream объект в String значение?

+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, он генерирует исключение? вы также можете проверить это: [link] (http://stackoverflow.com/questions/2431040/java-outofmemoryerror-with-stringbuilder) –

0

Вы не можете прочитать от FileOutputStream. Попробуйте FileReader, чтобы прочитать данные из файла.

Не могли бы вы использовать данные, которые вы первоначально использовали для создания файла? Если вы не могли бы использовать XML Parser как SAX или JDOM читать данные

+0

Теперь у меня есть объект FileOutputStream, и я должен преобразовать его в строку. Как мы можем это сделать? –

+0

Я смущен относительно того, что вы хотите сделать. Вы уже писали в файл? Что вы ожидаете, преобразовывая объект FileOutputStream в String? Зачем вам это нужно? – Skepi

+0

Фактически метод, который я делаю этой логикой, должен возвращать строковое значение, которое будет использоваться в некоторых других методах. Я попробовал fileOutputStream.toString(), который возвращает объект. Но мне нужно получить строковое значение. –

Смежные вопросы