1.常见的字符编码
计算机中的所有信息组成都是二进制的数据,所有的能够描述出的中文文字都要经过处理的结果;
在计算机里,所有的语言文字都会使用编码来进行描述;例如:最常见的编码是ASCII
在实际开发中常用的编码:
GBK 、GB2312 中文的国际编码,其中GBK包含了简体中文和繁体中文;GB2312包含了简体中文;
ISO8859-1:是国际编码,可以描述任何的文字信息;
UNICODE:是十六进制编码;造成传输无用数据过多;
UTF编码(UTF-8):融合了ISO8859-1和UNICODE编码的特点;
在所有的开发中,使用的都是TUF-8编码;
2.产生乱码的原因
所谓乱码最本质的方式就是编码和解码的字符集不统一;
3.内存流
如果某个应用需要进行IO操作,但是不想产生文件的时候,就可以利用内存流实现输入输出的操作;
java 提供了两组操作;
字节内存流
ByteArrayInputStream
ByteArrayOutputStream
字符内存流
CharArrayReader
CharArrayWriter
ByteArrayInputStream(byte[] buf)
表示将要操作的数据设置到输入流
ByteArrayOutputStream()
从内存中输出数据;
以文件操作为例子
输出(OutputStream):程序---》OutputStream---》文件;
输入(InputStream):程序《---InputStream《--文件;
以内存操作为例子
输出(InputStream):程序--》inputStream--》内存
输入(OutputStream):程序《--OutputStream《---内存
实现一个小写字母转大写字母的操作;
为了方便的实现字母的转大写的转换(避免不必要的字符也被转换了),
可以借助Character char的包装类提供的方法
static char toLowerCase(char ch){}
static int toLowerCase(int codePoint){}
static char toUpperCase(char ch){}
static int toUpperCase(int codePoint)
会帮我们判断是字母还非字母;
String str="Hello World!!";//要求别转换的字符串
//将所有的需要读取的数据放到内存输入流之中;
InputStream bis=new ByteArrayInputStream(str.getBytes());
//为了将所有的内存流数据取出可以使用ByteArrayOutputStream
OutputStream bos=new ByteArrayOutputStream();
int len;
while((len=bis.read())!=-1) {
bos.write(Character.toUpperCase(len));//字节输出流
}
System.out.println(bos);//调用toString()
bis.close();
bos.close();
//向上转型的好处是可以得到操作模式上的统一;但是不可以忽略每个子类都有自己自己的功能;
//在ByteArrayOutputStream中的重要方法
//public byte[] toByteArray() 将所有保存在内存中的字节数据转换为字符数组
利用ByteArrayOutputStream可以实现多个文件同时读取;(实现文件的合并读取)
File f1=new File("d:"+File.separator+"testio"+File.separator+"a.txt");
File f2=new File("d:"+File.separator+"testio"+File.separator+"b.txt");
FileInputStream fis1=new FileInputStream(f1);
FileInputStream fis2=new FileInputStream(f2);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
byte [] buf=new byte[1024];
int len;
while((len=fis1.read(buf))!=-1) {
bos.write(buf, 0, len);
}
while((len=fis2.read(buf))!=-1) {
bos.write(buf, 0, len);
}
byte[] byteArray = bos.toByteArray();
fis1.close();
fis2.close();
bos.close();
System.out.println(new String(byteArray));