黑马程序员—IO流

------ 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值