---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
字符流的缓冲区
缓冲区的出现提高了对数据的读写效率。
对应类
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用。
在流的基础上对流的功能进行了增强。
字节流
基本操作与字符流类相同
但它不仅可以操作字符,还可以操作其他 媒体文件
InputStreamReader,OutputStreamWriter
转换流的由来
字符流与字节流之间的桥梁
方便了字符流与字节流之间的操作
转换流的应用
字节流中的数据都是字符时,转成字符流操作更高效。
标准输入输出流
System类中的字段:in,out。
它们各代表了系统标准的输入和输出设备。
默认输入设备是键盘,输出设备是显示器。
System.in的类型是InputStream.
System.out的类型是PrintStream是OutputStream的子类FilterOutputStream 的子类.
标准输入输出流示例
例:获取键盘录入数据,然后将数据流向显示器,那么显示器就是目的地。
通过System类的setIn,setOut方法对默认设备进行改变。
System.setIn(new FileInputStream(“1.txt”));//将源改成文件1.txt。
System.setOut(new FileOutputStream(“2.txt”));//将目的改成文件2.txt
因为是字节流处理的是文本数据,可以转换成字符流,操作更方便。
BfferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw =
new BufferedWriter(new OutputStreamWriter(System.out));
流的基本应用小节
流是用来处理数据的。
处理数据时,一定要先明确数据源,与数据目的 地(数据汇)。
数据源可以是文件,可以是键盘。
数据目的地可以是文件、显示器或者其他设备。
而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理.转换处理等。
练习1:
/*
复制一个带行号的缓冲区对象
*/
import java.io.*;
class Copy1
{
public static void main(String[] args)
{
lineCopy();
}
public static void lineCopy()
{
BufferedReader bufr = null;
BufferedWriter bufw = null;
LineNumberReader lnr= null;
try
{
bufr = new BufferedReader(new FileReader("D:\\java1\\day13\\StringDemo.java"));
bufw = new BufferedWriter(new FileWriter("G:\\copy_1.txt"));
lnr = new LineNumberReader(bufr);
String len = null;
while ((len=lnr.readLine())!=null)
{
//System.out.println(lnr.getLineNumber()+":"+len);
/* */
bufw.write(lnr.getLineNumber()+":"+len);
bufw.newLine();
bufw.flush();
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException("写关闭失败");
}
try
{
if(bufr!=null)
bufr.close();
}
catch (IOException e)
{
throw new RuntimeException("读关闭失败");
}
}
}
}
练习2:
/*
用字节流复制一个图片
*/
import java.io.*;
class CopyPig
{
public static void main(String[] args)
{
copyPig();
}
public static void copyPig()
{
BufferedInputStream bufi = null;
BufferedOutputStream bufo= null;
try
{
bufi = new BufferedInputStream(new FileInputStream("c:\\1.jpg"));
bufo = new BufferedOutputStream(new FileOutputStream("g:\\1.jpg"));
int len = 0;
while ((len=bufi.read())!=-1)
{
bufo.write(len);
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
try
{
if(bufi!=null)
bufi.close();
}
catch (IOException e)
{
throw new RuntimeException("读关闭失败");
}
try
{
if(bufo!=null)
bufo.close();
}
catch (IOException e)
{
throw new RuntimeException("写关闭失败");
}
}
}
}
练习3:
/*
当录入一段数据,就将这些数据打印出来
如果录入over,就停止录入
*/
import java.io.*;
class ReadIn
{
public static void main(String[] args) throws IOException
{
//ReadIn_1();
ReadIn_2();
}
public static void ReadIn_1() throws IOException
{
InputStream in = System.in;
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=in.read())!=-1)
{
if(ch=='\r')
continue;
if(ch=='\n')
{
String s = sb.toString();
if("over".equals(s))
break;
System.out.println(s);
sb.delete(0,sb.length());
}
else
sb.append((char)ch);
}
}
public static void ReadIn_2() throws IOException
{
//创建一个键盘录入对象
InputStream in = System.in;
//将字节流转换成字符流对象,用InputStreamReader
InputStreamReader isr = new InputStreamReader(in);
//为了高效,将字符串进行缓冲区技术高效操作,用BufferedReader
BufferedReader bufr = new BufferedReader(isr);
// BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 这是一个用流键盘输入的方式,最为常用
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
System.out.println(line.toUpperCase());
}
}
}
/*
流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪一个。
通过三个明确来完成。
1,明确源和目的
源:输入流 InputStream Reader
目的:输出流 OutputStream Writer
2,操作的数据是否是纯文本
是,字符流
不是,字节流
3,当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台。
*/
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------