У меня есть файл, String
который я хочу использовать в качестве файла InputStream
. В Java 1.0 вы могли использовать java.io.StringBufferInputStream
, но это было @Deprecrated
(по уважительной причине - вы не можете указать кодировку набора символов):
Этот класс неправильно конвертирует символы в байты. Начиная с JDK 1.1, предпочтительным способом создания потока из строки является использование
StringReader
класса.
Вы можете создать с java.io.Reader
помощью java.io.StringReader
, но нет адаптеров, чтобы взять Reader
и создать InputStream
.
Я обнаружил древнюю ошибку, требующую подходящей замены, но, насколько я могу судить, такой вещи не существует.
Часто предлагаемый обходной путь - использовать в java.lang.String.getBytes()
качестве входных данных для java.io.ByteArrayInputStream
:
public InputStream createInputStream(String s, String charset)
throws java.io.UnsupportedEncodingException {
return new ByteArrayInputStream(s.getBytes(charset));
}
но это означает материализацию всего String
в памяти в виде массива байтов и лишает смысла поток. В большинстве случаев это не имеет большого значения, но я искал что-то, что сохраняло бы намерение потока - чтобы как можно меньше данных (ре) материализовалось в памяти.
источник
new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))
Если вы не возражаете против зависимости от пакета commons-io , вы можете использовать метод IOUtils.toInputStream (String text) .
источник
Существует адаптер от Apache Commons-IO, который адаптируется от Reader к InputStream, и называется ReaderInputStream .
Пример кода:
Ссылка: https://stackoverflow.com/a/27909221/5658642
источник
На мой взгляд, самый простой способ сделать это - протолкнуть данные через Writer:
В реализации JVM я использую проталкиваемые данные в блоках по 8 КБ, но вы можете повлиять на размер буфера, уменьшив количество символов, записываемых за один раз, и вызвав flush.
Альтернатива написанию собственной оболочки CharsetEncoder, использующей Writer для кодирования данных, хотя делать это правильно - довольно сложно. Это должна быть надежная (если неэффективная) реализация:
источник
Что ж, один из возможных способов:
PipedOutputStream
PipedInputStream
OutputStreamWriter
вокругPipedOutputStream
(вы можете указать кодировку в конструкторе)OutputStreamWriter
можно прочитать изPipedInputStream
!Конечно, это кажется довольно хакерским способом сделать это, но, по крайней мере, это способ.
источник
Решение состоит в том, чтобы свернуть свое собственное, создав
InputStream
реализацию, которая, вероятно, будет использоватьjava.nio.charset.CharsetEncoder
для кодирования каждогоchar
или фрагментаchar
s в массив байтов поInputStream
мере необходимости.источник
Вы можете воспользоваться помощью библиотеки org.hsqldb.lib.
источник
Я знаю, что это старый вопрос, но сегодня у меня была такая же проблема, и это было моим решением:
источник