如何将标准输入(不止一行)捕获到 Dart 中的字符串?
How do I capture stdin (more than one line) to a String in Dart?
我有一个 Dart 命令行程序,它希望能够将数据从 shell 通过管道传输到 Dart 程序(例如,cat file.txt | dart my_program.dart
或接受输入,直到用户使用 Ctrl+d)。通过在线教程,我找到的关于保存来自标准输入的输入的唯一文档是 stdin.readLineSync()
。然而,顾名思义,这只会读取第一行。
如何将stdin的全部内容捕获到一个String中?另外,如果用户试图输入一个非常大的文件,是否会有任何安全问题? String 的长度有限制吗?我该如何防范?
感谢您的帮助!
您可以使用
import 'dart:io' as io;
import 'dart:async' show Future, Stream, StreamSubscription;
import 'dart:convert' show UTF8;
void main() {
StreamSubscription subscr = io.stdin.transform(UTF8.decoder).listen((data) =>
print(data));
}
您可以使用
控制是否应接收更多数据
subscr.pause();
subscr.resume();
如果我没记错的话,Listen on stdin 以 16kb 的块传递数据(io 缓冲区大小由 Dart 定义)这允许您接收您可以处理的数据量。
如果你想在内存中保留一个大字符串,你需要有可用的内存。
另见
- (设置虚拟机内存)
-
-
以下程序如果以交互方式使用,将回显您的输入但每个字符都大写。
您也可以通过管道将文件传递给它。
dart upper_cat.dart < file.txt
这将输出每个字符都大写的文件。
import 'dart:convert';
import 'dart:io';
main() {
// Stop your keystrokes being printed automatically.
stdin.echoMode = false;
// This will cause the stdin stream to provide the input as soon as it
// arrives, so in interactive mode this will be one key press at a time.
stdin.lineMode = false;
var subscription;
subscription = stdin.listen((List<int> data) {
// Ctrl-D in the terminal sends an ascii end of transmission character.
// http://www.asciitable.com/
if (data.contains(4)) {
// On my computer (linux) if you don't switch this back on the console
// will do wierd things.
stdin.echoMode = true;
// Stop listening.
subscription.cancel();
} else {
// Translate character codes into a string.
var s = LATIN1.decode(data);
// Capitalise the input and write it back to the screen.
stdout.write(s.toUpperCase());
}
});
}
还有 console 库可以帮助处理此类问题。我还没有尝试过,但试一试并报告回来 ;)
以下示例处理 UTF8 输入 - 上面的示例需要 1 字节字符作为输入。
import 'dart:convert';
import 'dart:io';
main() {
stdin.echoMode = false;
stdin.lineMode = false;
var subscription;
subscription = stdin
.map((List<int> data) {
if (data.contains(4)) {
stdin.echoMode = true;
subscription.cancel();
}
return data;
})
.transform(UTF8.decoder)
.map((String s) => s.toUpperCase())
.listen(stdout.write);
}
我研究了 stdin.readLineSync()
的代码并且能够修改它以满足我的需要:
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
}
我需要从标准输入同步读取以便暂停程序直到整个标准输入(直到文件末尾或 Ctrl+d) 已阅读。
感谢您的帮助!如果没有你的帮助,我认为我无法解决这个问题。
我有一个 Dart 命令行程序,它希望能够将数据从 shell 通过管道传输到 Dart 程序(例如,cat file.txt | dart my_program.dart
或接受输入,直到用户使用 Ctrl+d)。通过在线教程,我找到的关于保存来自标准输入的输入的唯一文档是 stdin.readLineSync()
。然而,顾名思义,这只会读取第一行。
如何将stdin的全部内容捕获到一个String中?另外,如果用户试图输入一个非常大的文件,是否会有任何安全问题? String 的长度有限制吗?我该如何防范?
感谢您的帮助!
您可以使用
import 'dart:io' as io;
import 'dart:async' show Future, Stream, StreamSubscription;
import 'dart:convert' show UTF8;
void main() {
StreamSubscription subscr = io.stdin.transform(UTF8.decoder).listen((data) =>
print(data));
}
您可以使用
控制是否应接收更多数据subscr.pause();
subscr.resume();
如果我没记错的话,Listen on stdin 以 16kb 的块传递数据(io 缓冲区大小由 Dart 定义)这允许您接收您可以处理的数据量。 如果你想在内存中保留一个大字符串,你需要有可用的内存。
另见
- (设置虚拟机内存)
-
-
以下程序如果以交互方式使用,将回显您的输入但每个字符都大写。
您也可以通过管道将文件传递给它。
dart upper_cat.dart < file.txt
这将输出每个字符都大写的文件。
import 'dart:convert';
import 'dart:io';
main() {
// Stop your keystrokes being printed automatically.
stdin.echoMode = false;
// This will cause the stdin stream to provide the input as soon as it
// arrives, so in interactive mode this will be one key press at a time.
stdin.lineMode = false;
var subscription;
subscription = stdin.listen((List<int> data) {
// Ctrl-D in the terminal sends an ascii end of transmission character.
// http://www.asciitable.com/
if (data.contains(4)) {
// On my computer (linux) if you don't switch this back on the console
// will do wierd things.
stdin.echoMode = true;
// Stop listening.
subscription.cancel();
} else {
// Translate character codes into a string.
var s = LATIN1.decode(data);
// Capitalise the input and write it back to the screen.
stdout.write(s.toUpperCase());
}
});
}
还有 console 库可以帮助处理此类问题。我还没有尝试过,但试一试并报告回来 ;)
以下示例处理 UTF8 输入 - 上面的示例需要 1 字节字符作为输入。
import 'dart:convert';
import 'dart:io';
main() {
stdin.echoMode = false;
stdin.lineMode = false;
var subscription;
subscription = stdin
.map((List<int> data) {
if (data.contains(4)) {
stdin.echoMode = true;
subscription.cancel();
}
return data;
})
.transform(UTF8.decoder)
.map((String s) => s.toUpperCase())
.listen(stdout.write);
}
我研究了 stdin.readLineSync()
的代码并且能够修改它以满足我的需要:
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
}
我需要从标准输入同步读取以便暂停程序直到整个标准输入(直到文件末尾或 Ctrl+d) 已阅读。
感谢您的帮助!如果没有你的帮助,我认为我无法解决这个问题。