2009-02-20 21 views
5

Şu anda Java'ya rastgele ikili dosya erişimi için kullanılan bir Delphi yöntemini dönüştürüyorum. Delphi yordamı kullanır: Tek bir dizi içine bayt dizisini okumak için : . Java'da bunu dizide yinelemeden yapmanın eşdeğer bir yolu var mı? Bir bayt dizisini bir dizi flora dönüştürmek

Şu anda

List<Float> l = new ArrayList<Float>(); 
… 
for (int i = 0 ; i < nLinks ; i++) 
l.add(resultsFile.readFloat()); 

kullanıyorum Ama hız endişeleniyorum. Endianness bir problem değil.

cevap

8

Kodu belirlediniz ve aslında bir sorun olduğunu gördünüz mü? 'un bir şeyleri ... ... döngü yapmak zorunda kalacak ... ... bunun kodunuzda bir darboğaz olduğundan emin misiniz?

Tüm bunları söyledikten sonra, istediğiniz şeyi yaptığından şüphelendiğim bir FloatBuffer kullanabilmeniz gerekir. Ne yazık ki Sun'ın JavaDoc'u çalışmıyor, bu yüzden o anda belgelere kolayca bağlanamıyorum veya kontrol edemiyorum.

bir FloatBuffer kullanmak için, muhtemelen isterdim:

  • (FileInputStream.getChannel ile örneğin) dosyası ile ilişkili bir FileChannel
  • Oluştur ByteBuffer
  • bir FloatBuffer sarma oluştur ByteBuffer, ByteBuffer.asFloatBuffer ile
  • FloatBuffer
  • başlayarak oku FileChannel.read ile ByteBuffer (byteBuffer) içine oku

Özellikle java.nio ile tanıdık/rahat değilim, bu yüzden umarım bu bu doğrudur - ama oldukça ciddidir. Şu andaki döngüsünüz neredeyse kesinlikle daha basit olduğundan, ilk önce bunun performansını kontrol etmenizi öneririm! Geçerli FileInputStream dosyanızı bir BufferedInputStream, btw'ye sarmak isteyebilirsiniz. Nihai kod Jon tarafından sağlanan yardım dayanarak

+1

Benim için çalışıyor, en azından üçüncü kez denedim. http://java.sun.com/javase/6/docs/api/java/nio/FloatBuffer.html –

+0

Hala benim için aşağı. Bence bu bir bölünmüş olmalı ... –

+0

Bence bu, cevabın hayır olduğu anlamına geliyor. Aradığım şey, Java'daki işaretçi işleminin çoğaltılmasının bir yoluydu, bir dizi Basit (float) dizisini baytlarla doldurarak (belki de yanlış) bu yinelemeyi önler. Daha sonra myArray [n] – GrahamA

3

şuna benzer:

byte[] bt = new byte[nLinks * 4]; 
List<Float> l = new ArrayList<Float>(); 
if (linkVar != 0 && timePeriod < nPeriods) { 
    long p1 = RECORDSIZE * (nNodes * NODEVARS + nLinks * LINKVARS); 
    long p2 = RECORDSIZE * (nNodes * NODEVARS + nLinks * (linkVar - 1)); 
    long p3 = offset2 + (timePeriod * p1) + p2; 
    resultsFile.seek(p3); 

    resultsFile.read(bt, 0, nLinks * 4); 
    ByteBuffer bb = ByteBuffer.wrap(bt); 
    bb.rewind(); 
    bb.asFloatBuffer().get(values); 
} 
0

her zaman bir yerde bir döngü olacak - bir tampon kopya yöntemi/operasyon içine dahili olarak kendi olup olmadığını veya. İşlerin ötesine geçmenin tek yolu, donanımları ve vektör işlemlerini destekleyen bir derleyici bulmaktır.

İlgili konular