JAVA IO流的老师小结

Input / Output:指跨越出JVM的边界,与外界数据的源头或者目标数据源进行数据交换.
 
                    输出  Output
      ------------------------------->
JVM                                           数据源
      <-------------------------------
                    输入   Input

注意:输入/输出是针对JVM 而言。

File 类
可表示一个文件,也有可能是一个目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显,可以调用isDirectory()和isFile()来判断)。

File file = new File("c:\\abc.txt");

常用的方法:
	exists()		用来判断 文件或目录是否在硬盘存在。
	isDirectory()		判断是否是目录
	isFile()			判断是否是文件
	mkdir()			创建目录
	mkdirs()		创建目录包括它下面的子目录。
	getAbsolutePath()	得到文件绝对路径
	list()			得到文件名的String数组 (得到当前目录下的文件名,目录名)
	listFiles()		返回File类型数组,(目录,文件的File对象)可用getName()得到文件名。
	delete()		删除文件
	getName()		得到文件名
	getPath()		得到文件相对路径
	separtor()		得到文件分隔符 //这个方法有更好的通用性,平台不同结果不同
	deleteOnExit()	在进程退出的时候删除文件,常用在临时文件的删除。


1、流的概念:
	       输出流
	程序----------->文件、网络
	程序<-----------数据来源	
		输入流
2、流的分类:
	按处理方式来分:
		字节流:按8位传输 InputStream OutputStream
		字符流:按16位传输 Reader  Writer
	按功能来分:
		节点流:与文件、网络打交道的流,操作数据的来源
		处理流(包装流):操作节点流
	如何区分:		
		输入流:以InputStream、Reader结尾的流
				FileInputStream	BufferedReader
		输出流:以OutputStream、Writer结尾的流
				FileOutputStream	PrintWriter

		字节流:以InputStream、OutputStream结尾的流
		字符流:以Reader、Writer结尾的流

		节点流:看构造器,参数为数据来源,参数是String或File之类的
				new FileInputStream("d:\\abc.txt");
				new FileOutputStream(new File("d:\\abc.txt"))
		处理流:构造器的参数为其它流
				new BufferedReader(new InputStreamReader(new FileInputStream("d:\\abc.txt")));
				PrintWriter
	选择流时:
		首先确定是输入还是输出。
		其次确定是字节流还是字符流。
		然后确定是节点流还是处理流。

	根据数据类型选择输入/输出流:
		①byte、byte[]	InputStream / OutputStream
		②int、byte、char、double、String	DataInputStream / DataOutputStream
		③char、String	Reader / Writer
		④Object		ObjectInputStream / ObjectOutputStream
		若考虑性能会在前试着加Buffered

3、常用流:
	DataInputStream&DataOutputStream 用于读写基本类型数据,如int、float、long、double和boolean等。
	此外,DataInputStream的readUTF()方法还能读取采用UTF-8字符编码的字符串。
	
	BufferedInputStream&BufferedOutputStream
	因为利用了缓冲区,所以常用于提高读写数据的效率。
	BufferedInputStream先把一批数据读入到缓冲区,接下来read方法只需要从缓冲区内获得数据,减少了物理性读取数据的次数。
	可以使用BufferedInputStream(InputStream in, int size) 中的size来指定缓冲区的大小

	ObjectOutputStream&ObjectInputStream
	对象的序列化是指把对象写到一个输出流中,
	对象的反序列化是指从一个输入流中读取一个对象。
	Java语言要求只有实现了java.io.Serializable接口的类的对象才能序列化和反序列化

	Reader/Writer
	当需要程序读写文本文件,而且文本文件采用特定的字符编码集时,应采用Reader/Writer。

	InputStreamReader & OutputStreamWriter 桥梁流
	把字节流转换成字符流
	在桥转换的时候可以指定编解码方式
	new BufferedReader(new InputStreamReader(new FileInputStream("d:\\abc.txt"), "utf8"));
	BufferedReader
	readLine()方法可以一次读入一行字符,以字符串形式返回。

	PrintWriter 输出格式化的数据,所有的写数据的方法以print开头。
	print (int i)
	print (long l)
	print (float f)
	print (String s)
	
	每个print() 方法都有一个println()方法对应
	
	a.
	printWriter.println("Hello");
	b.
	printWriter.print("Hello");
	printWriter.println();
	c.
	printWriter.print("Hello\n");
	以上三段代码是等价的

4、JAVA编码问题:UTF-8,GBK,GB2312是可以显示中文的。
	ASCII			一个字符-----1B	任何一种编码均兼容	A<-->65
	ISO8859-1 (西欧)	一个字符-----1B
	GB2312 / GBK	一个字符-----2B
	Unicode		一个字符-----2B	会增加网络负担  Java中的char是Unicode
	UTF-8		变长字节(变长的Unicode方式)
			英文-----1B
			中文-----3B

	提供编码帮助的类:java.nio.charset.Charset
	GBK---中、日、韩,gb2312是GBK的子集

	会出现中文编码问题的情况:
		1、用流操作文件时
		2、网页(动态、静态)
		3、网络传递信息时

	String--->乱码(再次转码)
	String temp=p.getProperty("name");
	temp=new String(temp.getBytes("ISO8859-1"),"GBK");这两处的编码有时需要互换位置

对象序列化
	1:定义:把对象作为一个整体,在I/O流中传播
	2:语法:
	(1)实现了Serializeble接口的对象才能可序列化。这个接口里没有任何方法,没有方法的接口称为标记接口。
	例如:class Student implements Serializeble{} 
	(2)如果一个序列化后的对象里面有一个属性是个对象属性,那么这个对象属性也需要实现序列化。
	例如:class Student implements Serializeble{
	     Teacher t;//必须序列化
		}
		class Teacher implements Serializeble{}
	(3)包名、类名、属性可以被序列化
	方法、构造器不会序列化
	所有的静态属性都不会被序列化
	用transient关键字修饰的属性是临时属性,临时属性不参与序列化。 
        (4)当父类实现Serializeble接口,子类自动实现。对象序列化会创建对象,不调用构造,但子类实现Serializeble接口,
	父类没有实现实现Serializeble接口,父类在反序列化时会调用构造。

	3:使用注意:
	a.用readObject读文件的时候,当文件结束的时候会抛出EOFException,当我们捕获这个异常的时候,程序就结束了。
	Object o = null;
	while((o =ois.readObject()) != null) {
	
	}
	b.如果需要向一个文件中追加对象,首先要把文件中原有的对象读出来,再把原有对象和新追加的对象一起写入到文件。
	
	c. serialVersionUID是静态常量,表示当前对象的版本号,在接受传输的数据时会自动检查该值,保证版本的相同。

java.util.Properties属性类,针对属性文件操作,早期使用。
	好处是可以在不修改代码的情况下改变相应的需求。
	文件名以.properties结尾的文件称为属性文件
	文件的内容是:名字=值 的形式
	常用方法:	
		public void load(InputStream inStream)throws IOException
		public void store(OutputStream out,String comments)throws IOException
		public String getProperty(String key)
		public String getProperty(String key,String defaultValue)
		public Object setProperty(String key,String value)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值