---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
输入输出流(I/O)分为两类:
1、字节流:InputStream(字节输入流) OutputStream(字节输出流)
2、字符流:Reader(字符读取流) Writer(字符输入流)
InputStream和OutputStream主要用于非文本的数据的读写操作
Reader和Writer主要用于文本数据的读写操作
与输入输出流相关:
读取键盘录入
System.out:对应的是标准输出设备,控制台
System.in:对应的是标准输入设备,键盘
举例如下:
public class ReadIn
{
public static void main(String[] args) throws IOException
{
//定义一个输入字节流
InputStream in = System.in;
//定义一个字符串容器
StringBuilder sb = new StringBuilder();
//循环
while(true)
{
//定义一个int型来存放字符(之后会强转)
int ch = in.read();
//如果读到了换行符的第一个字符‘\r’就继续
//因为换行符是由两个转义字符\r\n组成的
if(ch == '\r')
continue;
//如果读到了换行符的第二个转义字符'\n'
//就把输入的字符转化成字符串输出
if(ch == '\n')
{
String str = sb.toString();
//如果输入的字符串是over就结束输入
if(str.equals("over"))
break;
System.out.println(str);
//输出字符串之后清空字符容器
sb.delete(0, sb.length());
}
else
sb.append((char)ch);
}
}
}
这个例子是通过键盘录入数据当录入一行,就将该行数据进行打印如果录入的数据是over,那么停止录入。
BuffeedrReader和BufferedWriter(缓冲流)
缓冲区的出现提高了对数据的读写效率
对应类
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用在流的基础上对流的功能进行了增强缓冲区的出现是为了提高流的操作效率而出现的所以在创建缓冲区之前,必须要先有流对象
字符读取流缓冲区
该缓冲区提供了一个一次读取一行的方法readline()方便于对文本数据的获取
当返回null时,表示读到的文件末尾
readline()方法返回的时候只返回回车符之前的数据内容,并不返回回车符
readline()方法的原理:
无论是读一行,获取读取的多个字符,其实最终都是在硬盘上一个一个读取
所以最终使用的还是read方法一次读一个的方法
下面是一个BufferedReader的例子,其中使用到了FileReader
public class BRDemo
{
public static void main(String[] args)throws IOException
{
//创建一个读取流对象和文件相关联
FileReader fr = new FileReader("test.txt");
//为了提高效率,加入缓冲技术,将字符读取流对象作为参数
//传递给缓冲对象的构造函数
BufferedReader br = new BufferedReader(fr);
String line = null;
while((line = br.readLine())!=null)
{
System.out.println(line);
}
br.close();
}
}
明白了BufferedReader类中特有的方法readline()的原理后可以自定义一个类中包含一个功能和readline()一样的方法来模拟一下BufferedReader
class MyBufr
{
private FileReader fr;
public MyBufr(FileReader fr)
{
this.fr = fr;
}
//可以一次读取一行数据的方法
public String myreadline()throws IOException
{
//定义一个临时容器,原BufferedReader封装的是字符数组
//定义一个StringBuilder容器,因为最终还是要将数据变成字符串
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch = fr.read())!=-1)
{
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void myclose()throws IOException
{
fr.close();
}
}
class MyBR
{
public static void main(String[] args)throws IOException
{
FileReader fr = new FileReader("test.txt");
MyBufr m = new MyBufr(fr);
String line = null;
while((line = m.myreadline())!=null)
{
System.out.println(line);
}
m.myclose();
}
}
要点:
1、 只要用到缓冲区都要把数据从缓冲区刷出来
2、 关闭缓冲区就是在关闭缓冲区中的流对象, 所以不用再去关闭流对象
关于流的总结:
字符流:
FileReader FileWriterBufferedReader BufferedWriter
字节流
InputStream OutputStream BufferedInputStream BufferedOutputStream
转换流
InputStreamReader OutputStreamWriter FileInputStream FileOutputStream
转换流是字符和字节之间的桥梁,通常涉及到字符编码转换时需要用到
转换流
---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------