------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
IO流的常用类
操作对象的流特点:
把对象中的信息存储到文件当中,需要的时候再从文件中读取
ObjectInputStream 对象输入流
ObjectOutputStream 对象输出流
/*
把Person对象储存到person.obj文件中,再通过读取该文件person.obj得到该对象
*/
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Test {
public static void main(String[] args) throws Exception {
// writeObj();
readObj();
}
//读取对象
public static void readObj() throws Exception {
//读取流对象
ObjectInputStream ois =
new ObjectInputStream(new FileInputStream("person.obj"));
//读取的是Person的对象(会抛出ClassNotFoundException)
Person p = (Person)ois.readObject();
System.out.println(p);
ois.close();
}
//存储对象
public static void writeObj() throws IOException {
//写入流对象
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("person.obj"));
oos.writeObject(new Person("zhansan", 20));
oos.close();
}
}
class Person implements Serializable {
/**
* 这是一个标识Person类的一个ID号,要想对对象进行存储,就需要实现Serializable接口,给该对象一个标识
*/
private static final long serialVersionUID = 1L;
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
管道流的使用:
PipedInputStream //管道输入流
PipedOutputStream //管道输出流
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
class Read implements Runnable {
//管道输入流
private PipedInputStream in;
Read(PipedInputStream in) {
this.in = in;
}
public void run() {
try {
byte[] buf = new byte[1024];
System.out.println("读取前。。没有数据阻塞");
/*
* 管道输入流进行读取时,如果有数据就进行读取; 如果没事有数据,就阻塞在那里,等到有数据为止
*/
int len = in.read(buf);
System.out.println("读到数据。。阻塞结束");
String s = new String(buf, 0, len);
System.out.println(s);
in.close();
} catch (IOException e) {
throw new RuntimeException("管道读取流失败");
}
}
}
class Write implements Runnable {
//管道输出流
private PipedOutputStream out;
Write(PipedOutputStream out) {
this.out = out;
}
public void run() {
try {
System.out.println("开始写入数据,等待6秒后。");
Thread.sleep(6000);
out.write("piped lai la".getBytes());
out.close();
} catch (Exception e) {
throw new RuntimeException("管道输出流失败");
}
}
}
class Test {
public static void main(String[] args) throws IOException {
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out);//两个管道相连接
Read r = new Read(in);
Write w = new Write(out);
new Thread(r).start();
new Thread(w).start();
}
}
RandomAccessFile 对随机访问文件的读取和写入
该类不是算是IO体系中子类。
而是直接继承自Object。
但是它是IO包中成员。因为它具备读和写功能。
内部封装了一个数组,而且通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针位置,
同时可以通过seek改变指针的位置。
其实完成读写的原理就是内部封装了字节输入流和输出流。
通过构造函数可以看出,该类只能操作文件。
而且操作文件还有模式:只读r,,读写rw等。
如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。
如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。
字符编码
为什么要对字符编码?
计算机中只能识别二进制数,而为了使得计算机能识别生活中的文字信息,就需要对生活中的信息进行编码,
使得计算机中能够识别.
编码表:
所有生活中的文字就与的二进制形成了对应关系,对应出一张表.该表就称为编码表.
常用的编码表有:
ASCII : 美国标准信息交换码
用一个字节的7位可以表示.
ISO8859-1: 拉丁码表.欧洲码表
用一个字节的8位表示.
GB2312: 中国的中文编码表.
GBK: 中国的文字编码升级,融合了更多的中文文字符号.
Unicode:国际标准码,融合了多种文字.
所有的文字都用两个自己表示,Java语言使用的就是Unicode编码的
UTF-8:最多用三个字节表示一个字符(常用)
编码: 字符串-->字节数组
解码: 字节数组-->字符串
例子:
import java.util.Arrays;
class Test {
public static void main(String[] args) throws Exception {
String s = "你好啊A";
byte[] b1 = s.getBytes("UTF-8");
System.out.println(Arrays.toString(b1));
String s1 = new String(b1, "UTF-8");
System.out.println("s1=" + s1);
// 对s1进行GBK编码。
byte[] b2 = s1.getBytes("GBK");
System.out.println(Arrays.toString(b2));
String s2 = new String(b2, "GBK");
System.out.println("s2=" + s2);
}
}