Написание больших строк с DataOutputStream - PullRequest
7 голосов
/ 07 ноября 2008

Я занимался программированием сокетов для передачи информации по проводам. Я столкнулся с проблемой с DataOutputStream.writeUTF (). Кажется, что он допускает строки размером до 64 Кб, но у меня есть несколько ситуаций, когда я могу запустить это. Есть ли хорошие альтернативы, которые поддерживают большие строки, или мне нужно накатить свою собственную?

Ответы [ 3 ]

16 голосов
/ 07 ноября 2008

На самом деле он использует два байта для записи длины строки перед использованием алгоритма, который уплотняет ее в один, два или три байта на символ. (См. Документацию по java.io.DataOutput). Он близок к UTF-8, но, несмотря на то, что он задокументирован, существуют проблемы совместимости. Если вас не очень беспокоит объем данных, которые вы будете писать, вы можете легко написать свои собственные, сначала написав длину строки, а затем необработанные данные строки, используя метод getBytes.

// Write data
String str="foo";
byte[] data=str.getBytes("UTF-8");
out.writeInt(data.length);
out.write(data);

// Read data
int length=in.readInt();
byte[] data=new byte[length];
in.readFully(data);
String str=new String(data,"UTF-8");
7 голосов
/ 31 января 2012

ObjectOutputStream.writeObject() правильно обрабатывает длинные строки (проверено с помощью исходного кода). Напишите строку следующим образом:

ObjectOutputStream oos = new ObjectOutputStream(out);
... other write operations ...
oos.writeObject(myString);
... other write operations ...

Прочитайте это так:

ObjectInputStream ois = new ObjectInputStream(in);
... other read operations ...
String myString = (String) ois.readObject();
... other read operations ...

Еще одно отличие от DataOutputStream заключается в том, что использование ObjectOutputStream автоматически записывает 4-байтовый заголовок потока при создании экземпляра, но обычно это будет довольно небольшое наказание.

1 голос
/ 07 ноября 2008

Вы должны иметь возможность использовать OutputStreamWriter с кодировкой UTF-8. Нет явного метода writeUTF, но вы можете установить кодировку в конструкторе. Попробуйте

Writer osw = new OutputStreamWriter(out, "UTF-8");

где out - это любой объект OutputStream, который вы сейчас оборачиваете.

...