я следующий кусок тестового кода:ChannelInputStream пропустить метод очень медленный
try {
InputStream is;
Stopwatch.start("FileInputStream");
is = new FileInputStream(imageFile.toFile());
is.skip(1024*1024*1024);
is.close();
Stopwatch.stop();
Stopwatch.start("Files.newInputStream");
is = Files.newInputStream(imageFile);
is.skip(1024*1024*1024);
is.close();
Stopwatch.stop();
}
catch(Exception e)
{
}
и получил следующий вывод:
Start: FileInputStream
FileInputStream : 0 ms
Start: Files.newInputStream
Files.newInputStream : 3469 ms
ли вы какие-либо идеи, что происходит? Почему во втором случае пропустить так медленно?
Мне нужно использовать InputStreams, полученные из каналов, потому что мой тест показал, что лучше всего для моей задачи иметь одновременное чтение двух потоков из файла (и я могу заметить любое улучшение только тогда, когда использую Streams from Channels).
Во время тестов я понял, что я могу сделать что-то вроде этого:
SeekableByteChannel sbc = Files.newByteChannel(imageFile);
sbc.position(1024*1024*1024);
is = Channels.newInputStream(sbc);
, который принимает только ср. 28ms, но это не очень помогает мне, потому что для использования этого я должен был бы сделать основные изменения API.
Моя платформа:
Linux galileo 3.11.0-13-generiC#20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
Что вы думаете - это ошибка в реализации ChannelInputStream? Почему есть чтение вместо вызова 'position()'? – czajah
Это похоже только на ошибку, потому что вы имеете дело с файлами. 'ChannelInputStream' не относится к файлам; он может, например, обернуть поток, который не поддерживает переход к произвольной позиции. Рассмотрим сетевой поток: он не имеет фиксированной длины, и вы не можете «прыгать вперед», не читая какие-либо данные, предшествующие местоположению поиска. Почему 'Files.newInputStream()' создает 'ChannelInputStream' вместо' FileInputStream', является правильным вопросом, и у меня нет ответа для вас. –
Итак, я оставлю это без сообщения об ошибке. Я думаю, что самый простой вариант для меня - обернуть канал в моей собственной реализации InputStream, который я смогу передать моему API. – czajah