IO辅助概念(三)

标题:字符编码

知识点:

  1. 了解常见的字符编码。
  2. 了解乱码产生原因。

具体内容(了解):

      计算机中所有的信息组成都是二进制数据,那么能够描述出的中文字都是经过处理的。在计算机里面,所有的语言文字都会使用编码来进行描述,例如:常见的编码是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

名称ByteArrayInputStreamByteArrayOutputStream
继承结构

java.lang.Object

java.lang.Object

构造方法

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类最为重要.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值