File 类
比较
1 2 3 4 5
| String fileName = "d:" + File.separator + "b.txt"; File f1 = new File(fileName); File f2 = new File(fileName); System.out.println(f1 == f2); // false 比较引用 System.out.println(f1.equals(f2)); // true 比较文件路径
|
字节流:InputStream、OutputStream
字符流(处理文本):Reader、Writer
节点流:可单独处理数据
处理流:依赖其他流处理数据
问题
文本文件a.txt内容如下:
读取a.txt内容时每次读取三个字符输出不正确
1 2 3 4 5
| char[] buffer = new char[3]; int len; while ((len = fileReader.read(buffer, 0, buffer.length)) > -1) { System.out.println(new String(buffer, 0, len) + ":"); }
|
转换流:转换字节流和字符流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| public static void IOStreamRW() throws IOException { String fileName = "d:" + File.separator + "a.txt"; String newFileName = "d:" + File.separator + "new.txt"; FileInputStream fis = new FileInputStream(fileName); //InputStreamReader isr = new InputStreamReader(fis); InputStreamReader isr = new InputStreamReader(fis, "GBK");//默认utf-8 windows记事本显示ANSI表示使用系统编码(我的电脑是GBK) BufferedReader br = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream(newFileName); OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8"); BufferedWriter bw = new BufferedWriter(osw);
int r; char[] chars = new char[1024];
/** * 1 */ //while ((r = isr.read(chars, 0, chars.length)) > -1) { // osw.write(chars, 0, r); //} //osw.close(); //isr.close();
/** * 2 bufferedReader、bufferedWriter */ while ((r = br.read(chars, 0, chars.length)) > -1) { bw.write(chars, 0, r); } bw.close(); br.close();
}
|
数据流:处理基本数据类型和字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public static void DataIOputStream() throws IOException { String fileName = "d:" + File.separator + "s.txt"; File file = new File(fileName); FileOutputStream fos = new FileOutputStream(file); DataOutputStream dos = new DataOutputStream(fos); dos.writeUTF("你好哈哈"); dos.writeInt(10); dos.writeBoolean(true); dos.writeDouble(1.98); dos.writeUTF("你好嘻嘻");
FileInputStream fis = new FileInputStream(file); DataInputStream dis = new DataInputStream(fis); //按顺序读取 System.out.println(dis.readUTF()); System.out.println(dis.readInt()); System.out.println(dis.readBoolean()); System.out.println(dis.readDouble()); System.out.println(dis.readUTF()); }
|
对象流做序列化反序列化
1 2 3 4 5 6 7 8 9 10 11
| public static void ObjectIOputStream() throws IOException, ClassNotFoundException { String fileName = "d:" + File.separator + "ois.txt"; ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName)); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); oos.writeObject(new Person(1, "vvf")); oos.close();
System.out.println(ois.readObject()); }
|
声明serialVersionUID 说明版本兼容性问题(默认会自动生成,修改类时会发生变化)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Person implements Serializable{ public Person() { }
private static final long serialVersionUID = 643382323274886977L;
public Person(int age, String name) { this.age = age; this.name = name; }
int age; String name;
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
//@Override //public String toString() { // return "Person{" + // "age=" + age + // ", name='" + name + '\'' + // '}'; //} }
|
transient
修饰不可序列化的属性
静态属性也不会被序列化
RandomAccessFile
分段读取文件