(Я недостаточно осведомлен о том, как работает ввод / вывод Dart, чтобы дать твердый ответ, поэтому я предпочитаю, что происходит.)
Похоже, происходит то, что в варианте A вы создаете поток для еще не существующего файла. Дарт видит, что файл еще не существует, поэтому публикация в потоке задерживается. Затем, когда вы запускаете сценарий echo, он создает файл и добавляет к нему первое значение «A», после чего вы просите его перевести в спящий режим на 1 секунду.
В течение этой секунды Дарт видит, что файл теперь существует, и начинает потоковую передачу данных из него. Он читает «А», а затем достигает конца файла. Что касается Дартса, это конец истории, поэтому он закрывает поток. К тому времени, когда сценарий добавляет в файл «B», «C» и «D», Дарт уже завершил выполнение программы и вышел из процесса.
В варианте B вместо того, чтобы сказать Стремясь к потоковой передаче из файла, вы подключаетесь к входному потоку процесса, который (насколько я знаю) будет оставаться открытым до тех пор, пока в него записывается что-то. У меня есть ощущение, что для понимания того, что именно происходит, требуется лучшее знание cat
и того, как работает трубопровод в терминале, чем у меня есть, но я верю, что если коротко, то программа cat
знает, что файл пишется, что предотвращает его преждевременное завершение. Таким образом, всякий раз, когда cat
получает новые данные, он передает эти данные во входной поток процесса Dart.
Возвращаясь к коду Dart, вы слушаете входной поток, который все еще ожидает данные, начиная с cat
все еще выполняется, и как таковое не закрылось. Только после завершения процесса записи файла cat
распознает, что он достиг истинного конца файла, и завершает работу, после чего Дарт узнает, что больше не собирается получать данные, и закрывает входной поток.
(Как я уже сказал, это всего лишь мое лучшее предположение, но я подозреваю, что простой способ определить это - посмотреть, когда заканчивается ваш сценарий Dart и другой сценарий. Если в варианте A Дарт заканчивает задолго до того, как делает сценарий, и в Варианте Б они заканчивают sh примерно в одно и то же время, что было бы для меня достаточным доказательством того, что вышесказанное действительно происходит.)