Saat memproses file besar, jika Anda menggunakan FileInputStream atau FileOutputStream atau RandomAccessFile biasa untuk sering melakukan operasi baca dan tulis, hal ini akan menyebabkan proses melambat karena seringnya membaca dan menulis memori eksternal.
Copy kode kodenya sebagai berikut:
tes paket;
impor java.io.BufferedInputStream;
impor java.io.FileInputStream;
impor java.io.FileNotFoundException;
impor java.io.IOException;
impor java.io.RandomAccessFile;
impor java.nio.MappedByteBuffer;
impor java.nio.channels.FileChannel;
Tes kelas publik {
public static void main(String[] args) {
mencoba {
FileInputStream fis=fileInputStream baru("/home/tembakau/test/res.txt");
int jumlah=0;
ke dalam n;
panjang t1=Sistem.currentTimeMillis();
mencoba {
while((n=fis.baca())>=0){
jumlah+=n;
}
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
panjang t=Sistem.currentTimeMillis()-t1;
System.out.println("jumlah:"+jumlah+" waktu:"+t);
} tangkapan (FileNotFoundException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
mencoba {
FileInputStream fis=fileInputStream baru("/home/tembakau/test/res.txt");
BufferedInputStream bis=bufferedInputStream baru(fis);
int jumlah=0;
ke dalam n;
panjang t1=Sistem.currentTimeMillis();
mencoba {
while((n=bis.baca())>=0){
jumlah+=n;
}
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
panjang t=Sistem.currentTimeMillis()-t1;
System.out.println("jumlah:"+jumlah+" waktu:"+t);
} tangkapan (FileNotFoundException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
Buffer MappedByteBuffer=null;
mencoba {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
int jumlah=0;
ke dalam n;
panjang t1=Sistem.currentTimeMillis();
untuk(int i=0;i<1253244;i++){
n=0x000000ff&buffer.get(i);
jumlah+=n;
}
panjang t=Sistem.currentTimeMillis()-t1;
System.out.println("jumlah:"+jumlah+" waktu:"+t);
} tangkapan (FileNotFoundException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
}
}
File pengujian adalah file dengan ukuran 1253244 byte. Hasil tes:
Copy kode kodenya sebagai berikut:
jumlah:220152087 waktu:1464
jumlah:220152087 waktu:72
jumlah:220152087 waktu:25
Ini menunjukkan bahwa data yang dibaca sudah benar. Hapus bagian pemrosesan data.
Copy kode kodenya sebagai berikut:
tes paket;
impor java.io.BufferedInputStream;
impor java.io.FileInputStream;
impor java.io.FileNotFoundException;
impor java.io.IOException;
impor java.io.RandomAccessFile;
impor java.nio.MappedByteBuffer;
impor java.nio.channels.FileChannel;
Tes kelas publik {
public static void main(String[] args) {
mencoba {
FileInputStream fis=fileInputStream baru("/home/tembakau/test/res.txt");
int jumlah=0;
ke dalam n;
panjang t1=Sistem.currentTimeMillis();
mencoba {
while((n=fis.baca())>=0){
//jumlah+=n;
}
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
panjang t=Sistem.currentTimeMillis()-t1;
System.out.println("jumlah:"+jumlah+" waktu:"+t);
} tangkapan (FileNotFoundException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
mencoba {
FileInputStream fis=fileInputStream baru("/home/tembakau/test/res.txt");
BufferedInputStream bis=bufferedInputStream baru(fis);
int jumlah=0;
ke dalam n;
panjang t1=Sistem.currentTimeMillis();
mencoba {
while((n=bis.baca())>=0){
//jumlah+=n;
}
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
panjang t=Sistem.currentTimeMillis()-t1;
System.out.println("jumlah:"+jumlah+" waktu:"+t);
} tangkapan (FileNotFoundException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
Buffer MappedByteBuffer=null;
mencoba {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
int jumlah=0;
ke dalam n;
panjang t1=Sistem.currentTimeMillis();
untuk(int i=0;i<1253244;i++){
//n=0x000000ff&buffer.get(i);
//jumlah+=n;
}
panjang t=Sistem.currentTimeMillis()-t1;
System.out.println("jumlah:"+jumlah+" waktu:"+t);
} tangkapan (FileNotFoundException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
}
}
Hasil tes:
Copy kode kodenya sebagai berikut:
jumlah:0 waktu:1458
jumlah:0 waktu:67
jumlah:0 waktu:8
Dapat dilihat bahwa kecepatannya akan sangat ditingkatkan dengan memetakan sebagian atau seluruh file ke dalam memori untuk membaca dan menulis.
Hal ini karena file yang dipetakan memori pertama-tama memetakan file di memori eksternal ke area kontinu di memori, yang diperlakukan sebagai array byte. Operasi baca dan tulis langsung beroperasi di memori, dan kemudian memetakan kembali area memori ke memori eksternal.file, yang menghemat waktu sering membaca dan menulis penyimpanan eksternal dan sangat mengurangi waktu membaca dan menulis.