您的位置:首页 > 职场人生

黑马程序员-day21-IO流(字符编码)

2014-06-24 21:06 197 查看
-------
android培训、java培训、期待与您交流! ----------
 
字符编码

1.字符流的出现为了方便操作字符。

2.更重要是的加入了编码转换。

3.通过子类转换流来完成。

 InputStreamReader

 OutputStreamWriter

4.在两个对象进行构造的时候可以加入字符集
 

编码表的由来

计算机只能识别二进制数据,早期由来是电信号。

为了方便应用计算机,让它可以识别各个国家的文字。

就将各个国家的文字用数字来表示,并一一对应,形成一张表。这就是编码表。

常见的编码表

1.ASCII:美国标准信息交换码。

 用一个字节的7位可以表示。

2.ISO8859-1:拉丁码表。欧洲码表

 用一个字节的8位表示。

3.GB2312:中国的中文编码表。

4.GBK:中国的中文编码表升级,融合了更多的中文文字符号。

5.Unicode:国际标准码,融合了多种文字。

 所有文字都用两个字节来表示,Java语言使用的就是unicode

6.UTF-8:最多用三个字节来表示一个字符。

转换流的字符编码

import java.io.*;

class EncodeStream {
public static void main(String[] args) throws IOException {
//writeText();
readText();
}

public static void readText()throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("utf.txt"),"gbk");

char[] buf = new char[10];
int len = isr.read(buf);

String str = new String(buf,0,len);

System.out.println(str);

isr.close();
}
public static void writeText()throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf.txt"),"UTF-8");

osw.write("你好");

osw.close();
}
}


转换流的编码应用

1.可以将字符以指定编码格式存储。

2.可以对文本数据指定编码格式来解读。

3.指定编码表的动作由构造函数完成

 

字符编码过程

1.编码:字符串→字节数组

2.解码:字节数组→字符串

实例:

/*
编码:字符串变成字节数组。
解码:字节数组变成字符串。
String-->byte[];  str.getBytes(charsetName);
byte[] -->String: new String(byte[],charsetName);
*/
import java.util.*;
class  EncodeDemo{
public static void main(String[] args)throws Exception {
String s = "你好";

byte[] b1 = s.getBytes("GBK");

4000
System.out.println(Arrays.toString(b1));
String s1 = new String(b1,"utf-8");
System.out.println("s1="+s1);

//对s1进行iso8859-1编码。
byte[] b2 = s1.getBytes("utf-8");
System.out.println(Arrays.toString(b2));

String s2 = new String(b2,"gbk");

System.out.println("s2="+s2);
}
}


字符编码-联通


class EncodeDemo2 {
public static void main(String[] args) throws Exception{
String s = "j?";

byte[] by = s.getBytes("gbk");

for(byte b : by){
System.out.println(Integer.toBinaryString(b&255));
}
System.out.println("Hello World!");
}
}


 

练习

/*
有五个学生,每个学生有3门课的成绩,
从键盘输入以上数据(包括姓名,三门课成绩),
输入的格式:如:zhagnsan,30,40,60计算出总成绩,
并把学生的信息和计算出的总分数高低顺序存放在磁盘文件"stud.txt"中。

1.描述学生对象。
2.定义一个可操作学生对象的工具类。

思路:
1.通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象。
2.因为学生有很多,那么就需要存储,使用到集合。因为要对学生的总分排序。
所以可以使用TreeSet。
3.将集合的信息写入到一个文件中。
*/

import java.io.*;
import java.util.*;

class Student implements Comparable<Student>{
private String name;
private int ma,cn,en;
private int sum;

Student(String name,int ma,int cn,int en){
this.name = name;
this.ma = ma;
this.cn = cn;
this.en = en;
sum = ma + cn + en;
}

public int compareTo(Student s){
int num = new Integer(this.sum).compareTo(new Integer(s.sum));
if(num==0)
return this.name.compareTo(s.name);
return num;
}

public String getName(){
return name;
}
public int getSum(){
return sum;
}

public int hashCode(){
return name.hashCode()+sum*78;
}
public boolean equals(Object obj){
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s = (Student)obj;

return this.name.equals(s.name) && this.sum==s.sum;
}

public String toString(){
return "student["+name+", "+ma+", "+cn+", "+en+"]";
}
}

class StudentInfoTool{
public static Set<Student> getStudents()throws IOException{
return getStudents(null);
}

public static Set<Student> getStudents(Comparator<Student> cmp)throws IOException{
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));

String line = null;

Set<Student> stus  = null;
if(cmp==null)
stus = new TreeSet<Student>();
else
stus = new TreeSet<Student>(cmp);
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;

String[] info = line.split(",");

Student stu = new Student(info[0],Integer.parseInt(info[1]),
Integer.parseInt(info[2]),
Integer.parseInt(info[3]));

stus.add(stu);
}

bufr.close();
return stus;
}

public static void write2File(Set<Student> stus)throws IOException{
BufferedWriter bufw = new BufferedWriter(new FileWriter("stuinfo.txt"));

for(Student stu : stus){
bufw.write(stu.toString()+"\t");
bufw.write(stu.getSum()+"");
bufw.newLine();
bufw.flush();
}

bufw.close();
}
}

class StudentInfoTest {
public static void main(String[] args) throws IOException{
Comparator<Student> cmp = Collections.reverseOrder();

Set<Student> stus = StudentInfoTool.getStudents(cmp);

StudentInfoTool.write2File(stus);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: