第一章 文件的编码
String s = "我的博客";
byte[] bytes1 = s.getBytes();
for(byte b: bytes1) {
//把字节(转换成了int)以16进制的方式显示
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
gbk编码中文占用2个字节,英文占用1个字节。
utf-8编码中文占用3个字节,英文占用1个字节。
java是双字节编码utf-16be,中文占用2个字节,英文占用1个字节。
当你的字节序列是某种编码时,想把字节序列变成字符串,也需要用这种编码方式。
文本文件就是字节序列。如果在中文机器上直接创建文本文件,那么该文本文件只认识ansi编码。
第二章 File类的使用
2-1 File类常用API
File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问。
File file = new File(“E:\\javaio”); //分隔符使用\\或/,或File.separator
if(!file.exists())
file.makedir();//若有多级目录file.mkdirs()
else
file.delete();
file.isDirectory(); //是否是一个目录,如果不是目录或目录不存在返回false
file.isFile(); //是否是一个文件
File file2 = new File(“e:\\javaio”,”1.txt”);
if(!file2.exists())
file2.createNewFile();
else
file2.delete();
file.getAbsolutePath();
file.getName();
file.getParent();
2-2 遍历目录
//列出指定目录下(包括其子目录)的所有文件
public static void listDirectory(File dir)throws IOException {
if(!dir.exists())throw new IllegalArgumentException(“目录不存在”);
if(!dir.isDirectory())throw new IllegalArgumentException(“不是目录”);
String[]filenames = dir.list(); //返回字符串数组,不包含子目录下内容
for(Stringstring : filenames) {
System.out.println(string);
}
File[] files =dir.listFiles(); //返回的是直接子目录(文件)的抽象
//如果要遍历子目录下的内容就需要构成File对象做递归操作
}
第三章 RandomAccessFile类的使用
RandomAccessFile java提供对文件内容的访问,读、写。支持随机访问文件,可以访问文件的任意位置。
(1)在硬盘上的文件是byte存储的,是数据的集合。
(2)打开文件两种模式”rw”(读写),”r”(只读)。
RandomAccessFile raf = new RandomAccessFile(file, “rw”);
文件指针,打开文件时指针在开头pointer = 0;
(3)写方法
raf.write(int); //只写一个字节(后8位),同时指针指向下一个位置,准备再次写入。
(4)读方法
int b = raf.read(); //读一个字节
(5)文件读写完成以后一定要关闭。
raf.write(‘A’); //只写了一个字节
System.out.println(raf.getFilePointer());
String s = “中”;
byte[] gbk = s.getBytes(“gbk”);
raf.write(gbk);
//读文件,必须把指针移到头部
raf.seek(0);
//一次性读取,把文件中的内容都读到字节数组中
byte[] buf = new byte[(int)raf.length()];
System.out.println(Arrays.toString(buf));
第四章 字节流
InputStream、OutputStream抽象了应用程序读、写数据的方式。
int b = in.read(); //读取一个字节无符号填充到int低八位,-1是EOF
in.read(byte[] buf);
in.read(byte[] buf, int start, int size);
int b = in.read(byte[] buf, int start, intsize);
FileInputStream具体实现了在文件上读取数据
//如果该文件不存在,则直接创建,如果存在,删除后创建。
FileOutputSteram out = new FileOutputStream(“demo/out.dat”);
DataOutputStream /DataIutputStream
writeInt()/writeDouble/writeUTF()
BufferedOutputStream
第五章 字符流
Java的文本(char)是16位无符号整数,是字符的unicode编码。文件是byte byte…的数据序列。
文本文件是文本(char)须留按照某种编码方法序列化为byte的存储结果。
字符流(ReaderWriter),自负的处理,一次处理一个字符,自负的底层仍然是基本的字节序列。InputStreamReader完成byte流解析为char流,按照编码解析。
第六章 对象的序列化和反序列化
对象的序列化,就是将Object转换成byte序列。
序列化流(ObjectOutputStream),是过滤流-------writeObject。
序列化接口(Serializable)对象必须实现序列化接口,才能进行序列化。这个接口没有任何方法,只是一个标准。
ObjectInputStream ois = new ObjectInputStrea(newFileInputStream(fle));
Student stu = (Student)ois.readObject();
Transient修饰的元素不会进行jvm默认的序列化。
private voidreadObject(java.io.ObjectInputStream s) throws java.io.IOException,ClassNotFoundException{
s.defaultReadObject();
this.age =s.readInt();
}
一个类实现了序列化接口,那么其子类可以进行序列化。
对子类对象进行反序列化操作时,如果父类没有实现序列化接口,那么父类的构造函数会被调用。