【Lehr】个人对Java的IO的理解
相关的其他内容
File类
Java.io.File类
不涉及到具体的文件内容 用来代表文件
只涉及到文件的基本属性 路径 名称 类型
构建对象的方法:
File d = new File("地址字符串");
(Java中路径分割最安全的方法是 File.separator 来代替\\在Windows)
常用方法
isFile() 判断是否是文件
isDirectory() 判断是不是文件夹 就是看是不是目录
getName() 得到文件的名字
getParent() 得到上一层目录
getPath() 获取文件的全路径
length() 获取文件的大小
lastModified() 获取最后的修改事件
listFiles() 返回所有子文件 返回值是个文件数组类 File[]
delete() 删除功能
exist(); 判断存在 返回布尔类
d.mkdirs(); 创建多级目录
d.createNewFile(); 创建这个文件
如何在文件不存在的情况下创建目录?
exist()
d.mkdirs()
d.createNewFile()##
这三个一起配合使用即可
编码相关
字节和字符
字符 不可以分割的 人为理解的 计算机不认识的 0 a 我 这种都是
字节 计算机只懂的0和1 二进制数字
字符利于人来阅读,但是不利于计算机阅读
编码类型
ASCII码一个字节Byte八个小比特来存储常见英文和字符最多表示256个字符,所以显然是不够的
扩展编码(加字节)
Eg:
ISO8859 ----- 西欧语言
GBK --------- (最常用的2万多个汉字)
GB18030 ---- 是GB系列表示中文编码 最全的 七万个汉字和字符
Big5 ------------ 繁体中文
即使这样了但还是不能共通,所以,有了Unicode
Unicode
全世界所有字符囊括在内的
目标是不断扩充囊括全球语言
编码方案
UTF-8: 兼容ASCII ,采用变长字符 ,1-4个字符存储字符小的字母(比如a,b,c)就1个 ;一个汉字就用2个。
UTF-16 : 2-4个变长
UTF-32: 用四个字节。反正32bits肯定够大,但是不经济。所以UTF-8还是最常用的
ANSI编码
Windows上非Unicode的默认编码
简体中文系统时是GBK,繁体中文的系统就是Big5。
记事本默认的是采用ANSI保存 所以你不同地区国家的互发文件就容易出乱码。
输入流和输出流
抽象基类流
字节流
InputStream
OutputStream
字符流
Reader
Writer
巧记:结尾的时候,字节stream,字符er
区别
操作方式基本相同 但是返回的东西不同。接下来以输入流作为例子:
int read();
取出单个字节然后以int的形式返回。由于字节只有8bit 所以就是 0-255的范围
所以你读汉字的时候必不可能用字节流。读到尾部返回-1
你输出的时候就可以这样:
int c = f.read();
System.out.println((char)c);
int read(byte[] b);
多个字节的读入方法 返回值是读了多少个
但是如果你每次读100个,最后只有40 个,那就会重复读60个,从倒数100个读
byte[] buffer = new byte[1024]
int len = System.in.read(buffer);
read读的所有IO操作都带着exception的异常处理或者抛出!
这里注意 是以字节的方式读入的所以如果用输入流的时候会把那个回车也读进来 length就会比实际的多一个
int read(byte[] int off, int len);
选择位置
skip(long n);
跳过多少个
int available();
告诉你流里面还有多少东西可以读
mark();
读到哪里打个标记
reset();
回到上次那个mark那里 mark只打一次才有效
close();
千万要关闭!!!!不然两行泪!!!
Reader
基本一样 但是区别在取水滴一堆水滴和取一小口水和一堆小口水的意思。
(或者说,次饭,之前一粒米一粒米或者一堆米一堆米,现在直接拿个碗,一碗一碗的就方便多了)
int read();
但是字符流的返回值就可以很大很大了
Java里一个int 2个字节 范围就很大了 在0到六万多来着
其他操作基本一样
输出流
OutputWriter / Writer
op.write(byte b)
把这个字节写道里面去
write(byte[] b)
write(byte[] b, int start , int len)
一样的
但是对于Writer类。由于是字符,所以可以String形式。
像write(String s)这样来。
但是 抽象基类本身是不能创建对象的 所以 需要进行包装设计
实体类
节点类
直接对文件进行读写
FileOutputStream out = new FileOutputStream("文件地址或者File对象");
out.write(buf) //buf 是个byte[] 意思就是一次写入这么多个字节
out.close(); //关了
A文件-------------B文件
中间这个------是连接通道
包装类
转化类
字节字符类型的转化 ,比如编码“UTF-8”
转化类InputStreamReader
文件读取时,字节转化为Java能理解的字符
OutputStreamWriter
Java将字符类转化字节输入到文本中
例如:
fis = new FileInputStream("c:/temp/abc.txt");
isr = new InputStreamReader(fis,"UTF-8");
A(Java)=======----B(目标文件)
–是指普通的编码方式
==是指变成了UTF-8
所以从B到A之后就成了Java可以理解的UTF-8了
装饰类
在已有的流的基础上进行过滤包装
提供一个更为强大的读写功能
例如:
DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(file)));
DataInputStream和DataOutputStream 用于封装数据流
可以直接输出输出一个Int 4个字节 一个double 把自动转化成八个字节
这样你out这个东西就直接有了out.writeInt(i)这种方法直接里面放基本类型而不是byte了
又例如:
fis = new FileInputStream("c:/temp/abc.txt");
isr = new InputStreamReader(fis,"UTF-8");
br = new BufferedReader(isr);
BufferedInputStream BufferOutputStream 缓存字节流
是说希望能在内存里开一个缓存区 这样读写能更快一些
BufferedReader, BufferedWriter缓存字符流
有了Buffer以后就可以有in.readLine这种的用法
而且这里的read()方法都是以字符串读入 默认的分割符是空格