Reader ve InputStream arasındaki fark nedir?


87

Reader ve InputStream arasındaki fark nedir? Ve ne zaman kullanılmalı? Reader'ı karakterleri okumak için kullanabilirsem, neden girdi akışını kullanacağım, sanırım nesneleri okumak için?


3
"Nesneleri okumam gerektiğini tahmin ediyorum?" İle ilgili olarak, Java nesnelerini okumak / yazmak için özel Giriş / Çıkış akışları vardır. Bunlar sırasıyla ObjectInputStream ve ObjectOutputStream'dir ve daha büyük serileştirme çerçevesinin parçasıdır. java.sun.com/developer/technicalArticles/Programming/… Ancak bu, giriş / çıkış akışlarının yalnızca bir kullanımı, diğerleri bir soket üzerinden veri gönderiyor olabilir vb.
Mark Peters

Yanıtlar:


138

Bir InputStream, bir kaynaktan bilgi almanın ham yöntemidir. Herhangi bir çeviri yapmadan veri baytını bayt olarak alır. Görüntü verilerini veya herhangi bir ikili dosya okuyorsanız, kullanılacak akış budur.

Okuyucu, karakter akışları için tasarlanmıştır. Okuduğunuz bilgilerin tamamı metinse, Okuyucu sizin için karakter kod çözme işlemiyle ilgilenecek ve ham giriş akışından size unicode karakterleri verecektir. Herhangi bir türde metin okuyorsanız, bu kullanılacak akıştır.

InputStreamReader sınıfını kullanarak bir InputStream'i sarabilir ve Reader'a dönüştürebilirsiniz.

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);

kusursuz cevap Berin! Teşekkürler!
Gaurav

18

InputStreams, bir akıştan bayt okumak için kullanılır. Bu nedenle görüntüler, video ve serileştirilmiş nesneler gibi ikili veriler için kullanışlıdırlar.

Öte yandan okuyucular, karakter akışlarıdır, bu nedenle en iyi karakter verilerini okumak için kullanılırlar.


Ne zaman kullanılır read()bayt ve kullanılacak ile bayt read(byte[])byte dizisini. Bence dizi okumak her zaman daha iyidir. o zaman bana read()bayt bayt bayt bayt read(byte[])dizisinin veya bayt dizisinin nerede kullanılacağına dair örnek verebilir misiniz ? VEYA BufferedInputStream.?
Asif Mushtaq

11

Sanırım kafa karışıklığının kaynağı, InputStream.read()bir intve Reader.read()aynı zamanda birint .

Aradaki fark, InputStream.read()bayt akışının ham içeriğine karşılık gelen 0 ile 255 arasındaki bayt değerlerini Reader.read()döndürmesi ve 0 ile 65357 arasındaki karakter değerini döndürmesidir (çünkü 65358 farklı unicode kod noktası vardır)

Bir InputStreamiçindekiler, bayt örneğin içeriği bayt okuma sağlayan "bir ‡ bir" 5 bayt (bir şekilde temsil edilen her birinin bir akışı olarak okunur intsonuçlanan 0 ile 255 arasında) 97, 226, 128, 161ve 97burada

a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)

Bir Readersen karakteri öylesine içerikler "bir ‡ bir" 3 karakter olarak okunur tarafından içeriği karakterini okumasına olanak sağlar 97, 8225ve97

a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97

‡ karakteri Unicode'da U + 2021 olarak anılır


Kabul edilen cevap bu olmalıdır. Örnek için teşekkürler
alegria

2

InputStream ve Okuyucunun Arka Planı:

Java'nın ilk günlerinde, konsol girişi gerçekleştirmenin tek yolu bir bayt akışı (InputStream ve OutputStream) kullanmaktı.

Kullanım durumları:

Bugün, konsol akışını okumak için bir bayt akışı kullanmak da kabul edilebilir. Bununla birlikte, ticari uygulamalar için, konsol girişini okumak için tercih edilen yöntem, karakter yönelimli akış (Okuyucu) kullanmaktır. Okuyucu, uluslararasılaşmanızı ve sürdürmenizi kolaylaştırır.

Not: Bu, Java G / Ç kodlarını keşfetmek için fazladan bir bilgidir, Java G / Ç uygulamasının tasarım modeli, dekoratör tasarım modelini takip eder. Dekoratör tasarım modeline aşina iseniz, uygulamayı kolayca yakalayabilirsiniz.



0

InputStream bayt kabul eder , Okuyucu karakter kabul eder, Java'da bir karakter = iki bayt ve Okuyucu arabellek kullanır, InputStream kullanılmaz. Diskteki tüm dosya deposu veya bayta dayalı aktarım, görüntü ve videoyu içerir, ancak karakter bellekte olduğundan, InputStream sık sık kullanılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.