Цепочка потоков на 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();
Если да, то каковы альтернативы, если мне нужно использовать функциональность обоих потоков, например, если я хочу записать несколько строк текста в поток, а затем двоичные данные или наоборот?
4 ответов:
Это можно сделать в некоторых случаях, но это подвержено ошибкам. Вы должны быть осторожны с буферами и такими вещами, как заголовки потока
ObjectOutputStream.Для этого все, что вам нужно знать, - это то, что вы можете конвертировать текст в двоичные данные и обратно, но всегда должны указывать кодировку. Однако он также подвержен ошибкам, потому что люди, как правило, используют методы API, которые используют платформу кодировка по умолчанию, и, конечно, вы в основном реализуете синтаксический анализатор для пользовательского двоичного формата файла-там многое может пойти не так.Если я хочу записать несколько строк текста в поток, а затем двоичный код данные или наоборот?
В общем, если вы создаете формат файла, особенно при смешивании текстовых и двоичных данных, лучше всего использовать существующую структуру, такую как буферы протокола Google
Если вы должны это сделать, то вы должны это сделать. Поэтому, если вы имеете дело с внешней зависимостью, которую вы не можете контролировать, вы просто должны это сделать.
Я думаю, что плохой стиль - это тот факт, что вам нужно было бы это сделать. Если вам иногда приходится передавать двоичные данные, а иногда текст, то, вероятно, лучше всего иметь какой-то объект сообщения и отправлять сам объект по проводу с сериализацией. Накладные расходы на данные не слишком велики, если они правильно структурированы.
Не понимаю, почему бы и нет. Я имею в виду, что реализация различных потоковых классов должна защитить вас от записи недопустимых данных. Пока вы читаете его таким же образом, и ваш код в остальном понятен, я не вижу, почему это будет проблемой.
Стиль не всегда означает, что вы должны делать это так, как вы видели, как это делают другие. До тех пор, пока это логично, и кто-то, читающий код, увидит, что (и почему) вы делаете это, без необходимости писать кучу комментариев, тогда я не понимаю, в чем проблема.
Так как вы краснеете между ними, это, вероятно, нормально. Но может быть чище использовать один
OutputStreamи просто использоватьos.write(string.getBytes());для записи строк.
Comments