黑马程序员—JAVA IO(Buffer和Stream)

本文详细介绍了 Java 中的输入输出流(I/O),包括字节流和字符流的概念及应用,重点讲解了如何利用 BufferedReader 和 BufferedWriter 提高文本数据读写的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- <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(字符输入流)

 

InputStreamOutputStream主要用于非文本的数据的读写操作

ReaderWriter主要用于文本数据的读写操作

 

与输入输出流相关:

读取键盘录入

 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,那么停止录入。

 

BuffeedrReaderBufferedWriter(缓冲流)

 

缓冲区的出现提高了对数据的读写效率

对应类

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值