2016-01-22 2 views
2

Я пишу класс полезности для FileChannel s.Как я могу выйти из цикла FileChannel # transferFrom?

следующий метод выглядит так, как может работать.

// tries to transfer as many bytes as specified 
public static long transferTo(final FileChannel src, long position, 
           long count, final WritableByteChannel dst) 
    throws IOException { 

    long accumulated = 0L; 

    while (position < src.size()) { 
     final long transferred = src.transferTo(position, count, dst); 
     position += transferred; 
     count -= transferred; 
     accumulated += transferred; 
    } 

    return accumulated; 
} 

Но версия для transferFrom есть проблемы.

// tries to transfer as many bytes as specified 
public static long transferFrom(final FileChannel dst, 
           final ReadableByteChannel src, 
           long position, long count) 
    throws IOException { 

    long accumulated = 0L; 

    dst.position(position + count); // extend the position for writing 
    while (count > 0L) { 
     final long transferred = dst.transferFrom(src, position, count); 
     position += transferred; 
     count -= transferred; 
     // not gonna break if src is shorter than count 
    } 

    return accumulated; 
} 

Если src достигает к EOF до графа, цикл может жить бесконечно.

Возможно ли решение?

ответ

3

Это очевидный недостаток в API. Нет очевидного механизма для обозначения конца потока. Похоже, что он может вернуть нуль в любое время, а не только в конце потока.