Если при обработке больших файлов вы используете обычный FileInputStream, FileOutputStream или RandomAccessFile для выполнения частых операций чтения и записи, это приведет к замедлению процесса из-за частого чтения и записи внешней памяти. Ниже приведен сравнительный эксперимент.
Скопируйте код кода следующим образом:
тест упаковки;
импортировать java.io.BufferedInputStream;
импортировать java.io.FileInputStream;
импортировать java.io.FileNotFoundException;
импортировать java.io.IOException;
импортировать java.io.RandomAccessFile;
импортировать java.nio.MappedByteBuffer;
импортировать java.nio.channels.FileChannel;
тест публичного класса {
public static void main(String[] args) {
пытаться {
FileInputStream fis = новый FileInputStream("/home/tobacco/test/res.txt");
интервал суммы = 0;
интервал н;
long t1=System.currentTimeMillis();
пытаться {
while((n=fis.read())>=0){
сумма+=п;
}
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
пытаться {
FileInputStream fis = новый FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream bis = новый BufferedInputStream (фис);
интервал суммы = 0;
интервал н;
long t1=System.currentTimeMillis();
пытаться {
while((n=bis.read())>=0){
сумма+=п;
}
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
MappedByteBuffer буфер = ноль;
пытаться {
буфер = новый RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
интервал суммы = 0;
интервал н;
long t1=System.currentTimeMillis();
for(int i=0;i<1253244;i++){
n=0x000000ff&buffer.get(i);
сумма+=п;
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
}
Тестовый файл представляет собой файл размером 1253244 байт. Результаты испытаний:
Скопируйте код кода следующим образом:
Сумма: 220152087 Время: 1464
сумма:220152087 время:72
сумма:220152087 время:25
Это указывает на то, что считанные данные верны. Удалите часть обработки данных.
Скопируйте код кода следующим образом:
тест упаковки;
импортировать java.io.BufferedInputStream;
импортировать java.io.FileInputStream;
импортировать java.io.FileNotFoundException;
импортировать java.io.IOException;
импортировать java.io.RandomAccessFile;
импортировать java.nio.MappedByteBuffer;
импортировать java.nio.channels.FileChannel;
тест публичного класса {
public static void main(String[] args) {
пытаться {
FileInputStream fis = новый FileInputStream("/home/tobacco/test/res.txt");
интервал суммы = 0;
интервал н;
long t1=System.currentTimeMillis();
пытаться {
while((n=fis.read())>=0){
//сумма+=n;
}
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
пытаться {
FileInputStream fis = новый FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream bis = новый BufferedInputStream (фис);
интервал суммы = 0;
интервал н;
long t1=System.currentTimeMillis();
пытаться {
while((n=bis.read())>=0){
//сумма+=n;
}
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
MappedByteBuffer буфер = ноль;
пытаться {
буфер = новый RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
интервал суммы = 0;
интервал н;
long t1=System.currentTimeMillis();
for(int i=0;i<1253244;i++){
//n=0x000000ff&buffer.get(i);
//сумма+=n;
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
}
Результаты испытаний:
Скопируйте код кода следующим образом:
сумма:0 время:1458
сумма:0 время:67
сумма:0 время:8
Видно, что скорость будет значительно улучшена при отображении части или всего файла в память для чтения и записи.
Это связано с тем, что файл, отображаемый в памяти, сначала отображает файл во внешней памяти в непрерывную область памяти, которая обрабатывается как массив байтов. Операции чтения и записи непосредственно работают с памятью, а затем перераспределяют область памяти в память. файл внешней памяти, что экономит время частого чтения и записи внешнего хранилища и значительно сокращает время чтения и записи.