字符流分类详细介绍和各种字符流类介绍与使⽤字符集
1、字符流:
字节流不能操作Unicode字符,由于Java采⽤16位的Unicode字符,即⼀个字符占16位,所以要使⽤基于
字符的输⼊输出操作。所以创造了字符流,以提供直接的字符输⼊输出的⽀持。
2、字符流类的层次结构:
2.1、输⼊流的类层次结构:
2.2、输出流的类层次结构
3、字符流的顶层抽象类:
Reader和Writer。
public abstract class Reader extends Object implements Readable, Closeable
⽤于读取字符流的抽象类。⼦类必须实现的⽅法只有 read(char[], int, int) 和 close()。但是,多数⼦类将
重写此处定义的⼀些⽅法,以提供更⾼的效率和/或其他功能。
public abstract class Writer extends Object implements Appendable, Closeable, Flushable
写⼊字符流的抽象类。⼦类必须实现的⽅法仅有 write(char[], int, int)、flush() 和 close()。但是,多数⼦
类将重写此处定义的⼀些⽅法,以提供更⾼的效率和/或其他功能。
4、java.io包中⽤于处理字符流的基本类InputStreamReader和
OutputStreamWriter:
InputStreamReader是字节流通向字符流的桥梁:它使⽤指定的 charset 读取字节并将其解码为字符。它
使⽤的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
OutputStreamWriter 是字符流通向字节流的桥梁:可使⽤指定的 charset 将要写⼊流中的字符编码成字
节。它使⽤的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
4.1、InputStreamReader主要构造⽅法:
InputStreamReader(InputStream in) 创建⼀个使⽤默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs) 创建使⽤给定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec) 创建使⽤给定字符集解码器的
InputStreamReader。 InputStreamReader(InputStream in, String charsetName) 创建使⽤指定字符集的
InputStreamReader。
4.2、OutputStreamWriter主要构造⽅法:
OutputStreamWriter(OutputStream out) 创建使⽤默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs) 创建使⽤给定字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使⽤给定字符集编码器的
OutputStreamWriter。 OutputStreamWriter(OutputStream out, String charsetName) 创建使⽤指定字符
集的 OutputStreamWriter。
5、字符流的使⽤例⼦:
java语言使用的字符码集是5.1、下⾯使⽤了⼀些常⽤的字符流对象实现⽂件的输出和输⼊:
//创建⽂件字节输出流
FileOutputStream fos = new FileOutputStream("D:/");
//把字节输出流转换成字符输出流,并使⽤了BufferedWriter提供缓冲功能
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(fos));
bw.write("arthinking");
bw.close();
//创建⽂件字节输⼊流
FileInputStream fis = new FileInputStream("D:/");
//把字节输⼊流转换成字符输⼊流,并使⽤了BufferedReader提供缓冲功能
BufferedReader br = new BufferedReader(
new InputStreamReader(fis));
String str = br.readLine();
while(null != str){
System.out.println(str);
str = br.readLine();
}
br.close();
}
5.2、下⾯把标准的输⼊流封装成字符流并添加缓冲功能:
标准的输出流和标准的输⼊流是字节流:
static InputStream in “标准”输⼊流。 static PrintStream out “标准”输出流。
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
String str;
while(null != (str = br.readLine())){
System.out.println(str);
}
}
5.3、FileReader和FileWriter的使⽤:
public class FileReader extends InputStreamReader
⽤来读取字符⽂件的便捷类。此类的构造⽅法假定默认字符编码和默认字节缓冲区⼤⼩都是适当的。要⾃⼰指定这些值,可以先在 FileInputStream 上构造⼀个 InputStreamReader。
FileReader ⽤于读取字符流。要读取原始字节流,请考虑使⽤ FileInputStream。
public class FileWriter extends OutputStreamWriter
⽤来写⼊字符⽂件的便捷类。此类的构造⽅法假定默认字符编码和默认字节缓冲区⼤⼩都是可接受的。要⾃⼰指定这些值,可以先在 FileOutputStream 上构造⼀个 OutputStreamWriter。
⽂件是否可⽤或是否可以被创建取决于底层平台。特别是某些平台⼀次只允许⼀个 FileWriter(或其他⽂件写⼊对象)打开⽂件进⾏写⼊。在这种情况下,如果所涉及的⽂件已经打开,则此类中的构造⽅法将失败。
FileWriter ⽤于写⼊字符流。要写⼊原始字节流,请考虑使⽤ FileOutputStream。
使⽤FileReader和FileWriter读取⽂件和写出⽂件:
String str = "hello world";
//创建字符数组并初始化
char[] buffer = new char[str.length()];
//创建FileWriter
FileWriter fw = new FileWriter("D:/");
//逐个字符的输出到⽂件
for(int i=0; i<buffer.length; i++){
fw.write(buffer[i]);
}
fw.close();
//创建FileReader
BufferedReader br = new BufferedReader(
new FileReader("D:/"));
//使⽤BufferedReader提供的逐⾏读取函数读取⽂件
while(null != (str = br.readLine())){
System.out.println(str);
}
br.close();
}
5.4、CharArrayReader和CharArrayWriter的使⽤
public class CharArrayReader extends Reader
此类实现⼀个可⽤作字符输⼊流的字符缓冲区。
public class CharArrayWriter extends Writer
此类实现⼀个可⽤作 Writer 的字符缓冲区。缓冲区会随向流中写⼊数据⽽⾃动增长。可使⽤toCharArray() 和 toString() 获取数据。
注:在此类上调⽤ close() ⽆效,并且在关闭该流后可以调⽤此类中的各个⽅法,⽽不会产⽣任何IOException。
下⾯使⽤CharArrayReader读取字符数组:
public static void main(String[] args) throws IOException {
String str = "arthinking";
//创建并初始化字符数组
char[] ch = new char[str.length()];
//通过字符数组初始化字符数组输⼊流
CharArrayReader cr = new CharArrayReader(ch);
int c;
while(-1 != (c = cr.read())){
System.out.print((char)c);
}
}
5.5、RandomAccessFile的使⽤:
public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable 此类的实例既可以⽀持对随机访问⽂件的读取也可以⽀持对其写⼊。
随机访问⽂件的⾏为类似存储在⽂件系统中的⼀个⼤型 byte 数组。存在指向该隐含数组的光标或索引,称为⽂件指针;输⼊操作从⽂件指针开始读取字节,并随着对字节的读取⽽前移此⽂件指针。如果随机访问⽂件以读取/写⼊模式创建,则输出操作也可⽤;输出操作从⽂件指针开始写⼊字节,并随着对字节的写⼊⽽前移此⽂件指针。写⼊隐含数组的当前末尾之后的输出操作导致该数组扩展。该⽂件指针可以通过getFilePointer ⽅法读取,并通过 seek ⽅法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达⽂件末尾,则抛出EOFException(是⼀种 IOException)。如果由于某些原因⽆法读取任何字节,⽽不是在读取所需数量的字节之前已到达⽂件末尾,则抛出 IOException,⽽不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。
public static void main(String[] args) throws IOException {
//创建随机访问⽂件
RandomAccessFile raf = new RandomAccessFile("D:/", "rw");
//写⼊数据
raf.writeInt(1);
raf.writeChar('a');
//⽂件指针复位
raf.seek(0);
//输出数据
System.out.adInt() + "" + adChar());
}
6、字符集编码介绍:
ASCII:
它主要⽤于显⽰现代英语和其他西欧语⾔。它是现今最通⽤的单字节编码系统,并等同于国际标准ISO 646。可显⽰字符:英⽂⼤⼩写字符、阿拉伯数字和西⽂符号。
ISO-8859-1:
是四⽅国家所使⽤的编码机,单字节的字符集。
GB2312:
GB2312是中国国家标准的简体中⽂字符集。它所收录的汉字已经覆盖99.75%的使⽤频率,基本满⾜了汉字的计算机处理需要。在中国⼤陆和新加坡获⼴泛使⽤。
GBK:
除了完全兼容GB2312之外,还对繁体中⽂,不常⽤汉字和特殊符号进⾏了编码。
UTF-8:
UTF-8便于不同的计算机之间使⽤⽹络传输不同语⾔和编码的⽂字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。
UTF-8使⽤可变长度字节来储存 Unicode字符,例如ASCII字母继续使⽤1字节储存,重⾳⽂字、希腊字母或西⾥尔字母等使⽤2字节来储存,⽽常⽤的汉字就要使⽤3字节。辅助平⾯字符则使⽤4字节。
Unicode:
⼀种通⽤字符集,每个字符都⽤2个字节来表⽰,对于英⽂字符采⽤前⾯补0的⽅法实现等长兼容。
除了⽂章中有特别说明,均为IT宅原创⽂章,转载请以链接形式注明出处。本⽂链接:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。