2017-06-05 10 views
-2

チャネルとバッファ(java.nioから)を使用して、ファイルから作成したオブジェクトの種類を読み書きすることが可能かどうかを知りたいですか?チャネルとバッファ(java.nio)を使用して、ファイルから作成したオブジェクトの種類を読み書きすることはできますか?

たとえば、ここにコードサンプルがあります(コードの一部ではないので、「finally」またはそれ以上のtry-with-ressourcesを使用しないでください)。なぜこの質問をしているのかを示す例です。私は(test.txtの4 Moのファイルである)、このコードを実行すると

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.CharBuffer; 
import java.nio.channels.FileChannel; 

public class Main { 
public static void main(String[] args) { 

FileInputStream fis; 
BufferedInputStream bis; 
FileChannel fc; 

try { 
    fis = new FileInputStream(new File("test.txt")); 
    bis = new BufferedInputStream(fis); 
    //initializing timer 
    long time = System.currentTimeMillis(); 
    //reading 
    while(bis.read() != -1); 
    //execution time 
    System.out.println("Execution time with a conventionnal buffer (BufferedInputStream) : " + (System.currentTimeMillis() - time)); 

    //again 
    fis = new FileInputStream(new File("test.txt")); 
    //but we catch the channel 
    fc = fis.getChannel(); 
    //from that we deduce the size 
    int size = (int)fc.size(); 
    //We create a buffer corresponding to the size of the file 
    ByteBuffer bBuff = ByteBuffer.allocate(size); 

    //initializing the timer 
    time = System.currentTimeMillis(); 
    //starting reading 
    fc.read(bBuff); 
    //preparing reading calling flip 
    bBuff.flip(); 
    //printing execution time 
    System.out.println("Execution time with a new buffer (java.nio Buffer) : " + (System.currentTimeMillis() - time)); 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
} 
} 

、Iは、実行時間が約10倍速い第二の方法と最初のものよりもあることがわかります。 この例では、これはバイトバッファで行われますが、任意の種類のプリミティブ型(IntBuffer、CharBuffer、...)で行うことができます。

作成したオブジェクトのタイプでこの2番目のメソッド(java.nio Bufferを使用)を使用することもできますか?それが唯一の第2のケースで下塗りされたキャッシュをテストして、

ObjectInputStream ois = new ObjectInputStream(
          new BufferedInputStream(
           new FileInputStream(
            new File("test.txt")))); 

答えて

0
  1. あなたのベンチマークは無効ですか、私は次のようにそれで(BufferedInoutStreamを使用して)最初のメソッドを使用する必要があります。 2つの異なるファイルで、または他の順序で試してみてください。あなたは同じ結果を得ることはありません。
  2. いずれにしても、あなたのテストは遠隔比較可能でさえありません。最初のケースでタイミングする必要があるのは、2番目のケースと同じサイズのバッファにbis.read(byte[])です。

有効なテストを実行すると、違いがある場合はほとんど見つからないため、あなたの質問に動機付けがないことがわかります。あなたの最初の例としてBufferedInputStreamを使用してください。

関連する問題