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



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



    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();


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

605   4  

4 ответов:

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.