黑马程序员-----java基础IO流<三>

                         ------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);

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值