Java'da bir OutputStream'den (bu veriyi o akışa kendim veriyorum) bir ByteBuffer'a koymalıyım. Basit bir şekilde nasıl yapılır?Bir OutputStream'den bir ByteBuffer'a veri nasıl eklenir?
cevap
ByteArrayOutputStream
yazabilir ve buna yazabilir ve toByteArray()
kullanarak içeriğini byte[]
olarak ayıklayabilirsiniz. Sonra ByteBuffer.wrap(byte [])
, çıkış bayt dizisinin içeriğiyle bir ByteBuffer
oluşturur.
Bu, yorumunuzu okumadan hemen önce yaptığım şey. Bu yüzden şunu onaylayabilirim :)) – drasto
Ne yazık ki, ByteArrayOutputStream # toByteArray() 'temeldeki bayt dizisinin bir kopyasını oluşturur, bu yüzden bu reçete basitken, istediğimiz kadar verimli olmaz. Ancak, ByteBuffer'ın kapasite olarak sabitlendiğinden, bir "OutputStream" aracılığıyla bir "ByteBuffer" içine rasgele miktarda veri yazma isteği uzlaştırılamaz. – seh
@seh Bu şekilde olmak zorunda değil - cevabımı gör. – mark
OutputStream yerine PipedOutputStream kullanmayı deneyin. Daha sonra PipedOutputStream'den geri veri okumak için bir PipedInputStream bağlayabilirsiniz.
Güzel görünüyor. Benzer bir düşünce, newInputStream yöntemini çağırarak ByteArrayOutputStream ile yapılabilir. Bununla birlikte, ByteArrayOutputStream'i doğrudan ByteBuffer'a yedekleyen diziyi sarmalamak için daha doğru bir çözüm var. Yaptığım şey buydu. – drasto
@ DJClayworth'un yanıtının daha verimli bir varyantı var.
zamanda @seh doğru fark, ByteArrayOutputStream.toByteArray()
verimsiz olabilir destek byte[]
nesne, bir kopyasını döndürür. Ancak, byte[]
desteğinin yanı sıra baytların sayısı da ByteArrayOutputStream
sınıfının korumalı üyeleridir. Dolayısıyla, doğrudan onlara açığa ByteArrayOutputStream kendi varyantı oluşturabilirsiniz: Bu sınıfını kullanma
public class MyByteArrayOutputStream extends ByteArrayOutputStream {
public MyByteArrayOutputStream() {
}
public MyByteArrayOutputStream(int size) {
super(size);
}
public int getCount() {
return count;
}
public byte[] getBuf() {
return buf;
}
}
kolaydır:
Sonuç olarakMyByteArrayOutputStream out = new MyByteArrayOutputStream();
fillTheOutputStream(out);
return new ByteArrayInputStream(out.getBuf(), 0, out.getCount());
kez tüm çıkış aynı tampon kullanılır yazılır Bir giriş akışının temeli olarak.
İyi nokta, @mark. Java projelerimin çoğunda böyle bir sınıf var, genellikle 'PromiscuousByteArrayOutputStream' adlı paket özel sınıfı olarak kısıtlanmış. İsim kasten uzun ve uğursuz. ByteArrayOutputStream.size(), sayımı döndürdüğünden, – seh
getCount() gerekli değildir. –
Yukarıda belirtilen yanıtlar sorununuzu çözse de, bunların hiçbiri NIO'dan beklediğiniz kadar verimli değildir. ByteArrayOutputStream veya MyByteArrayOutputStream önce verileri bir Java yığın belleğine yazar ve daha sonra performansı büyük ölçüde etkileyen ByteBuffer'a kopyalayın.
Etkin bir uygulama, ByteBufferOutputStream sınıfını kendiniz yazıyor olabilir. Aslında yapmak oldukça kolay. Sadece bir write() yöntemi sağlamanız gerekir. ByteBufferInputStream için bu bağlantıya bakın.
, yeni bir ByteBuffer almak için yeni bir dizi ayırmak yerine, mevcut bir ByteBuffer'ı (ve onun altında yatan diziyi) yeniden kullanmak gerektiğinden, bu cevabın daha kabul edilebilir olduğuna inanıyorum. – Ambling
- 1. R'de bir veri kümesine başlık nasıl eklenir?
- 2. Çekirdek alanından bir pakete nasıl veri eklenir?
- 3. SQLite'ye veri nasıl eklenir?
- 4. Yenilemeden alana nasıl veri eklenir?
- 5. Mevcut LMDB'ye veri nasıl eklenir?
- 6. Veri kutusuna bir onay kutusu denetimi nasıl eklenir?
- 7. VBA kullanarak bir hücreye veri doğrulama nasıl eklenir
- 8. Core-plot Soru: Bir veri göstergesinin nasıl eklenir Gösterge
- 9. bir Listesine veri öğelerini nasıl eklenir <Struct>
- 10. WPF'de çok sütunlu, veriye bağlı bir ListView'e nasıl veri eklenir
- 11. Sadece sorgular kullanarak bir SQLite tablosuna rastgele veri nasıl eklenir?
- 12. HoverTool bir Veri Tablosuna nasıl eklenir (Bokeh, Python)
- 13. ExtJS'de, veri ızgara satırlarına özel bir CSS sınıfı nasıl eklenir?
- 14. Başka bir sütundan koşullu bir bildirime dayanarak veri çerçevesine bir faktör sütunu nasıl eklenir?
- 15. ExtJs rendered html'ye veri öznitelikleri nasıl eklenir?
- 16. JQuery kullanarak CKEditor'a veri nasıl eklenir?
- 17. Sabit veri tablosunda dinamik sütunlar nasıl eklenir
- 18. Basit_formdaki form etiketine veri özniteliği nasıl eklenir?
- 19. Morris çubuk grafiğe dinamik veri nasıl eklenir
- 20. C# Tooltiptext, veri dizisi başlığına nasıl eklenir?
- 21. Çocuk bir LegendItem'e nasıl eklenir?
- 22. Çıktının bir dosyaya nasıl eklenir?
- 23. UILextPressGestureRecognizer bir UITextField'a nasıl eklenir?
- 24. Bir TextBlock'u tıklattığımda bir olay nasıl eklenir?
- 25. Bir AutoCompleteTextView'a özel bir adaptör nasıl eklenir
- 26. Eclipse - Yeni bir MariaDB bağlantısı nasıl eklenir
- 27. PostgreSQL'de, COPY komutu ile veri nasıl eklenir?
- 28. Uygulamanın APK'sı ile veri dosyaları nasıl eklenir?
- 29. R'de bir data.frame'e nasıl belge eklenir?
- 30. H2 veritabanında belirli bir UUID nasıl eklenir?
Genel olarak, doğrudan bir çıkış akışından okuyamazsınız. Verileri kendiniz doldurursanız, neden onu ByteBuffer'a da yerleştiremezsiniz? –
Doğrudan OutputStream formunu devralan ve doğrudan okunmasını mümkün kılan bir sınıf oluşturursanız, dolaylı olarak ve dolaylı olarak da okumak mümkündür. Verileri kendim doldurmadım, bazı çerçeve yaptım (ve çerçevenin nedenine değinmek istemiyorum). Diğer yorumumu ve cevaplarımı da gör. – drasto