标签:
编码问题
gbk编码中文占2个字节,英文占一个字节。
utf-8编码中文占3个字节,英文占一个字节。
Java是双字节编码utf-16be,utf-16be中午占用2个字节,英文占用2个字节
当字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码形式,否则会出现乱码。
文本文件就是字节序列,可以是任意编码字节序列,如果在中文机器上直接创建文本文件,那么该文本文件只认识ansi编码。
在Eclipse中,Java项目创建时是什么编码,用的就是什么编码。不同编码项目之间复制文件,会出现乱码问题,但如果直接复制文字,则不会出现乱码,因为文字会被自动转码。
中文系统下,ANSI编码代表GBK编码
不同字符序列转成字符串时,要用字符序列的编码
File类的使用
java.io.File类用于表示文件(目录)
File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问。
RandomAccessFile的使用
RandomAccessFile :
java提供的对文件内容的访问 既可以读文件 也可以写文件
支持随机访问文件 可以访问文件的任意位置
(1)java文件模型 :
在硬盘上的文件是byte byte byte 存储的 是数据的集合
(2)打开文件
有两种模式 rw 读写 r只读
RandomAccessFile raf=new RandomeAccessFile(file,"rw");
文件指针,打开文件时文件在开头 pointer=0;
(3)写方法
raf.write(int) ----> 只写一个字节 (后8位) 同时指针指向下一个字节位置 准备再次写入
(4)读方法
int b=raf.read(); --->读一个字节
(5)文件读写完成后一定要关闭 (oracle官方说明)
raf.getFilePointer()获取当前指针位置
raf.length()获取文件长度
raf.seek()把指针指定到某一位置
注意write方法每次只能写入一个字节:
raf.write(‘A‘); //此时指针后移
System.out.println(raf.getFilePointer()); //此时输出为1
这时只写入了一个字节而不是完整的char,只是因为后八位刚好能够表示A
raf.write(‘B‘);
若要写入一个整数i则需要写四次
int i=0x7fffffff;
raf.write(i>>>24); //高八位
raf.write(i>>>16);
raf.write(i>>>8);
raf.write(i); //写入最低的八位
System.out.println(raf.getFilePointer());
此时打印输出6
可以直接写入一个int
raf.writeInt(i);
String s="中";
byte[] gbk=s.getBytes("gbk");
raf.write(gbk);
System.out.println(raf.length(0);
此时打印输出12(中文占俩字节)
读文件,必须把指针移到头部
raf.seek();
//一次性读取:
byte[] buf= new byte[(int)raf.length()];
raf.read(buf);
System.out.println(Arrays.toString(buf));
此时打印输出
[65,66,127,-1,-1,-1,127,-1,-1,-1,-42,-48]
开头的65,66是正确的AB,因为后八位已经能表示AB了
也可按字符串输出
String s1=new String(buf);
System.out.println(s1,"gbk");
打印输出AB?????
因为“中”的前后都有字节,只有定位到中的两个字节,才能读出他
最后要加上raf.close();
IO流(输入流、输出流)
字节流、字符流
1、字节流
1) InputStream、OutputStream
InputStream抽象了应用程序读取数据的方式
OutputStream抽象了应用程序写出数据的方式
2) EOF=End,读到负1楼就读到结尾
3) 输入流基本方法。
字节流的使用
字符流的使用
对象的序列化和反序列化
标签:
原文地址:http://www.cnblogs.com/weiguang/p/5618855.html