Цепочка потоков в Java - PullRequest
       3

Цепочка потоков в Java

5 голосов
/ 03 ноября 2011

Это плохой стиль - хранить ссылки на потоки «дальше вниз» по цепочке фильтров и снова использовать эти потоки более низкого уровня или даже менять один тип потока на другой? Например:

    OutputStream os = new FileOutputStream("file");
    PrintWriter pw = new PrintWriter(os);
    pw.print("print writer stream");
    pw.flush();
    pw = null;
    DataOutputStream dos = new DataOutputStream(os);
    dos.writeBytes("dos writer stream");
    dos.flush();
    dos = null;
    os.close();

Если это так, каковы альтернативы, если мне нужно использовать функциональность обоих потоков, например, если я хочу записать несколько строк текста в поток с последующими двоичными данными или наоборот?

Ответы [ 4 ]

4 голосов
/ 03 ноября 2011

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

если я хочу записать несколько строк текста в поток с последующим двоичным данные или наоборот?

Для этого все, что вам нужно знать, это то, что вы можете преобразовывать текст в двоичные данные и обратно, но всегда нужно указывать кодировку. Тем не менее, он также подвержен ошибкам, потому что люди склонны использовать методы API, которые используют кодировку платформы по умолчанию, и, конечно, вы в основном реализуете парсер для пользовательского двоичного формата файла - многие вещи могут пойти не так.

В общем, если вы создаете формат файла, особенно при смешивании текстовых и двоичных данных, лучше использовать существующую структуру, такую ​​как буферы протокола Google

3 голосов
/ 03 ноября 2011

Если вы должны это сделать, тогда вы должны это сделать. Поэтому, если вы имеете дело с внешней зависимостью, которую вы не можете контролировать, вам просто нужно это сделать.

Я думаю, что плохой стиль - это то, что вам нужно это сделать. Если бы вам приходилось иногда передавать двоичные данные, а другие - текст, вероятно, было бы лучше иметь какой-либо объект сообщения и отправлять сам объект по сети с сериализацией. Затраты на данные не слишком велики, если их правильно структурировать.

1 голос
/ 03 ноября 2011

Не понимаю, почему нет.Я имею в виду, реализации различных потоковых классов должны защищать вас от записи неверных данных.Пока вы читаете его обратно тем же способом, а ваш код понятен, я не понимаю, почему это может быть проблемой.

Стиль не всегда означает, что вы должны делать этокак вы видели, как другие это делают.Пока это логично, и кто-то, читающий код, будет видеть, что (и почему) вы делаете, без необходимости писать кучу комментариев, тогда я не вижу, в чем проблема.

0 голосов
/ 03 ноября 2011

Поскольку вы промываете между ними, это, вероятно, хорошо.Но может быть чище использовать один OutputStream и просто использовать os.write(string.getBytes()); для записи строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...