Java IO

Posted 微光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO相关的知识,希望对你有一定的参考价值。

编码问题

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) 输入流基本方法。

字节流的使用

 

字符流的使用

 

 

对象的序列化和反序列化

 

以上是关于Java IO的主要内容,如果未能解决你的问题,请参考以下文章

是否有如何使用 java api io.humble 对音频进行编码的示例?

Java—IO流 文件的编码

java io 读取写文件

ES256 JWT 验证 - SignatureException:签名的无效编码:java.io.IOException:序列标签错误

JAVA IO ( 编码_乱码_解码 )

Java 之 IO操作—— 文本数据的编码和解码