각 128 바이트가 논리적 레코드를 구성하는 플랫 파일에서 레코드를 읽어야합니다. 이 독자의 호출 모듈은 다음을 수행합니다.이 IO 코드를 리팩터링하는 방법은 무엇입니까?
while(iterator.hasNext()){
iterator.next();
//do Something
}
모든 hasNext()
호출 후 next()
호출이있을 것을 의미합니다.
이제 여기에 독자가 있습니다.
public class FlatFileiteratorReader implements Iterable<String> {
FileChannel fileChannel;
public FlatFileiteratorReader(FileInputStream fileInputStream) {
fileChannel = fileInputStream.getChannel();
}
private class SampleFileIterator implements Iterator<String> {
Charset charset = Charset.forName("ISO-8859-1");
ByteBuffer byteBuffer = MappedByteBuffer.allocateDirect(128 * 100);
LinkedList<String> recordCollection = new LinkedList<String>();
String record = null;
@Override
public boolean hasNext() {
if (!recordCollection.isEmpty()) {
record = recordCollection.poll();
return true;
} else {
try {
int numberOfBytes = fileChannel.read(byteBuffer);
if (numberOfBytes > 0) {
byteBuffer.rewind();
loadRecordsIntoCollection(charset.decode(byteBuffer)
.toString().substring(0, numberOfBytes),
numberOfBytes);
byteBuffer.flip();
record = recordCollection.poll();
return true;
}
} catch (IOException e) {
// Report Exception. Real exception logging code in place
}
}
try {
fileChannel.close();
} catch (IOException e) {
// TODO Report Exception. Logging
}
return false;
}
@Override
public String next() {
return record;
}
@Override
public void remove() {
// NOT required
}
/**
*
* @param records
* @param length
*/
private void loadRecordsIntoCollection(String records, int length) {
int numberOfRecords = length/128;
for (int i = 0; i < numberOfRecords; i++) {
recordCollection.add(records.substring(i * 128, (i + 1) * 128));
}
}
}
@Override
public Iterator<String> iterator() {
return new SampleFileIterator();
}
}
코드는 일 JVM 실행 윈도우 XP OS와, 7200 RPM으로 HDD 시스템에서 1.2 초 80MB의 데이터를 판독한다. 하지만 필자가 작성한 코드에 만족하지는 않습니다. 더 좋은 방법으로 이것을 쓰는 다른 방법이 있습니까 (특히 문자 세트에 대한 디코딩과 읽은 바이트 만 가져 오는 것, 나는 charset.decode(byteBuffer) .toString().substring(0, numberOfBytes)
부분을 의미합니다.) //TODO
것들을 무시하십시오)?
이것은 아마도 http://codereview.stackexchange.com에서 더 좋은 질문 일 것입니다. –
나는 이것이 codereview에 있어야한다는 Matt의 의견에 동의한다. 게시 할 때 만족스럽지 않은 것을 포함시켜야합니다. –
@Matt Ball 나는 더 나은 대답을 얻을 수 있을지 두려워한다. 옵션이 주어진다면 나는 여기에 질문하고 싶습니다. – nobody