Issue
I have a Dart command-line program that want to be able to pipe data from the shell to the Dart program (e.g., cat file.txt | dart my_program.dart
or accept input until the user uses Ctrl+d). Going through the tutorials online, the only documentation I found on saving input from the stdin was stdin.readLineSync()
. However, as the name implies, this only reads the first line.
How can capture the entire contents of the stdin to a String? Also, would there be any security concerns if a user tries to pipe in an enormously large file? Is there a limit to how long the String can be? How can I safeguard against that?
Thanks for your help!
Solution
I studied the code of the stdin.readLineSync()
and was able to modify it to fit my needs:
import 'dart:convert';
import 'dart:io';
String readInputSync({Encoding encoding: SYSTEM_ENCODING}) {
final List input = [];
while (true) {
int byte = stdin.readByteSync();
if (byte < 0) {
if (input.isEmpty) return null;
break;
}
input.add(byte);
}
return encoding.decode(input);
}
void main() {
String input = readInputSync();
myFunction(input); // Take the input as an argument to a function
}
I needed to read synchronously from the stdin in order to pause the program until the entire stdin (until the end of file or Ctrl+d) was read.
Thanks for all your help! I don’t think I would have been able to figure it out without your help.
Answered By – Dariel Dato-on
Answer Checked By – Jay B. (FlutterFixes Admin)