黑马程序员——java基础---IO流(第19天)

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、字符流缓冲区BufferedWriter和BufferedReader

由于每次将字符写入到目的地中,都需要掉用底层资源,效率很低,可以将读取到的字符暂时存储在一个字符数组当中,然后再将数组中的数据一次性写入到目的地中,这样写一次只调用一次底层资源,这样就可以大大提高效率。当然缓冲区必须要结合流才能够进行使用,而且缓冲区对流的功能进行了增强。

1、字符流写出缓冲区 

字符流缓冲区常用特有方法

1.1、构造函数 :BufferedWriter(Writer out)

1.2、void  flush()     刷新缓冲区 //将缓冲区内的数据刷进目标文件。

1.3、void  close()     关闭缓冲区 //关闭缓冲区也就关闭了字符流。

1.4、void  newLine();  输入一个行分隔符;

代码示例:                          

FileWriter fw = new FileWriter("Test.txt");//创建一个字符写入流对象。

BufferedWriter a = new BufferedWriter(fw); 将需要被提高效率的流对象作为参数传递给缓冲区的构造函数

a.write("abcd"+x);写入数据abcd;

a.newLine();换行。

a.flush();只要用到缓冲区,就要记得刷新。

a.close();关闭缓冲区,就是在关闭缓冲区中的流对象。

2、 字符流读取缓冲区BufferedReader

2.1、构造函数:BufferedReader(Reader in)

2.2、特有方法:String readLine():一次读一行,方便对文本数据的获取。

             当返回null时,表示读到文件末尾。

注:readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。

代码示例

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

 //创建一个读取流对象和文件相关联。

BufferedReader b = new BufferedReader(a); //为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。

String c = null;

while((c = b.readLine())!=null)

{

System.out.print(c);

}

bufr.close();          

2.3、BufferedReader的子类LineNumberReader行号类

跟踪行号的缓冲字符输入流(默认情况下)

方法:   setLineNumberReader() 设置行号

getLineNumberReader() 获取行号(默认时,行号从零开始)

代码示例:


3、 装饰设计模式(装饰类)

当想要对已有的对象进行功能增强时,可以定义装饰类,装饰类通过构造方法接收已有对象,并基于被装饰的对象的功能,提供更强的功能。

装饰和继承的区别

装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。

二、字节流读写操作

字节流是专门用于操作字节的流对象。使用的对象:  FileOutputStream()和FileInputStream()

1、写出流FileOutputStream()

字节流直接操作字节不需要进行刷新操作,直接关闭即可

代码示例:

FileOutputStreama = new FileOutputStream("fos.txt");

a.write("abcde".getBytes());//将字符串转换成字节流并且写入

a.close();

2、读取流FileInputStream()

两种读取数据的方法(与字符流相同);

特有的读取数据的方法:int available() 返回字符的个数(包括回车);

(但是当文件过大时不适合使用available()定义数组,还是推荐方法二,将数组的大小定义成1024的整数倍)

代码示例:

FileInputStream a =  new  FileInputStream("Text.txt");

方法一:

 while((intch=a.read())!=-1)

 {

System.out.println((char)ch);//将字节强制转换成字符并打印

 }

Fis.close();     //关闭流

方法二:

byte[]buf = new byte[1024];

int len = 0;

while((len=a.read(buf))!=-1)

{

System.out.println(newString(buf,0,len));

}

a.close();

方法三:

int num = a.available();

byte[] buf = new byte[a.available()];

//定义一个刚刚好的缓冲区。不用再循环了。

a.read(buf);

System.out.println(new String(buf));

a.close(); 

3、字节流缓冲区

由于每次将字节写入到目的地中,都需要掉用底层资源,效率很低,可以将读取到的字节暂时存储在一个字节数组当中,然后再将数组中的数据一次性写入到目的地中,这样写一次只调用一次底层资源,大大提高了效率。当然缓冲区必须要结合流才能够进行使用,而且缓冲区对流的功能进行了增强。

写出流缓冲区对象:BufferedOutputStream();

读入流缓冲区对象:BufferedInputStream()。

字节流小练习:复制mps文件

代码示例:



4、字节流read()方法和write()方法的特点

字节流的read()方法返回值是int 类型,而write()方法写入的是byte类型。

字节读一个字节的read方法的返回值类型不是byte,而是int。因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.那么就会发生数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。所以,为了避免这种情况我们将读到的字节进行int类型的提升。并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。而在写入数据时,只写该int类型数据的最低8位将多余的数据强制剔除。

5、 System类中的和流对象有关的方法

System类中方法:static PrintStream  out“标准”输出流

                                 static  InputStream  in “标准”输入流

System.out:对应的是标准输出设备:控制台。     OutputStream     如:InputStream in = System.in;

System.in:对应的标准输入设备:      键盘。         InputStream  如:OutputStream out = System.out

三、转换流

转换流的作用就是将字节和字符进行相互转换,我们都知道,当我们输入字节的时候计算机会拿着字节按照相应的编码表进行编码将字节转换成字符;所以转换流可以指定编码表;转换流属于字符流的成员故转换流可以使用字符流中的功能。

1、读取转换流

读取转换流是字节通向字节的桥梁 。

读取转换流对象:InputStreamReader将字节流对象转换成字符流对象。

代码示例:

//获取键盘录入对象

InputStreamin = System.in;

//将字节流对象转换成字符流对象 ,使用转换流

InputStreamReaderreader = new InputStreamReader(in);

//提高效率,用缓冲区进行缓冲

BufferedReaderread = new BufferedReader(reader);

Stringline = null;

while((line=read.readLine())!=null)

{

System.out.println(line.toUpperCase());

if("over".equals(line))

break;

}

read.close();

2、写出转换流

写出转换流是字符通向字节的桥梁。

写出转换流对象:OutputStreamWriter,切记字符流输出需要刷新。

代码示例:

BufferedReader  a =   new  BufferedReader(newInputStreamReader(System.in));//输入时将字节转换成字符

BufferedWriter  b = new  BufferedWriter(newOutputStreamWriter(System.out));  //输出时将字符转换成字节

//键盘的最常见写法(必须记住)。

String line = null;

while((line=a.readLine())!=null)

 {

if("over".equals(line))

break;

b.write(line.toUpperCase());

b.newLine();

b.flush();            //需要刷新

}

a.close();

b.close();

此代码必须记住!!!

四、流操作的基本规律

1、字符流总结

流对象:FileReader 和FileWriter

方法:

       Read() Write();flush();close();

       文件续写FileWriter fw = new FileWriter("demo.txt",true)

缓冲区

缓冲区子类LineNumberReader

方法setLineNumberReader, getLineNumberReader

BufferedReader   特有方法readLine() 

BufferedWriter     特有方法 newline()

2、字节流总结

流对象FileInputStreamReader和FileOutputStreamWriter

方法

三种读取数据的方法(字节流不用刷新)

Read();Write();fclose();

缓冲区

BufferedInputStreamReader

BufferedOutputStreamWriter

3、 转换流总结

流方法      InputStreamReader()字节通向字符的桥梁(不用刷新)

OutputStreamWriter()字符通向字节的桥梁(需要刷新)

方法

三种读取数据的方法

Read();Write();close();

缓冲区

BufferedReader   特有方法readLine()

BufferedWriter     特有方法 newline()

键盘输入输出流

键盘输入流:InputStream  in= System.in;

键盘输出流:OutputStreamout = System.out

System.out:对应的是标准输出设备:控制台。     OutputStream

System.in: 对应的标准输入设备:键盘。             InputStream

相互之间的关系:转化流属于字符流。因为转化流是字符流的父类,而字符流底层调用的是字节流。当使用字符流的时候,字符流调用字节流的缓冲区缓冲数据,利用转化流的功能按照缓冲区中的字节数据去查找相应的编码表将字节转换成字符。所以可以用转换流指定访问相应的编码表。默认情况下的字符流访问GBK编码表

指定编码表代码示例:

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

流操作的基本规律:流对象有很多,到底应该用哪一个需要通过三个明确来完成。

1,明确源和目的。

源:  输入流:InputStream(键盘)    和Reader

目的:输出流:OutputStream(控制台) 和Writer。

2,操作的数据是否是纯文本。

是:  字符流: Writer       和Reader

不是:字节流:OutputStream和InputStream 

3,当体系明确后,再明确要使用哪个具体的对象。

通过设备来进行区分:

源设备: 键盘 System.in,  硬盘FileStream, 内存ArrayStream。

目的设备:控制台 System.out,硬盘FileStream, 内存 ArrayStream。

4、流对象

字符流对象:FileReader,    FileWriter

字节流对象;FileInputStream,FileOutputStream

5、是否需要缓冲区

字符缓冲区:BufferedWriter,     BufferedReader

字节缓冲区:BufferedOutputStream,BufferedInputStream

6、改变标准输入输出设备

方法:System中的静态方法

static void setIn(InputStream in)   //更改输入源

static void setOut(PrintStream in)  //更改输出目标

打印流构造函数PrintStream(StringfileName)

代码示例:

System.setIn(newFileInputStream("PersonDemo.java"));

System.setOut(newPrintStream("zzz.txt"));

       练习:将异常信息和日期打印成文件,方便日后查阅。

代码示例 :



五、系统信息

Properties类中的方法void list(PrintStream out):获取本地操作系统中的基本信息。

代码示例:


小练习:






------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值