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?
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?
Yanıtlar:
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);
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.
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
.?
Sanırım kafa karışıklığının kaynağı, InputStream.read()
bir int
ve 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 InputStream
iç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 int
sonuçlanan 0 ile 255 arasında) 97
, 226
, 128
, 161
ve 97
burada
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 Reader
sen karakteri öylesine içerikler "bir ‡ bir" 3 karakter olarak okunur tarafından içeriği karakterini okumasına olanak sağlar 97
, 8225
ve97
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
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.
Biri baytları, diğeri karakterleri kabul ediyor.
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.