corejava day11 - 字符编码,字符流
2011/08/05
====================================================
1.字符编码
1)Java字符在内存中是char类型数据,
是一个16位无符号整数,
数值是字符对应的Unicode编码。
字符串就是字符的集合, 是char数组
2)将字符串转换为byte时候就需要按照一定规则
编码处理
如: ‘中’内存中是char
数值是Unicode '\u4e2d'
按照UTF-16BE标准编码为[0x4e, 0x2d]
3)字符编码有:ISO8859-1、GBK、GB2312、UTF-16BE、UTF-8
a.ISO8859-1:西文编码,即ASCII
b.GB2312: 是早期中文编码标准, 能够表示6000多汉字.
c.GBK: 20000+ 汉字, 是GB2312的超集,
1-2变长编码, 英文1字节与ASCII一致,
中文2个字节。
字符串”中ABC”的GBK编码:
byte: d6 d0 41 42 43
11010110 11010000 01000001 01000010 01000011
d.UTF-16BE: 2字节定长编码,
中英文都采用固定16位长度表示。
字符串”中AB”的UTF-16BE编码:
4e 2d 00 41 00 42
01001110 00101101 00000000 01000001 00000000 01000010
e.UTF-8: 1-3变长编码,
英文1字节与ascII一致,
中文3个字节。
字符串”中ABC”的UTF-8编码:
e4 b8 ad 41 42 43
11100100 10111000 10101101 01000001 01000010 01000011
UTF-8中文与Unicode编码的关系:
Unicode编码(16进制) ║ UTF-8 字节流(二进制)
'\u0000' - '\u007F' ║ 0xxxxxxx
'\u0080' - '\u07FF' ║ 110xxxxx 10xxxxxx
'\u0800' - '\uFFFF' ║ 1110xxxx 10xxxxxx 10xxxxxx
xxxx为实际的Unicode编码, 其他为编码控制位
2.字符流
1)文本文件中存放了采用特定字符编码的字符。
为了读写各种字符编码的字符,
Java IO流提供了抽象类Reader/Writer,
分别表示字符输入流和字符输出流
2)Reader类:字符输入流的抽象基类,
用于读取字符数据
方法:int read():返回一个字符对应的unicode数值
int read(char[] ch)
int read(char[] ch,int off,int len)
long skip(long n):跳过指定数目的字符
void close()
使用Reader的标准步骤:
打开流->循环读取字符数据->关闭流
Reader类的常用子类:FileReader、
BufferedReader、
InputStreamReader
a.FileReader类:文件字符输入流,
用于从文件读取字符
方法:FileReader(String name)
FileReader(File file)
课堂练习:通过FileReader读取文本文件中的内容
b.BufferedReader类:缓冲字符输入流,
将数据先读入缓冲区中,从而提高读取效率
方法:BufferedReader(Reader in)
//size指定缓冲区的大小,默认大小是8096
BufferedReader(Reader in,int size)
String readLine()
c.InputStreamReader类:
用于将InputStream转换成Reader
------------------------
FileReader=InputStreamReader
+FileInputStream
------------------------
构造方法:InputStreamReader(InputStream in)
//charset指定文件的字符编码
//默认字符编码:GBK(windows)
UTF-8(unix/linux)
InputStreamReader(InoutStream in,
String charset)
课堂练习:通过System.in读取标准输入流的数据
3)Writer类:字符输出流的抽象基类,
用于写入字符数据
方法: void write(int c) //写入1个字符
//将char[]中的内容全部写入流中
void write(char[] ch)
//将char[]中的部分内容写入流中
//off指定数组的起始位置,len指定写入的字符数
void write(char[] ch,int off,int len)
void write(String str)
Writer append(char c)
Writer append(CharSequence c)
使用Writer的标准步骤:
打开流->循环写入字符数据->关闭流
Writer类的常用子类:FileWriter、
BufferedWriter、
PrintWriter、
OutputStreamWriter
a.FileWriter类:文件字符输出流,
用于向文件中写入字符
方法:FileWriter(String filename[,boolean append])
FileWriter(File file[,boolean append])
b.BufferedWriter类:缓冲字符输出流,
数据先写入缓冲区,从而提高写入的效率
方法:BufferedWriter(Writer out)
BufferedWriter(Writer out,int size)
c.PrintWriter类:向流中写入格式化的数据
方法:PrintWriter(Writer out[,boolean autoFlush])
//参数autoFlush:true表示自动刷新数据,将数据立即写入到数据源中
false表示不自动刷新,默认值是false
void print(int|long|float|double|char|boolean|string)
void println(int|long|float|double|char|boolean|string)
//println会自动换行
d.OutputStreamWriter类:将OutputStream转换成Writer
---------------------------
FileWriter=OutputStreamWriter
+FileOutputStream
---------------------------
构造方法:
OutputStreamWriter(OutputStream out[,String charset])
作业:
1 复习实现全部课堂代码
2 接收键盘输入的数据,将其写入到文本文件data.txt中。在输入exit结束输入,退出程序。
3.通过FileReader读取并显示作业2生成的文本文件data.txt的内容。
4.完成贪吃蛇完整版的代码。
2011/08/05
====================================================
1.字符编码
1)Java字符在内存中是char类型数据,
是一个16位无符号整数,
数值是字符对应的Unicode编码。
字符串就是字符的集合, 是char数组
2)将字符串转换为byte时候就需要按照一定规则
编码处理
如: ‘中’内存中是char
数值是Unicode '\u4e2d'
按照UTF-16BE标准编码为[0x4e, 0x2d]
3)字符编码有:ISO8859-1、GBK、GB2312、UTF-16BE、UTF-8
a.ISO8859-1:西文编码,即ASCII
b.GB2312: 是早期中文编码标准, 能够表示6000多汉字.
c.GBK: 20000+ 汉字, 是GB2312的超集,
1-2变长编码, 英文1字节与ASCII一致,
中文2个字节。
字符串”中ABC”的GBK编码:
byte: d6 d0 41 42 43
11010110 11010000 01000001 01000010 01000011
d.UTF-16BE: 2字节定长编码,
中英文都采用固定16位长度表示。
字符串”中AB”的UTF-16BE编码:
4e 2d 00 41 00 42
01001110 00101101 00000000 01000001 00000000 01000010
e.UTF-8: 1-3变长编码,
英文1字节与ascII一致,
中文3个字节。
字符串”中ABC”的UTF-8编码:
e4 b8 ad 41 42 43
11100100 10111000 10101101 01000001 01000010 01000011
UTF-8中文与Unicode编码的关系:
Unicode编码(16进制) ║ UTF-8 字节流(二进制)
'\u0000' - '\u007F' ║ 0xxxxxxx
'\u0080' - '\u07FF' ║ 110xxxxx 10xxxxxx
'\u0800' - '\uFFFF' ║ 1110xxxx 10xxxxxx 10xxxxxx
xxxx为实际的Unicode编码, 其他为编码控制位
2.字符流
1)文本文件中存放了采用特定字符编码的字符。
为了读写各种字符编码的字符,
Java IO流提供了抽象类Reader/Writer,
分别表示字符输入流和字符输出流
2)Reader类:字符输入流的抽象基类,
用于读取字符数据
方法:int read():返回一个字符对应的unicode数值
int read(char[] ch)
int read(char[] ch,int off,int len)
long skip(long n):跳过指定数目的字符
void close()
使用Reader的标准步骤:
打开流->循环读取字符数据->关闭流
Reader类的常用子类:FileReader、
BufferedReader、
InputStreamReader
a.FileReader类:文件字符输入流,
用于从文件读取字符
方法:FileReader(String name)
FileReader(File file)
课堂练习:通过FileReader读取文本文件中的内容
b.BufferedReader类:缓冲字符输入流,
将数据先读入缓冲区中,从而提高读取效率
方法:BufferedReader(Reader in)
//size指定缓冲区的大小,默认大小是8096
BufferedReader(Reader in,int size)
String readLine()
c.InputStreamReader类:
用于将InputStream转换成Reader
------------------------
FileReader=InputStreamReader
+FileInputStream
------------------------
构造方法:InputStreamReader(InputStream in)
//charset指定文件的字符编码
//默认字符编码:GBK(windows)
UTF-8(unix/linux)
InputStreamReader(InoutStream in,
String charset)
课堂练习:通过System.in读取标准输入流的数据
3)Writer类:字符输出流的抽象基类,
用于写入字符数据
方法: void write(int c) //写入1个字符
//将char[]中的内容全部写入流中
void write(char[] ch)
//将char[]中的部分内容写入流中
//off指定数组的起始位置,len指定写入的字符数
void write(char[] ch,int off,int len)
void write(String str)
Writer append(char c)
Writer append(CharSequence c)
使用Writer的标准步骤:
打开流->循环写入字符数据->关闭流
Writer类的常用子类:FileWriter、
BufferedWriter、
PrintWriter、
OutputStreamWriter
a.FileWriter类:文件字符输出流,
用于向文件中写入字符
方法:FileWriter(String filename[,boolean append])
FileWriter(File file[,boolean append])
b.BufferedWriter类:缓冲字符输出流,
数据先写入缓冲区,从而提高写入的效率
方法:BufferedWriter(Writer out)
BufferedWriter(Writer out,int size)
c.PrintWriter类:向流中写入格式化的数据
方法:PrintWriter(Writer out[,boolean autoFlush])
//参数autoFlush:true表示自动刷新数据,将数据立即写入到数据源中
false表示不自动刷新,默认值是false
void print(int|long|float|double|char|boolean|string)
void println(int|long|float|double|char|boolean|string)
//println会自动换行
d.OutputStreamWriter类:将OutputStream转换成Writer
---------------------------
FileWriter=OutputStreamWriter
+FileOutputStream
---------------------------
构造方法:
OutputStreamWriter(OutputStream out[,String charset])
作业:
1 复习实现全部课堂代码
2 接收键盘输入的数据,将其写入到文本文件data.txt中。在输入exit结束输入,退出程序。
3.通过FileReader读取并显示作业2生成的文本文件data.txt的内容。
4.完成贪吃蛇完整版的代码。