2010-07-29 13 views
9

Bir nesneyi 350 KB büyüklüğündeki bir dosyadan serileştiriyorum ve uzun bir zaman alıyor. Bilgisayar bilimi TA, bana büyük ölçüde performansı artırmak için ObjectInputStream ile birlikte Tamponlu bir okuyucu kullanmanın bir yolu olduğunu söyledi. Bununla birlikte, bu konuda Google'da bir şey bulamıyorum.Arabelleğe alınmış bir ObjectInputStream var mı?

cevap

18

Giriş akışını tamponlamak için süslemeyi kullanırsınız. Bu

InputStream in = ...; // your underlying stream (e.g. FileInputStream) 
    ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in)); 

gibi bu ObjectInputStream her çağrı böyle OS'nin dosya okuma sistemi araması olarak baz akışı in, çağırmaz sağlayacaktır. Bunun yerine, her çağrı, veri bloklarını (varsayılan olarak 8K) getirip önbelleğe alan tamponlanmış girdi akışına gider ve bundan okur. Bu, daha hızlıdır çünkü akıştan okuma, şimdi java'da yerel bir yöntem çağrısıdır ve yöntem çağrısı, daha az sıklıkla bir sistem çağrısının yükü ile karşılaşır. Önbellek tutarlılığı ve JIT optimizasyonları da performansın iyileştirilmesinde devreye giriyor.

+0

'ObjectInputStream' 1k tamponu da zaman en azından bir kısmını kullanır, bu nedenle bu öneri Burada önerildiği gibi dramatik bir etki olmayacaktır. – EJP

+0

@EJP Bu çözüm, BufferedReader'da 'readLine()' yöntemi gibi satırların yanı sıra Nesneleri okumak için yeterince verimli olacak mı? –

2

Resim ancak yukarıdaki kurucu bağımsız değişken olarak BufferedInputStream geçirerek akımı intput resimler tamponlu nesne oluşturmak için ObjectInputStream (içinde inputStream) yapıcı

kullanabilir.

InputStream file = null; 
try { 
    file = new FileInputStream("Out.test"); 
    InputStream buffer = new BufferedInputStream(file); 
    ObjectInputStream in = new ObjectInputStream(buffer); 
    vector = (Vector)in.readObject(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally{ 
    if(file != null) { 
     file.close(); 
    } 
} 

Ödeme Aşağıdaki bağlantı: Burada

dosyadan seri nesneleri okumak için bir örnektir

http://java.sun.com/docs/books/performance/1st_edition/html/JPIOPerformance.fm.html

+0

"Dosya" beyanı satırından sonra bir try try {'ve son olarak {file.close(); } 'in .close();' yerine. –

+0

Bu kod kesinlikle derlenmeyecektir, çünkü 'nihayet' bloğunda 'dosya' bildirilmemiş. – uckelman

+0

@uckelman Şimdi kod derlemelidir. Daha önce ref kodu koydum ama aynı test/derleme yapmadım. – YoK

İlgili konular