编码:
- byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中。
- byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果到新的字节数组中。
解码:
- String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
- String(byte[] bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String
例:(用的是idea编译器)
String s = "中国";
//byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中。
byte[] bys1 = s.getBytes();
System.out.println(Arrays.toString(bys1));
//输出:[-28, -72, -83, -27, -101, -67]
//说明用3个字节表示一个汉字
//byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果到新的字节数组中。
byte[] bys2 = s.getBytes("UTF-8");//采用UTF-8字符集
System.out.println(Arrays.toString(bys2));
//输出:[-28, -72, -83, -27, -101, -67]
//和上面一样,说明idea是默认UTF-8的
byte[] bys3 = s.getBytes("GBK");//手动修改为GBK
System.out.println(Arrays.toString(bys3));
//[-42, -48, -71, -6]变为两个字节表示一个汉字了
//String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
String ss = new String(bys1);//这里用的是上面用过的bys1
System.out.println(ss);
//输出:中国
String ss = new String(bys1,"GBK");
System.out.println(ss);
//输出:涓浗
//因为编译器默认是UTF-8,但我们强行用GBK的编制来解码,所以出错
byte[] bys4 = s.getBytes("GBK");
ss = new String(bys4,"GBK");
System.out.println(ss);
//输出:中国
字符流抽象基类
- Reader:字符输入流的抽象类‘
- Writer:字符输出流的抽象类
字符流中和编码解码问题相关的两个类:
- InputStreamReader
- OutputStreamWriter
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\Software\\File\\test1.txt"));
osw.write("中国");
osw.close();
执行后:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\Software\\File\\test1.txt"),"GBK");
osw.write("中国");
osw.close();
执行后:
因为idea是按照UTF-8来读的。
保留上面的结果,再补一段代码。
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\Software\\File\\test1.txt"),"GBK");
int ch;
while((ch = isr.read()) != -1){
System.out.print((char)ch);
}
//输出:中国
isr.close();
字符流写数据的5种方式
方法名 | 说明 |
---|---|
void write(int c) | 写一个字符 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf,int off,int len) | 写入字符数组的一部分 |
void write(String str) | 写一个字符串 |
void write(String str,int off,int len) | 写一个字符串的一部分 |
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\Software\\File\\test1.txt"));
//void writer(int c)写一个字符
osw.write(97);
//void flush()刷新流,也可以不写,只要后面close()也会刷新
osw.flush();
//void write(char[] cbuf)写入一个字符数组
char[] c1 = {'b', 'c'};
osw.write(c1);
//void write(char[] cbuf,int off,int len)写入字符数组的一部分
char[] c2 = {'d','e'};
osw.write(c2,1,1);这里下标是1,选择长度为1,即写入字符e
//void write(String str)写一个字符串
String s1 = "fg";
osw.write(s1);
//void write(String str,int off,int len)写一个字符串的一部分
String s2 = "hi";
osw.write(s2,1,1);//这里下标是1,选择长度为1,即写入字符i
osw.close();
方法名 | 说明 |
---|---|
flush() | 刷新流,还可以继续写数据 |
close() | 关闭流,释放资源,但是在关闭之前会刷新流。一旦关闭,就不能再写数据 |
字符流读数据的2种方式
方法名 | 说明 |
---|---|
int read() | 一次读一个字符数据 |
int read(char[] cbuf) | 一次读一个字符数组数据 |
例:继续使用上面代码的结果来测试
//InputStreamReader (InputStream in)
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\Software\\File\\test1.txt"));
int ch;
while ((ch = isr.read()) != -1){
System.out.print((char)ch);
}//打印:abcefgi
----------------------------------------------
char[] c = new char[1024];
int len;
while((len = isr.read(c)) != -1){
System.out.println(new String(c,0,len));
}//打印:abcefgi
isr.close();