Мы можем открыть канал так же просто, как Files.newByteChannel(path)
, и это будет работать нормально.Проблема в том, что если я хочу открыть более одного канала:
Channel chan1 = Files.newByteChannel(path);
Channel chan2 = Files.newByteChannel(path);
Пример выше не работает в целом.Рассмотрим обстоятельства:
Channel chan1 = Files.newByteChannel(path); //OK
//Some other process moved path and created an new file with the path
Channel chan2 = Files.newByteChannel(path); //Damn!
Происходит состояние гонки.В Linux у нас есть dup
-подобные системные вызовы, а также fcntl(F_DUPFD, int)
int fd == open(path);
int duplicated = fcntl(fd, F_DUPFD, fd);
, и это должно работать.
Есть лиспособ сделать это в Java и избежать написания JNI
функции?
UPD: причина, по которой я хочу дубликат, заключается в том, что я хочу передавать данные из одного файла в несколько SocketChannel
одновременно.Поэтому кажется разумным иметь отдельный FileChannel
для перевода на один SocketChannel
.