Вы можете открыть канал для stdin, например
FileInputStream stdin = new FileInputStream(FileDescriptor.in);
FileChannel stdinChannel = stdin.getChannel();
Когда stdin был перенаправлен в файл, могут работать такие операции, как запрос размера, выполнение быстрой передачи в другие каналы и даже отображение памяти. Но когда вводом является реальная консоль или канал, или вы читаете символьные данные, производительность вряд ли будет значительно отличаться.
Производительность зависит от того, как вы ее читаете, а не от класса, который вы используете.
Пример кода, непосредственно работающего с каналом, для обработки десятичных чисел, разделенных пробелами:
CharsetDecoder cs = Charset.defaultCharset().newDecoder();
ByteBuffer bb = ByteBuffer.allocate(1024);
CharBuffer cb = CharBuffer.allocate(1024);
while(stdinChannel.read(bb) >= 0) {
bb.flip();
cs.decode(bb, cb, false);
bb.compact();
cb.flip();
extractDoubles(cb);
cb.compact();
}
bb.flip();
cs.decode(bb, cb, true);
if(cb.position() > 0) {
cb.flip();
extractDoubles(cb);
}
private static void extractDoubles(CharBuffer cb) {
doubles: for(int p = cb.position(); p < cb.limit(); ) {
while(p < cb.limit() && Character.isWhitespace(cb.get(p))) p++;
cb.position(p);
if(cb.hasRemaining()) {
for(; p < cb.limit(); p++) {
if(Character.isWhitespace(cb.get(p))) {
int oldLimit = cb.limit();
double d = Double.parseDouble(cb.limit(p).toString());
cb.limit(oldLimit);
processDouble(d);
continue doubles;
}
}
}
}
}
Это сложнее, чем использование java.util.Scanner
или BufferedReader
s readLine()
, за которым следует split("\\s")
, но имеет то преимущество, что позволяет избежать сложности механизма регулярных выражений, а также не создавать объекты String
для строк. Если в каждой строке или пустых строках более одного числа, то есть строки не будут соответствовать строкам чисел, это может сэкономить накладные расходы на копирование intrinsi c на построение строки.
Этот код все еще обрабатывается произвольные кодировки. Когда вы знаете ожидаемую кодировку и она основана на ASCII, использование облегченного преобразования вместо CharsetDecoder
, как показано в , этот ответ может дать дополнительное повышение производительности.