IO流(Input Output) 18~19天..

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

黑马程序员_毕向东_Java基础视频教程第18天-06-IO流(概述)

IO流用来处理设备之间的数据传输

JAVA对数据的操作是通过流的方式

JAVA用于操作流的对象都在IO包中

流按操作数据分为两种:字节流与字符流.

流按流向分为:输入流,输出流.

字节流的抽象基类

InputStream,

OutputStream.

字符流

Reader Writer

注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀.

如:InputStream 的子类FileInputStream.

Reader的子类FileReader.

黑马程序员_毕向东_Java基础视频教程第18天-07-IO流(FileWriter)

/r/n Windows识别

/n  linux识别

黑马程序员_毕向东_Java基础视频教程第18天-07-IO流(FileWriter)

字符流和字节流

字节流的2个基类

InputStream OutStream

字符流

writer ,Reader

先学习一下字符流的特点.

既然Io流是用于操作数据的

那么数据的最常见体现形式是,文件.

那么先从操作文件为主要演示.

需求在硬盘上.创建一个文件,并写入一些文字数据.

找到一个专门用于操作文件的Writer子类对象,FileWriter,后缀名是父类名,前缀名是该流对象的功能.

import java.io.*;//倒包
class FileWriterDemo
{
	public static void main(String[] args) throws IOException
	{
		//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件.
		//而且该文件被创建到该指定目录下,如果该目录下已有同名文件,将被覆盖
		//其实该步就是要明确数据要存放的目的地.
		FileWriter fw=new FileWriter("demo.txt");
		//调用write方法,将字符串写入到流中.
		fw.write("abcd");
		//将数据刷新到目的地中.
<span style="white-space:pre">		</span>//fw.close();关闭流资源,关闭之前会刷新一次内部的缓冲数据,将数据刷到目的中,和fw.flush()的区别在于,flush()刷新后流可以继续使用,close()刷新后流会关闭.
		fw.flush();
<span style="white-space:pre">		</span>fw.close();//要记得关闭流资源.
	}
}

黑马程序员_毕向东_Java基础视频教程第18天-08-IO流(IO异常处理方式)

IO异常的处理方式

import java.io.*;//倒包
class FileWriterDemo2
{
	public static void main(String[] args)
	{	
		FileWriter fw=null;
		try
		{
			fw=new FileWriter("demo.txt");
			fw.write("abcdefg");
		}
		catch(IOException e)
		{
			System.out.println("catch:"+e.toString());
		}
		finally
		{
			try
			{
				if(fw!=null)
					fw.close();
			}
			catch(IOException e)
			{
				System.out.println(e.toString());
			}
		}
	}
}

黑马程序员_毕向东_Java基础视频教程第18天-09-IO流(文件的续写)

黑马程序员_毕向东_Java基础视频教程第18天-10-IO流(文本文件读取方式一)

黑马程序员_毕向东_Java基础视频教程第18天-11-IO流(文本文件读取方式二)

黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件)

黑马程序员_毕向东_Java基础视频教程第19天-01-IO流(BufferedWriter)

字符流的缓冲区

缓冲区的出现提高了对数据的读写效率.

对应类

BufferdWriter

BufferedReader

缓冲区要结合流才可以使用.

在流的基础上对流的功能进行了增强.

/*

缓冲区的出现是为了提高流的操作效率而出现的

所以在创建缓冲区之前,必须要先有流的对象.

该缓冲区才有newLine()

*/

import java.io.*;

class BufferedWriterDemo

{

public static void main(string[] args)

{

//创建一个字符写入流的对象

FileWriter fw=new FileWriter("buf.txt");

  //为了提高字符写入流效率,加入缓冲技术,只要将需要被提高效率的流对象作为参数

//传递给缓冲区的构造函数即可

BufferedWriter bufw=new BufferedWriter(fw);

for(int x=1;x<5;x++)

{

bufw.write("abcd"+x);

bufw.newLine();

bufw.flush();

}

//bufw.write("abcde");

//记住,只要用到缓冲区,就要记得刷新.

//bufw.flush();

//其实关闭缓冲区,就是在关闭缓冲区中的流对象.

                bufw.close();

}

}


黑马程序员_毕向东_Java基础视频教程第19天-03-IO流(通过缓冲区复制文本文件)

黑马程序员_毕向东_Java基础视频教程第19天-04-IO流(readLine的原理图例)

readLine方法的原理

无论是读一行,获取读取多个字符,其实最终都是在硬盘上一个一个读取,所以最终使用的还是read方法一次读一个的方法.

黑马程序员_毕向东_Java基础视频教程第19天-05-IO流(MyBufferedReader)

黑马程序员_毕向东_Java基础视频教程第19天-06-IO流(装饰设计模式)

装饰设计模式

当想要对已有的对象进行功能增强时,

可以定义类,将已有对象传入,基于已有的功能,并提供坚强功能.

可以自定义的该类称为装饰类.

装饰设计模式,,,听完课感慨颇多,自己模仿着写写看吧.

装饰类通常会通过构造方法接收被装饰的对象.

并基于被装饰的对象的功能,提供更强的功能.

构造函数装饰,功能增强

class  SuperPerson  //装饰.
{
		private Person p;
		SuperPerson(p)
		{
			this.p=p;
		}
		public void chaoJiChiFang()
		{	
			p.chiFang();
			System.out.println("吃饭");
		}
}
class Demo
{
	Person p=new Person();
	SuperPerson pp=new SuperPerson(p);
 	pp.chaoJiChiFang();
}
黑马程序员_毕向东_Java基础视频教程第19天-07-IO流(装饰和继承的区别)


装饰和继承的区别.


MyReader  //专门用于读取数据的类.

|--MyTextReader

|--MyBufferedTextReader

|--MyMediaReader

|--MyBufferedMediaReader

|--MyDataReader

|--MyBufferedDataReader

找到其参数的共同类型通过多态的形式,可以提高扩展性.

class MyBufferReader extends Myreader
{
<span style="white-space:pre">	</span>private Myreader b.
	MyBuffereReader(Myreader b)
	{ 
		this.b=b;
	}
}

MyReader  //专门用于读取数据的类.

|--MyTextReader

|--MyMediaReader

|--MyDataReader

|--MyBufferedTextReader

优化后产生了体系.从继承结构变成了组合结构.


装饰模式比继承要灵活,避免了继承体系臃肿.

而且降低了类于类之间的关系

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能.

所以装饰类和被装饰类通常都属于一个体系中,同属于同一个父类,或者同一个接口.


继承要写,但是不要写的非常臃肿.

黑马程序员_毕向东_Java基础视频教程第19天-08-IO流(自定义装饰类)

黑马程序员_毕向东_Java基础视频教程第19天-09-IO流(LineNumberReader)

黑马程序员_毕向东_Java基础视频教程第19天-10-IO流(MyineNumberReader)

黑马程序员_毕向东_Java基础视频教程第19天-11-IO流(字节流File读写操作)

字符流

FileReader

FileWriter

BufferedReader

BufferedWriter

字节流

FileInputStream

FileOutputStream

BufferedInputStream

BufferedOutputStream

字节数组.

黑马程序员_毕向东_Java基础视频教程第19天-14-IO流(自定义字节流的缓冲区-read和write的特点)

黑马程序员_毕向东_Java基础视频教程第19天-15-IO流(读取键盘录入)


读取键盘录入

System.out  对应的标准输出设备,

System.in 对应的标准输入设备


黑马程序员_毕向东_Java基础视频教程第19天-16-IO流(读取转换流)

通过刚才的键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理.

也就是readLine方法.

能不能直接使用readLine方法来完成键盘录入的一样数据的读取呢?

readLine方法是字符流BufferedReader类中的方法.

而键盘录入的read方法是字节流InputStream方法.

那么能不能将字节流转成字符流,再使用字符流缓冲区的readLine方法呢?

黑马程序员_毕向东_Java基础视频教程第19天-17-IO流(写入转换流)

键盘录入最常见写法

BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

黑马程序员_毕向东_Java基础视频教程第19天-18-IO流(流操作规律-1)

1

源:键盘录入.

目的:控制台.

2需求:想把键盘录入的数据存储到一个文件中.

源:键盘.

目的:文件.

3.需要:想要将一个文件的数据打印到控制台上.

源:文件.

目的:控制台.

 

流操作的基本规律:

最痛苦的就是流对象有很对,不知道该用哪一个.

 

通过三个明确来完成.

1,明确源和目的.

源:输入流. InputStream Reader

目的:输出流 OutputStream Writer.

2,明确操作的数据是否是纯文本.

是,字符流.

不是,字节流

3当体系明确后,在明确要使用那个具体对象.

通过设备来进行区分.

源设备:内存,硬盘,键盘

目的设备:内存.键盘,控制台

 

1,将一个文件中的数据存储到另一个文件中,复制文件.

源:因为是源,所以使用读取流,InputStream  Reader

是不是操作文本文件.

是!  这时就可以选择Reader

这样体系就明确了.

接下来明确要使用该体系中的哪个对象.

明确设备:硬盘上的一个文件.

Reader体系中可以操作文件的对象是FileReader

是否需要提高效率,:是!加入Reader体系中缓冲区,BufferedReader.

FileReader fr=new FileReader("a.txt");

BufferedReader bufr=new BufferedReader(fr);

目的:OutputStream Writer

是否是纯文本.

是!Writer

设备:硬盘,一个文件.

Writer体系中可以操作文件的对象FileWriter

是否需要提高效率,:是!加入Reader体系中缓冲区,BufferedWriter

FileWriter fw=new FileWriter("b.txt");

BufferedWriter bufw=new BufferedWriter(fw);

 

练习:将一个图片文件中数据存储到另一个文件中,复制文件,

要按照以上格式自己完成3个明确.

 

黑马程序员_毕向东_Java基础视频教程第19天-19-IO流(流操作规律-2)

2.需求:将键盘录入的数据保存到一个文件中.

这个需求中有源和目的都存在.

那么分别分析.

源:InputStream Reader

是不是纯文本?   是 Reader

设备:键盘.对应的对象是System.in.

不是选择Reader吗?System.in对应的不是字节流吗?

为了操作键盘的文本数据方便.转成字符流,按照字符串操作是最方便的.

所以既然明确了Reader那么就将System.in转成Reader.

用了Reader体系中的转换流,InputStreamReader.

 

InputStreamReader isr=new InputStreamReader(System.in);

需要提高效率吗?需要  BufferedReader

BufferedReader bufr=new BufferedReader(isr);

 

 

目的:OutputStream Writer

是否是纯文本,是,Writer.

设备:硬盘一个文件.使用FileWriter.

FileWriter fw=new FileWriter("c.txt");

需要提高效率吗?需要

BufferedWriter bufw=new BufferedWriter(fw);

*****************************************************

扩展一下.想要把录入的数据,按照指定的编码表(utf-8),将数据存到文件中.

GBK  utf-8

识别中文的2个码表

目的:OutputStream Writer

是否是纯文本,是,Writer.

设备:硬盘一个文件.使用FileWriter.

FileWriter是使用默认的编码表 GBK

存储时,需要加入指定的编码表(utf-8),而指定的编码表只有转换流可以指定.

所以要使用的对象是OutputStreamWriter.

而转换流的对象要接收一个字节输出流,而且还可以操作的文件的字节输出流.

 

OutputStreamWriter osw= new OutputStreamWriter(new FileOutputStream("d.txt","UTF-8");

需要高效吗?需要

BufferedWriter bufw=ne w BufferedWriter(osw);

所以,记住,转换流什么时候使用,字符和字节之间的桥梁,通常,涉及到字符编码转换时.

需要用到转换流.

练习:将一个文本数据打印在控制太上.

黑马程序员_毕向东_Java基础视频教程第19天-20-IO流(改变标准输入输出设备)

略'

黑马程序员_毕向东_Java基础视频教程第19天-21-IO流(异常的日志信息)

import java.io.*;
class ExceptionInfo{
	public static void main(String[] args)throws IOException{
		try{
			int[] arr=new int[2];
			System.out.println(arr[3]);
		}catch(Exception e){
			System.setOut(new PrintStream("exeception.log"));
			e.printStackTrace(System.out);
		}
	}
}


//log4j

黑马程序员_毕向东_Java基础视频教程第19天-22-IO流(系统信息)

import java.util.*;
import java.io.*;
class SystemInfo{
	public static void main(String[] args)throws IOException{
		Properties prop=System.getProperties();
		//System.out.println(prop);
		prop.list(new PrintStream("sysinfo.txt"));
	}
}
		

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值