API ドキュメントの説明: InputStreamReader クラスは、バイト ストリームから文字ストリームへのブリッジです。指定された文字セットを使用してバイトを読み取り、文字にデコードします。使用する文字セットは、名前を指定するか、明示的に指定するか、プラットフォームのデフォルトの文字セットを受け入れることによって設定できます。 InputStreamReader の read() メソッドを呼び出すたびに、基礎となるバイト入力ストリームから 1 つ以上のバイトが読み取られる場合があります。バイトから文字への効率的な変換を実現するには、現在の読み取り操作を満たすために必要なバイト数よりも多くのバイトを基礎となるストリームから抽出できます。より効率的に動作させるには、InputStreamReader をベースとして使用し、それを BufferedReader にパッケージ化することを検討してください。
Reader クラスを継承します
public class InputStreamReader extends Reader {}
1) バイト ストリームからブリッジを理解する方法文字ストリームに?
1. コンピュータの記憶領域の単位はバイトです。たとえば、テキストの本文中には漢字などの文字がありますが、コンピュータにとってはバイトという形で存在します
2. バイト ストリームの読み取りはシングルバイト読み取りですが、文字セットが異なると文字にデコードするのに異なる数値が必要になるため、バイト ストリームの読み取りではエラーが報告されます
バイトをキャッシュするためにバイト ストリームから読み取り、デコードされます。文字セットを介した文字が返されます。これはストリームを使用して実装する必要があります。これは文字ストリーム
4 の形式です。InputStreamReader ストリームがこの役割を果たし、バイト ストリームから文字への変換を実現します。
2) 指定された文字セットを使用してバイトを読み取り、文字にデコードすることをどのように理解していますか?
バイトは本質的に 8 バイナリ ビットであり、異なる文字セットは同じバイトをデコードして異なる文字結果を生成します。したがって、文字を読み取るときに適切な文字セットを指定する必要があります。そうしないと、読み取られた内容が文字化けします。文字
3) 使用する文字セットは名前で指定することも、明示的に指定することも、プラットフォームのデフォルトの文字セットを受け入れることもできます。
は、InputStreamReader クラスに文字セットを設定するための複数のメソッドまたは複数のコンストラクターがあることを意味します
4) InputStreamReader の read() メソッドが呼び出されるたびに、基礎となるバイト入力ストリームから 1 つ以上のバイトを読み取る方法を理解するにはどうすればよいですか?
read() メソッドは、基礎となるバイト ストリームから文字バッファに 2 文字を読み取ろうとします。これは試行であることに注意してください。ファイルの最後の文字に遭遇した場合、読み取りのみが可能です。 1 文字が取得されるため、各 read() メソッドで読み取られるバイト数は可変です。
5) バイトから文字への効率的な変換を実現するために、比率は基本ストリームから抽出できます。現在の読み取り操作に必要なバイト数を増やすには、InputStreamReader を BufferedReader でラップすることを検討してください
これはまだ理解できません。BufferedReader クラスを理解し、読み取り効率を比較して、回答
1) デフォルトの文字セットを使用して、InputStreamReader ストリームを構築します: 本質は、インスタンス ドメインで変数を初期化することであり、文字セットに関する設定は必要ありません。表示されます
public InputStreamReader(InputStream in) { super(in); try { sd = StreamDecoder.forInputStreamReader(in, this, (String)null); } catch (UnsupportedEncodingException e) { throw new Error(e); } }
2) 指定された文字セット名を使用して、InputStreamReader ストリームを構築します。本質は、インスタンス ドメインで変数を初期化することです。文字セットが初期化メソッドの 3 番目のパラメータであることがわかります。
public InputStreamReader(InputStream in, String charsetName) throws UnsupportedEncodingException { super(in); if (charsetName == null) throw new NullPointerException("charsetName"); sd = StreamDecoder.forInputStreamReader(in, this, charsetName); }
3) sd 変数: これは本質的に StreamDecoder クラスのオブジェクトです。InputStreamReader の構築メソッドは、このオブジェクトを初期化することです。
private final StreamDecoder sd;
1 InputStreamReaderAPI クラスのすべての API が sd 変数を使用していることがわかり、InputStreamReader クラスのメソッドの本質は StreamDecoder クラスのメソッド
#2 を呼び出すことであることがわかります。 InputStreamReader クラスのメソッドがどのように重要な役割を果たすかを理解するには、StreamDecoder クラスを理解してください。
/** * 获取设置的字符集 */ public String getEncoding() { return sd.getEncoding(); } /** * 读取流并返回一个字符,遇到文件末尾返回-1 */ public int read() throws IOException { return sd.read(); } /** * 读取字符到字符数组的部分中,遇到文件末尾返回-1 */ public int read(char cbuf[], int offset, int length) throws IOException { return sd.read(cbuf, offset, length); } /** * 检测流是否准备好呗读取 */ public boolean ready() throws IOException { return sd.ready(); } /** * 关闭流并释放资源 */ public void close() throws IOException { sd.close(); }
1. FileReader クラスは次のとおりです。 InputStreamReader の単純な派生であり、関数を拡張しません
2. FileReader クラスによって読み取られるデータの本質は、InputStreamReader クラスのデータです。読み取り中、InputStreamReader によって読み取られるデータは、実際には StreamDecoder によって読み取られます。 class
3. したがって、文字入力ストリームを使用する場合、実際には StreamDecoder クラスが機能します
以上がJAVAでInputStreamReaderストリームを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。