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