Java 的 基 本 的char 类 型 被 定 义 成 无 符 号 的16 位, 它 是Java 中 唯 一 的 一 个 无 符 号 类 型。 使 用16 位 表 达 字 符 的 主 要 原 因 是 要 让Java 能 够 支 持 任 何Unicode 字 符, 因 此 而 使 得Java 适 用 于 描 述 或 显 示 任 何 被Unicode 支 持 的 语 言, 可 移 植 性 也 就 会 更 好。 但 是, 能 够 支 持 某 种 语 言 的 字 符 串 显 示, 和 能 够 正 确 打 印 某 种 语 言 的 字 符 串, 常 常 是 两 个 不 同 的 问 题。 由 于Oak(Java 最 初 的 代 号) 开 发 组 的 主 要 环 境 是Unix 系 统 和 某 些 源 于Unix 的 系 统, 所 以 对 开 发 人 员 来 说, 最 为 方 便 实 用 的 字 符 集 是ISO Latin-1。 相 应 地, 这 一 开 发 组 就 带 有Unix 遗 传 性, 也 就 导 致 了Java 的I/O 系 统 在 很 大 程 度 上 以Unix 的 流 概 念 为 模 型, 而 在Unix 系 统 中, 每 一 种I/O 设 备 都 是 用 一 串8 比 特 的 流 来 表 示。 这 种 在I/O 系 统 方 面 取 模 于Unix 的 做 法, 使 得Java 语 言 拥 有16 位 的Java 字 符, 而 却 只 有8 位 的 输 入 设 备, 这 样 就 给Java 带 来 了 些 不 足。 因 此 在 任 何 一 处Java 字 符 串 按8 位 来 读 入 或 写 出 的 地 方, 都 得 有 一 小 段 程 序 代 码, 被 称 为" 劈(hack)", 来 将8 位 的 字 符 映 射 成 为16 位Unicode, 或 将16 位 的Unicode 劈 成8 位 字 符。
例子:
下面程序代码:说名利用InputStringReader类,从原始的byte数据来转换成既定的字符集
import java.io.*;
public class rfnew
{
public static void main(String args[])
{
FileInputStream fis;
InputStreamReader isr;
char ch;
try
{
fis = new FileInputStream("gq.txt");
isr = new InputStreamReader(fis);
while (true)
{
ch = (char) isr.read();
System.out.print(ch);
System.out.flush();
if (ch == '\n') break;
}
fis.close();
}
catch (Exception e) { }
System.exit(0);
}
}
InputStringReader类的说明:
An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified charset. The charset that it uses may be specified by name or may be given eXPlicitly, or the platform's default charset may be accepted.