package org.fastcatsearch.transport; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Enumeration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.fastcatsearch.common.BytesArray; import org.fastcatsearch.common.BytesReference; public class FileChunkEnumeration implements Enumeration<BytesReference>{ private static Logger logger = LoggerFactory.getLogger(FileChunkEnumeration.class); private byte[] buffer; private FileInputStream fis; private long nRead; private long fileSize; private boolean isRead; public FileChunkEnumeration(File file, int fileChunkSize) throws FileNotFoundException{ if(file.exists()){ fis = new FileInputStream(file); fileSize = file.length(); buffer = new byte[fileChunkSize]; } } /* * 파일크기가 0이라도 기록해야하므로, true로 준다. * */ @Override public boolean hasMoreElements() { //파일크기가 0일때에는 아직읽지않은 상태이면 true. 읽었으면 false return (fileSize == 0 && !isRead) || nRead < fileSize; } @Override public BytesReference nextElement() { isRead = true; try { int n = fis.read(buffer); if(n == -1){ if(fileSize == 0){ n = 0; }else{ throw new IOException("end of file while reading. nRead="+nRead+", fileSize="+fileSize); } } nRead += n; // logger.debug("read = {}, total = {} < {}", new Object[]{n, nRead, fileSize}); return new BytesArray(buffer, 0, n); } catch (IOException e) { logger.error("", e); } return null; } public void close() { // 파일닫기. if(fis != null){ try { fis.close(); } catch (IOException e) { logger.error("", e); } } } }