关闭

黑马程序员—IO流

标签: 黑马程序员io流
45人阅读 评论(0) 收藏 举报
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
第一讲 IO流概述
1、IO流,即Input、Output的简称。
2、IO的分类:
按操作数据分为:字节流和字符流。
按流向分为:输入流和输出流。
3、IO的抽象基类:
字节流的抽象基类:InputStream和OutputStream。
字符流的抽象基类:Reader和Writer。
4、由上述基类派生出来的子类名都以父类名作为子类名的后缀。例如:FileInputStream、FileReader等等。
5、IO是用来设备间操作数据的,而数据最常见的体现形式是“文件”,所以一般对文件的操作都是通过流对数据的处理完成。
6、字符流只能处理文字数据;字节流可以处理媒体数据,如图片、MP3。
7、IO的流对象和缓冲区:
缓冲区的出现时为了提高流的处理效率,所以在创建缓冲区之前,必须要先有流对象。
字符流:
流对象(FileReader、FileWriter);缓冲区(BufferedReader、BufferedWriter)。
字节流的缓冲区:
流对象(InputStream、OutputStream);缓冲区(BufferedInputStream、BufferedOutputStream)。
第二讲  IO方法
1、字符流的方法:
创建new():创建一个FileWriter对象,该对象一被初始化就要明确被操作的文件,而且该文件会被创建到指定目录下。
FileWriter fw = new FieldWriter("demo.txt"); 如果有同名的文件存在,则覆盖。
读read():一次读一个字符,自动往下读。如果读到流的末尾,返回-1.
写入write()
字符流:fw.write("String s"),将字符串写到流中。
刷新flush():将数据刷新到目的文件中。
关闭close():关闭流资源,但是在关闭之前会刷新一次内部缓冲中的数据。关闭之后不可以再入字符流。
2、字节流的方法:
基本方法和字符流的相同。and more,可以操作媒体数据。
与字符流不同点:可以不刷新;由于媒体文件以字节存储,所以字节流对象可以对媒体中的数据直接写入到文件中。
字节流的特有功能:available();返回文件中字节个数。此功能可以用于定义一个刚刚好的缓冲区而无需循环,即用此方法来指定读取方式中传入数组的长度。如: 
		int num = file.available();
		byte[] buf = new byte[fis.available()];
		fis.read(buf);
		sop(new String(buf));

此方法慎用,jvm的内存是64Mb,所以在文件比较大时如视频文件时就不要这么操作了。
3、注意:
a、java自身不能写入数据,要调用windows底层的命令实现,所以在完成操作后一定要关闭资源(close())。
b、文件的续写是通过构造函数FileWriter(String,boolean append),返回值为true or false,创建时传递true参数不覆盖并在已有文件的末尾进行续写。
c、windows系统中换行用\r\n两个转义字符表示,在linux中用\n表示。注:跨平台分隔符:newline()。在哪都是换行。
d、在创建对象时,需要制定创建文件的位置,若是不存在制定位置就会发生异常,此时就需要对异常进行处理。如:
		FileWriter fw = null;
		try
		{
				FileWriter fw = new FileWriter("demo.txt");
				fw.writer("abcdef");
				fw.close();
		}
		catch (IOException e)
		{
				sop(e.toString());
		}
		finally
		{
				try
				{
					if(fw!=null)
					fw.close();
				}
					catch (IOException e)
				{
					fop(e.toString);
				}
		}


第三讲 缓冲区
缓冲区的原理缓冲各个字符,将数据取出然后进行一次性操作,从而提供单个字符、数组和字符串的高效写入。缓冲区的出现时为了提高流的操作效率。所以在创建缓冲区之前必须要有流对象。
1、字符流的缓冲区:BufferedWriter、BufferedReader
//创建一个写入流对象
FileWriter fw = new FileWriter("buf.txt");
//将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
BufferedWriter bufw = new BufferedWriter("fw");
bufw.writer("abcd");
//注意,只要用到缓冲区,就要记得刷新。
bufw.flush();
// 现在不用关闭了,因为关闭缓冲区就是关闭流对象了。
BufferedReader同上。另外有行的读取:readline();
String s1 = bufr.readline();  //按顺序一行一行读,读到末尾时返回null。(不包含终止符和回车符)。
2、字节流的缓冲区:BufferedInputStream、BufferedOutputStream
方法同上,另外特点:
a、read()会将byte型转成int型。 write()会将int型转成byte型。即保留二进制数的后八位。
b、判断是否读到末尾是靠返回值是不是-1决定的。当byte提升为int时,高的位都要用0补,-1就会有些问题,那么现在将byte的八位数据&Oxff即可。
第四讲 流操作
1.读取键盘录入
		import java.io.*;
		class ReadIn
		{
			public static void main(String[] args)
			{
				InputStream in = System.in;
				int by = in.read();
			}
		}
原理就是读一行。
能否用ReadLine方法?
答案不能,因为readline方法是字符流BufferedReader类中的方法,而键盘录入的read方法是字节流InputStream的方法。
现在可以将字节流转成字符流在使用字符流缓冲区的readLine的方法:
//获取键盘录入对象
InputStream in= System.in;
//将字节流对象转成字符流对象,使用转换流InputStreamReader
InputStreamReader isr = new InputStreamReader(in);
//为了提高效率用缓冲区,用BufferedReader
BufferedReader bufr = new BufferedReader(isr);
2.转换流
a、字节流通向字符流的桥梁:InputStreamReader
b、字符流通向字节流的桥梁:OutputStreamWriter。注意要flush()
3、流操作基本规律:
困扰问题:流对象有很多,不知道该用哪个?
解决办法:三个明确。
a、明确源和目的
源:输入流,InputStreamReader。
目的:输出流,OutputStreamWriter。
b、操作的数据是否是纯文本
是:即字符流
否:即字节流
c、当体系明确后,再明确要使用的哪个具体的对象,通过设备来区分:
源设备:内存、硬盘、键盘。
目的设备:内存、硬盘、控制台。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:46次
    • 积分:10
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档
    阅读排行
    评论排行