------<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>、期待与您交流! -------