Почему BinaryWriter предварительно ожидает мусор к запуску потока? Как Вы избегаете его?

Я думаю, что это не поддерживается, но в основном можно сделать две вещи ввести переменные среды:

  1. Использование System.setProperty перед Log4J становится настроенным

  2. , Преобразовывают (Ваши) переменные среды в системные свойства в Вашем средстве запуска

, право преимущественной покупки в основном сводится к этому:

for (Map<String,String>.Entry entry : System.getenv().entrySet()) {
  System.setProperty(entry.getKey(), entry.getValue());
}

..., но вопрос, конечно, куда поместить этот код. В особенности, если Вы работаете в своего рода контейнере Tomcat или подобные, это могло бы быть неприятно.

другой в основном зависит от Вашей среды. В основном, если у Вас есть сценарий оболочки, который запускает Ваше приложение, можно записать некоторое волшебство оболочки установить все переменные среды как свойства, или просто те Вам нужно, например:

java -DMY_ENV=$MY_ENV -DMY_OTHER_ENV=$MY_OTHER_ENV -cp ... com.example.Main

также возможно изменить Ваши сценарии запуска сервера для поддержки этого, например, catalina.sh или подобный.

14
задан Henk Holterman 25 October 2009 в 09:01
поделиться

8 ответов

Это не метки порядка байтов, а префикс длины, согласно MSDN :

public virtual void Write(string value);

Записывает строку с префиксом длины в [the] stream

И вам понадобится этот префикс длины, если вы когда-нибудь захотите прочитать строку с этой точки. См. BinaryReader.ReadString () .

Дополнительно

Поскольку кажется, что вам действительно нужна программа проверки заголовков файлов

  1. Это проблема? Вы читаете префикс длины обратно, чтобы проверить тип файла, он работает нормально

  2. Вы можете преобразовать строку в массив byte [], возможно, используя Encoding.ASCII. Но тогда вы должны либо использовать фиксированную (подразумеваемую) длину, либо ... префикс ее самостоятельно. После прочтения byte [] вы можете снова преобразовать его в строку.

  3. Если вам нужно было написать много текста, вы даже можете присоединить TextWriter к тому же потоку. Но будьте осторожны, Сценаристы хотят закрыть свои стримы. Я бы не советовал в целом, но это полезно знать. Здесь также вам нужно будет отметить точку, в которой другой читатель может взять верх (фиксированный заголовок работает нормально).

23
ответ дан 1 December 2019 в 06:43
поделиться

Байт в начале - это длина строки, он записывается как целое число переменной длины.

Если строка составляет 127 символов или меньше, длина будет сохранена как один байт. Когда строка достигает 128 символов, длина записывается как 2, и она также переместится на 3 и 4.

Проблема в том, что вы используете BinaryWriter, который записывает данные, которые BinaryReader может прочтите позже. Если вы хотите писать в собственном настраиваемом формате, вы должны либо отказаться от написания таких строк, либо вообще отказаться от использования BinaryWriter.

8
ответ дан 1 December 2019 в 06:43
поделиться

Это потому, что BinaryWriter записывает двоичное представление строки, включая длину строки. Если бы вы записали прямые данные (например, byte [] и т. Д.), Они не будут включать эту длину.

byte[] text = System.Text.Encoding.Unicode.GetBytes("test");
FileStream fs = new FileStream("C:\\test.txt", FileMode.Create);
BinaryWriter writer = new BinaryWriter(fs);
writer.Write(text);
writer.Close();

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

8
ответ дан 1 December 2019 в 06:43
поделиться

Как указал Хенк в этот ответ , это длина строки (как 32-битное целое число).

Если вам это не нужно , вы можете написать «ТЕСТ» вручную, записав символы ASCII для каждой буквы в байтах, или вы можете использовать:

System.Text.Encoding.UTF8.GetBytes("TEST")

И записать результирующий массив (который НЕ будет содержать длину int)

6
ответ дан 1 December 2019 в 06:43
поделиться

Вы можете сохранить его как байтовый массив в кодировке UTF8 следующим образом:

...

BinaryWriter w = new BinaryWriter(fs);

w.Write(UTF8Encoding.Default.GetBytes("test"));

...
0
ответ дан 1 December 2019 в 06:43
поделиться

Помните, что строки Java имеют внутреннюю кодировку в UTF-16.

Таким образом, «тест» фактически состоит из байтов 0xff, 0xfe (вместе отметка порядка байтов), 0x74, 0x00 , 0x65, 0x00, 0x73, 0x00, 0x74, 0x00.

Вы, вероятно, захотите работать с байтами, а не с потоками символов.

-1
ответ дан 1 December 2019 в 06:43
поделиться

Скорее всего, это метка порядка байтов. Это потому, что кодировка потока установлена ​​в Unicode.

-1
ответ дан 1 December 2019 в 06:43
поделиться

Похоже на знаки порядка байтов.

http://en.wikipedia.org/wiki/Byte-order_mark

Возможно, вы хотите для записи строки как UTF-8.

-2
ответ дан 1 December 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: