黑马程序员 -IO流(上)

IO 流 (上)

1 IO 流
用来处理设备之间的数据传输 。流只操作数据。
流按操作数据分为:字节流,字符流
流按流向分为:输入流,输出流
输入:将外设的数据读取到内存中。
输出:将内存的数写入到外设中。
流按操作数据又分为 字节流 和 字符流,字节流读取文字字节数据后 ,不直接操作而是先查看指定的编码表,获取相对性的文字,再对这个文字进行操作,简单说字节流+编码表。
字节流的抽象基类:InputStream,OutputStream.
字符流的抽象基类 : Reader , Writer.
1 明确操作中存在的数据源和数据的目的
存在数据源 : InputStream Reader
数据的目的 : OutputStream Writer
2 明确数据是否是纯文本数据
数据源 是纯本文:Reader
否:InputStream
数据目的 是纯文本 :Writer
否:OutputStream
3 明确具体的设备
数据源的设备:
硬盘:File
键盘: System.in
内存:数组
网络:Socket流
数据目的的设备:
硬盘:File
键盘: System.out
内存:数组
网络:Socket流
4 是否需要缓冲区
1 需要高效 加上 buffer

IO 流常用基类
字节流的抽象基类:InputStream ,OutputStream
字符流的抽象基类 : Reader,Writer

 字符流:FileWriter、FileReader (缓冲区:BufferedWriter、BufferedReader)
 字节流:FileOutputStream、FileInputStream

(缓冲区:BufferedOutputStream、BufferedInputStream)
由这四类派生出来的子类名称都是以其父类名作为子类名的后缀。

转换 流:
InputStreamReader : 字节 转字符
OutputStreamWriter : 字符 转字节
使用 :
转换流是字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要用到转换流。

2 字符流

2.1 Writer
子类必须实现的方法仅有 writer(char[] , int , int)、flush()、close(), 多数子类将重写方法,以提供更高的效率和其他功能。

直接已知子类 7 个: BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter,PipedWriter, PrintWriter, StringWriter

构造方法:
); //创建一个新的字符流 writer,其关键部分将同步 writer 自身。
protected Writer(Object lock);
//创建一个新的字符流 writer,其关键部分将同步给定的对象。
方法:
append(); 添加
void writer(); // 写入单个字符、字符数组、字符串、字符串的某一部分
需要子类去做不同实现的方法:
writer(char[] , int , int); //写入字符数组的某一部分
flush 刷新该流的缓冲
abstract void close(); //关闭此流,但要先刷新它

**

2.2 FileWriter

FileWriter: 用来写入字符文件的便捷类。继承 OutputStreamWriter 类。
不存在空参数构造函数。
步骤 :

1 创建文件。 文件。 创建一个 FileWriter 对象, 该对象一初始化就必须要明确被操作的文件。
而且该文件会被创建到指定的目录下。如果该目录下已有同名文件,已有文件将被覆
盖。明确数据要存放的目的地(文件) 。
一定要做异常处理或者抛异常。否则 报错 。 在 s windows 中 目录 分隔符 用\ \ \ 。
eg:FileWriter fw=new FileWriter(“demo.txt”);

2 调用 writer 方法,将字符串写入( 写入( 内存 )流中 流中。
eg:fw.writer(“abcfgggg”);

3 刷新 刷新流对象中的缓冲区数据 数据。将数据刷新到目的地(文件) 。
Note:在流关闭之前,流一直存在,可以反复写入数据,但每次写入后,都需要进行
此刷新操作。
eg:fw.flush();

4 关闭 流资源 (必须有的步骤) ) 。但关闭之前会刷新一次内部缓冲区中的数据,将数
据刷新到目的地(文件) 。
eg:fw.close();
flush 与 与 close 的 区别:
flush ,流一直存在,可以
close 刷新后会将流关闭,不能再继续写入数据。关闭资源需要单独做 try 处理。
构造函数:
FileWrite(String filename,boolean append)throws IOException{ }
//根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对
象。
//如果 append 为 true,则将数据写入文件末尾处。
eg:
FileWriter fw = new FileWriter(“demo.txt”,true);
//传递一个 true 参数,代表不覆盖已有的文件。 并在已有文件的末尾处进行数据续写。若没有该文件,则创建。

2.3 缓冲区与 与 BufferedWriter

 缓冲区的出现是为了提高流的操作效率,因此,在创建缓冲区前,必须要有流对象。
 BufferedWriter: 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组、字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。

  FileWriter w = new FileWriter("test.txt");
  BufferedWriter bfw = new BufferedWriter(w);//加入缓冲区
  bfw.write(“abc\r\nde”);//写数据
  bfw.flush();//只要用到缓冲区,必须将写入的字符刷新,才能将字符写入目的地 
  bfw.close();//关闭流  

2.4 Reader

Reader: 用于读取字符流的抽象类。子类必须实现的方法只有 read(char[] , int , int )和close()。

方法 :

  • read(); //读取的是单个字符

    boolean ready(); //判断是否准备读取此流。
    void reset(); //重置该流
    long skip(long n); //跳过字符, 返回实际跳过的字符数; 若 n 为负 数, 发生异常 IllegalArgumentException
    void mark(); //标记流中的当前位置
    boolean markSupported(); //判断此流是否支持 mark()操作
    `

2.5 FileReader ( 文本 文件的读取 )

FileReader: 用来读取字符文件的便捷类。此类构造方法假定默认字符编码和默认字节缓冲区大小适当。
方法:
close(); //关闭该流
int read(); //读取。

    FileReader read=new FileReader(“demo.txt”);
``` int ch=0;
    while((ch=fr.read()!=-1)){

      System.out.println((char)ch);

}
   fr.close();

    //通过字符数组进行读取
       FileReader read=new FileReader(“demo.txt”);
      char[] buf=new char[1024];
       int num=0;
       //将读到的字符存入字符数组中
       while((num=fr.read(buf))!=-1){

           System.out.println(new String(buf,o,num));


}


        fr.close();





<div class="se-preview-section-delimiter"></div>

2.5 BufferedReader( 缓冲区)
----------------------------
      BufferedReader : 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
      readLine(); //读取一个文本行。
       这个方法是利用了内容的缓冲区,将数据也就是二进制数据(一部分)首先从硬盘中提取到内存数组中,new  bufferedreader(new Reader).read() 这个方法从缓冲区中取出字符数据,这步为 readLine() 的实现提供了基础,之后我们再设置一个零时的数组,这个容器可以是StringBuilder.其实是使用了 上述的方法,把换行,回车符之前的数据,读取到这个容器中,然后再将这个容器的字符数据变成字符串返回。







<div class="se-preview-section-delimiter"></div>
  FileReader fr = new FileReader("buf.txt");                
            BufferedReader bufr = new BufferedReader(fr);

            FileWriter fw = new FileWriter("buf_copy.txt");
            BufferedWriter bufw = new BufferedWriter(fw);


            String line = null;
            while((line=bufr.readLine())!=null){
                    bufw.write(line);
                    bufw.newLine();//换行 
                    bufw.flush();
            }
            bufw.close();
            bufr.close();

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值