标题:字符编码
知识点:
- 了解常见的字符编码。
- 了解乱码产生原因。
具体内容(了解):
计算机中所有的信息组成都是二进制数据,那么能够描述出的中文字都是经过处理的。在计算机里面,所有的语言文字都会使用编码来进行描述,例如:常见的编码是ASCⅡ码。
常见编码:GBK、GB2312:中文的国标编码,其中GBK包含有简体中文与繁体两种,而GB2312只包含简体;
ISO8859-1:是国际编码,可以描述任何的文字信息;
UNICODE:是16进制编码,造成传输的无用数据过多;
UTF编码(utf-8):融合了ISO8859-1和UNICODE编码的特点;
以后开发中,基本使用UTF-8编码。所谓的乱码最本质的方式就是编码与解码的字符集不统一。
package IO辅助概念;
public class TestDemo {
public static void main(String[] args) {
System.getProperties().list(System.out);
}
}
JAVA所有环境属性:
-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=E:\IT\JAVA\jdk\jre\bin
java.vm.version=24.71-b01
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=E:\IT\JAVA\HelloWord
java.runtime.version=1.7.0_71-b14
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=E:\IT\JAVA\jdk\jre\lib\endorsed
os.arch=amd64
java.io.tmpdir=C:\Users\jsj\AppData\Local\Temp\
line.separator=
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 8.1
sun.jnu.encoding=GBK
java.library.path=E:\IT\JAVA\jdk\bin;C:\Windows\Sun\Jav...
java.specification.name=Java Platform API Specification
java.class.version=51.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=6.3
user.home=C:\Users\jsj
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=GBK
java.specification.version=1.7
user.name=jsj
java.class.path=E:\IT\JAVA\HelloWord\bin
java.vm.specification.version=1.7
sun.arch.data.model=64
java.home=E:\IT\JAVA\jdk\jre
sun.java.command=IO辅助概念.TestDemo
java.specification.vendor=Oracle Corporation
user.language=zh
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.7.0_71
java.ext.dirs=E:\IT\JAVA\jdk\jre\lib\ext;C:\Windows...
sun.boot.class.path=E:\IT\JAVA\jdk\jre\lib\resources.jar;...
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64
默认编码是GBK,那么也就是说默认输出的中文都是GBK编码标准。
代码:
package IO辅助概念;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class TestDemo {
public static void main(String[] args) throws Exception {
File file=new File("D:"+File.separator+"my.txt");
OutputStream out=new FileOutputStream(file);
out.write("中国任命万岁!".getBytes("GBK"));
out.close();
}
}
结果:
代码:乱码
package IO辅助概念;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class TestDemo {
public static void main(String[] args) throws Exception {
File file=new File("D:"+File.separator+"my.txt");
OutputStream out=new FileOutputStream(file);
out.write("中国任命万岁!".getBytes("ISO088559-1"));
out.close();
}
}
问题就是编码集不统一。
总结:以后开发使用的都是UTF-8编码。乱码的本质就是编码和解码不统一。
题目:内存流
知识点:
学习AXAJ+XML(JSON)应用的时候才会牵扯道此部分。
使用内存流实现IO操作。
具体内容:
需要进行一种输出操作,但是又不产生文件的时候,可以利用内存来实现输入与输出的操作。
针对内存流,JAVA.IO包提供两组操作:
字节内存流:ByteArrayInputStream、ByteArrayOutputStream
字符内存流:CharArrayReader、CharArrayWriter
名称 | ByteArrayInputStream | ByteArrayOutputStream |
继承结构 |
|
|
构造方法 | public ByteArrayInputStream(byte[] buf) 将要操作的数据设置到输入流 | public ByteArrayOutputStream() 从内存输出数据 |
为了说明问题,举例:
以上文件作为例:
输出(OutputStream):程序->OutputStream->文件
输入(InputStream): 程序<-InputStream<-文件
以内存操作为例:
输出(InputStream):程序->InputStream->内存
输入(OutputStream): 程序<-OutputStream<-内存
代码:实现小写字母转大些字母的操作
为了避免不必要的字符被转换,利用character
package IO辅助概念;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class TestDemo {
public static void main(String[] args) throws Exception {
String str="Hello**World!!"; //要求被转换的字符串
//本次通过内存操作流实现转换,先讲数据保存在内存流里,然后从里面取出所有数据!
//将所有要读取的数据设置到内存输入流之中,本次利用向上转型
InputStream input = new ByteArrayInputStream(str.getBytes());
//为了取出所有内容流数据,可以使用ByteArrayOutputStream
OutputStream output = new ByteArrayOutputStream();
int temp=0; //读取每一个字节数据
//经过本次循环之后,所有的数据都将保存在内存输出流对象之中
while((temp=input.read())!=-1){
output.write(Character.toUpperCase(temp)); //字节输出流
}
System.out.println(output); //调用toString()
input.close();
output.close();
}
}
重要的方法:public byte[] toByteArray()这个方法可以将保存在内存中的字节数据变为字节数组。并且可以西那是多个文件同时读取。
代码:
package IO辅助概念;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class TestDemo {
public static void main(String[] args) throws Exception {
File fileA=new File("d:"+File.separator+"infoa.txt");
File fileB=new File("d:"+File.separator+"infob.txt");
InputStream inputA=new FileInputStream(fileA);
InputStream inputB=new FileInputStream(fileB);
ByteArrayOutputStream output=new ByteArrayOutputStream();
int temp=0; //每次读取一个字节
while((temp=inputA.read())!=-1){
output.write(temp);
}
while((temp=inputB.read())!=-1){
output.write(temp);
}
//现在将所有的内容都保存在了内存输出流里面
byte data [] = output.toByteArray();
output.close();
inputA.close();
inputB.close();
System.out.println(new String(data));
}
}
对于OutputStream和InputStream又有了新的输入及输出的位置,其中以ByteArrayOutputStream类最为重要.