Не устаревший эквивалент StringBufferInputStream - PullRequest
12 голосов
/ 29 января 2010

Я работаю с LogManager.readConfiguration(), для которого требуется InputStream, содержимое которого я хотел бы получить из строки. Существует ли эквивалент StringBufferInputStream, который не считается устаревшим, например ReaderToInputStreamAdaptor?

Ответы [ 3 ]

8 голосов
/ 29 января 2010

Используйте ByteArrayInputStream и будьте осторожны, чтобы указать подходящую кодировку символов. например,

ByteArrayInputStream(str.getBytes("UTF8"));

Вам нужно беспокоиться о кодировке символов, чтобы определить, как каждый символ преобразуется в набор байтов. Обратите внимание, что вы можете использовать метод getBytes() по умолчанию и указать кодировку, с которой JVM запускается через -Dfile.encoding=...

5 голосов
/ 29 января 2010

См. java.io.ByteArrayInputStream

String s = "test";
InputStream input = new ByteArrayInputStream(s.getBytes("UTF8"));
3 голосов
/ 29 января 2010

Документация LogManager.readConfiguration() гласит, что она принимает данные в формате java.util.Properties. Итак, действительно правильная реализация, безопасная для кодирования, такова:

String s = ...;

StringBuilder propertiesEncoded = new StringBuilder();
for (int i = 0; i < s.length(); i++)
{
    char c = s.charAt(i);
    if (c <= 0x7e) propertiesEncoded.append((char) c);
    else propertiesEncoded.append(String.format("\\u%04x", (int) c)); 
}
ByteArrayInputStream in = new ByteArrayInputStream(propertiesEncoded.toString().getBytes("ISO-8859-1"));

РЕДАКТИРОВАТЬ: Исправлен алгоритм кодирования

EDIT2: На самом деле, формат java.util.Properties имеет некоторые другие ограничения (например, экранирование \ и других специальных символов), см. Документы

EDIT3: 0x00-0x1f, убегая удалено, как Алан Мур предлагает

...