Java I/O输入输出流
io流的复习总结
------注:蓝色背景段落是例子;红色背景的字段io流的功能类。
编码问题
string s = "威力锅abc";
//utf-8编码中文占用三个字节,英文占用一个字节
byte [] bytes = s.getbytes();//转换成字节序列用的是项目默认的编码(utf-8)
for(byte b:bytes) {
//tohexstring 把字节(转换成了int)以16进制的方式显示。
system.out.print(integer.tohexstring(b & 0xff) + " ");
}
system.out.println();
//gbk编码中文占用两个字节,英文占用一个字节
byte [] bytes1 = s.getbytes("gbk");//指定字节(gbk)
for (byte b : bytes1) {
system.out.print(integer.tohexstring(b & 0xff) + " ");
}
system.out.println();
//java是双字节编码utf-16be:中文和英文都要占两个字节
byte[] bytes2 = s.getbytes("utf-16be");
for (byte b : bytes2) {
system.out.print(integer.tohexstring(b & 0xff) + " ");
}
system.out.println();
/*当你的字节序列是某种编码时,这个时候把字节变成
* 字符串,也需要用这种编码方式,否则会出现乱码
* */
string str = new string(bytes2);
system.out.println(str);
string str0 = new string(bytes2,"utf-16be");
system.out.println(str0);
/*
* 文本文件就是字节序列
* 可以是任意编码的字节序列
* 如果我们在中文机上直接创建文本文件,那么该文本文件只认识ansi编码
* 联通、联这是一种巧合,他们正好符合了utf-8编码的规则
* */
file类的使用
java.io.file类用于表示文件/目录
file类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问
我不知道的:file file = new file("e:/resouce\\file\\text.txt");//双斜杠“\\”和反斜杠“/”是可以同等替代的
file.mkdir();//创建目录、file.createnewfile();创建新的文件;
randomaccessfile的使用
randomaccessfile java提供的对文件内容的访问,既可以读文件,也可以写文件。
randomaccessfile 支持随机访问文件,可以访问文件的任意位置。
(1)java文件模型
在硬件上的文件是byte byte byte存储的,是数据的集合
(2)打开文件
有两种模式"rw"(读写)"r"(只读)
randomaccessfile raf = new randomaccessfile(file,"rw/r");
因为支持随机访问文件,所以有文件指针,打开文件时指针在开头 pointer = 0;
(3)写方法
raf.write(int);--->只写一个字节(后8位),同时指针指向下一位,准备再次写入
(4)读方法
int b = raf.read();--->读一个字节
(5)文件写完后一定要关闭(oracle 官方说明)
字节流的使用
(1)inputstream、outputstream
inputstream抽象了应用程序读取数据的方式
outputstream抽象了应用程序写出数据的方式
(2)eof = end 读到-1就读到结尾
(3)输入流基本方法
int b = in.read();读取一个字节无符号填到int低八位。-1是eof
in.read(byte[]buf)读取数据填充到字节数组buf
in.read(byte[]buf,int start,int size)读取数据填充到字节数组buf,从buf的start位置开始,存放size长度的数据
(4)输出流基本方法
out.write(int b);写出一个bute到流,b的低八位
out.write(byte [] buf);将buf字节数组都写入到流
out.write(byte [] buf,int start,int size);
(5)fileinputstream---->具体实现了在文件上读取数据
(6)fileoutputstream实现了向文件中写出byte数据的方法
(7)dataoutputstream/datainputstream
对“流”功能的扩展,可以更加方面的读取int,long,字符等类型数据
dateoutputstream
writeint()/writedouble()/writeutf()
(8)bufferedinputstream & buferedoutputstream
这两个流类为io提供了带缓冲区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种流模式提高了io的性能
从应用程序中把数据放入文件,相当于将一缸水导入到另一个缸中:
fileoutputstream--->write()方法相当于将水一滴一滴地转移过去
dataoutputstream--->writexxx()方法会方便一些,相当于把水一瓢一瓢地转移过去
buferedoutputstream--->write方法更方便,相当于把水先一瓢一瓢地放入桶中,然后从桶中放入到另一个缸中
long start = system.currenttimemillis();//获取当前时间点(毫秒)
字符流的使用
(1)编码问题
(2)认识文本和文本文件
java的文本(char)是16位无符号整数,是字符unicode编码(双字节编码)
文件时byte byte byte ...的数据序列
文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果
(3)字符流(reader writer)--->注:字符流操作的是文本文件(因为mp3、二进制文件都是字节序列)
字符的处理,一次处理一个字符
字符的底层任然是基本的字节序列
字符流的基本实现
inputstreamreader 完成byte流解析为char流,按照编码解析
outputstreamwriter 提供char流到byte流,按照编码处理
filereader/filewriter
filereader fr = new filereader("e:/resouce/demo/filewriter.txt");
filewriter fw = new filewriter("e:/resouce/demo/filewriter.txt",true);
//多加了一个参数“true”后,复制的文件内容会追加到目标文件内容后边
字符流的过滤器
bufferedreader--->readline一次读一行
bufferedwriter/printwriter--->写一行
对象的序列化和反序列化
(1) 对象的序列化,就是将object转换成byte序列,反之叫对象的反序列化
(2)序列化流(objectoutputstream),是过滤流----writeobject
反序列化流(objectinputstream)----readobject
(3)序列化接口(serializable)
对象必须实现序列化接口,才能进行序列化,否则将出现异常
这个接口,没有任何方法,只是一个标准
//将对象序列化到文件file中
objectoutputstream oos = new objectoutputstream(new fileoutputstream(file));
oos.writeobject(stu);
(4)transient关键字
上一篇: 销魂的白萝卜,小妞,跟爷唱歌曲儿吧
下一篇: C# skip 重试执行代码段