Java: Javolution: как использовать UTF8ByteBufferWriter и MappedByteBuffer?
Всем, кто использует javolution, пожалуйста, расскажите мне, как его использовать. Любой фрагмент кода мне очень помогает.
вот мой текущий код:
public static void mergeAllFilesJavolution2()throws FileNotFoundException, IOException {
String fileDir = "C:\\TestData\\w12";
File dirSrc = new File(fileDir);
File[] list = dirSrc.listFiles();
long start = System.currentTimeMillis();
String outFile = fileDir + "\\..\\merged.txt";
File file2 = new File(outFile);
//file2.createNewFile();
FileChannel fc2 = (new RandomAccessFile(file2, "rw")).getChannel();
for(int j=0; j<list.length; j++){
int chr;
String srcFile = list[j].getPath();
File file = new File(srcFile);
FileChannel fc = (new FileInputStream(file)).getChannel();
MappedByteBuffer buf = fc.map(MapMode.READ_ONLY, 0, file.length());
UTF8ByteBufferReader inFile= new UTF8ByteBufferReader().setInput(buf);
MappedByteBuffer buf2 = fc2.map(MapMode.READ_WRITE, file2.length(), file.length());
UTF8ByteBufferWriter outPut= new UTF8ByteBufferWriter().setOutput(buf2);
while((chr=inFile.read()) != -1) {
outPut.write(chr);
}
outPut.close();
inFile.close();
}
System.out.println(System.currentTimeMillis()-start);
}
но это дает мне исключение:
Исключение в потоке "main" java.nio.channels.NonReadableChannelException в sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:716) в abc.filedivision.FileMergeTest.mergeAllFilesJavolution2(FileMergeTest.javaf100) FileMergeTest.main(FileMergeTest.java:27)
Любое руководство в правильном направлении приветствуется.
1 ответ
Я предполагаю, что он жалуется здесь (поэтому важно взглянуть на строку кода, в которой есть ошибка)
FileChannel fc2 = (new FileOutputStream(file2, true)).getChannel();
MappedByteBuffer buf2 = fc2.map(MapMode.READ_WRITE, 0, file2.length());
Это исключение выдается, если вы пытаетесь использовать канал для чтения, но оно не читается.
Вы можете открыть канал только в режиме READ_WRITE, если вы используете RandomAccessFile в режимах "rw", "rws" или "rwd"