黑马程序员——IO(Input Output)流(一)

来源:互联网 发布:网络连接失败 请重试 编辑:程序博客网 时间:2024/05/16 06:48

IO流基本区分:

 (1)按操作数据来区分为两种:字符流、字节流

  解析:处理文本文件数据的时候一般会选择字符流,一般来说音乐、图像、流媒体文件都用节流来读。
字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高

 (2)按流向区分:输入流,输出流。

IO流常用基类(后缀):

字节流抽象基类:InputStream 输入(读操作) 、OutputStream 输出(写操作)

字符流的抽象基类:Reader 、Writer


(一)字符流

写操作:writer

创建一个字符流数据步骤:

(1),创建一个FileWriter对象,并初始化明确被操作的文件,而且该文件会被创建到指定目录下;

(2),调用write()方法写入字符串;

(3),刷新流数据flush(); 用newLine()换行;

(4),关闭流close();关闭前会自动刷新flush();


flush()和close()的区别:

flush()刷新之后流可以继续操作。但是close()之后,流会关闭

创建一个字符流文件Demo.txt并将数据“3425252”写入其中代码如下

import java.io.*;
class   FileWriterDemo1
{
public static void main(String[] args) throws IOException
{
       
  
  FileWriter fw=new FileWriter("Demo.txt");
       //调用write方法,将字符串写入到流中
  fw.write("3425252");
  //刷新流中的数据,流可以继续使用
  fw.flush();
       //关闭流资源,但是关之前会刷新一次关闭后将流关闭
        fw.close();
// System.out.println("Hello World!");
}
}


IO异常处理的基本代码:

import java.io.*;
class   FileWriterDemo1
{
public static void main(String[] args) throws IOException
{
            FileWriter fw=null;
   try{
        fw=new FileWriter("Demo.txt");
       //调用write方法,将字符串写入到流中
   fw.write("3425252");

     }catch(IOException e)

{

 System.out.println(e.toString);

}finally{

try{

if(fw!=null){

 //关闭流资源,但是关之前会刷新一次关闭后将流关闭
        fw.close();

}catch((IOException e)

{

  System.out.println(e.toString);

}}}}}

注意换行:在不同的操作系统下换行不一样,在windows下,回车符是由和\r\n共同完成换行,而在linux里面\n可以带表换行。


读操作:Reader

读取一个字符流数据步骤:

(1)创建一个文件读取流对象,和指定的文件想关联;

(2)定义一个字符数组缓冲区,即char [] buf=new char[1024] 

 (3)调用读取流对象的read方法,注意:用while循环来读取字符流转为String,

并用读取的字符的时候返回值等于-1为标识到结尾,并在循环内部打印

(3)关闭流close();


字符流缓冲区:

对应的类为BufferedWriter、BufferedReader

缓冲区要结合流才能使用,在创建缓冲区之前,必须要有流对象。

优点:增加了对数据的读写效率。

写操作步骤:

(1)创建一个字符写入流操作对象(fw);

(2)(创建一个BuferedWriter对象bufw)然后将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可

(3)通过缓冲的bufw.write()方法写入数据,提供一个跨平台的newLine()换行符

(4)刷新流bufw.flush();切记只要用到缓冲区必须要刷新

(5)关闭缓冲区bufw.close()

 (6)关闭流资源fw.close()


实例代码:

class  BufferedWriterDemo
{
public static void main(String[] args)    throws IOException
{
//创建一个字符写入流对象
FileWriter fw=new FileWriter("buf.txt");
//为了提高字符写入流效率,加入了缓存技术
//只要将需要被提高效率的对象流作为参数传递给缓冲区的构造函数即可
BufferedWriter bufw=new BufferedWriter(fw);
for(int i=1 ;i<5;i++)
{
             bufw.write("abcdefg"+i);
bufw.newLine();
bufw.flush();
}    
bufw.write("abcdefg");
//只要用到缓冲区就要刷新
     
//System.out.println(new String(bufw,0,bufw.read()));
}
}


字符流缓冲区读操作:

步骤:

  (1),创建一个读取流对象和文件相关联;

(2)加入缓冲技术,将字符读取流对象作为参数传递给创建的缓冲对象的构造函数(同写操作)

(3)调用缓冲技术里面的readLine来读取一行的数据,写一个while循环来读取大量数据,当readLine()达到末尾就返回null;

 (4)打印读取的数据

(5)关闭缓冲区流bufr.close()

技巧:在创建缓冲读取流和写入流的时候可以写为

BufferedReader  bufr=null;

BufferedWriter   bufw=null;

try{

bufr = new BufferedReader(new FileReader("Demo.java"));//将要复制的文件

bufw = new BufferedWriter(new FileWriterr("demo.txt"));复制之后的目标文件

}

自己的理解:切记要把Demo.java和demo.txt的谁是源谁是目的分清。

在之前都以为FileReader为BufferedReader的父类,今天才知道我颠倒了,其实FileReader是BufferedReader的子类


理解:

在缓冲技术中,readLine()方法原理,无论是读一行还是获取多个字符,其实最终都是在硬盘上一个一个读取,所以最终使用的还是read方法一次读取一个数据。


跟踪行号的缓冲字符输入流:

BufferedReader 的直接子类LineNumberReader,该类为装饰了的实例体现。

获取行号从而读取字符,即可以用getLineNumber()方法,进行按行号进行读取;

使用格式:

FileReader fr=new FileReader("HeiMa.txt");

LineNumberReader lnr=new LineNumberReader(fr);


自我学习心得:通过对IO这部分知识的学习,我理解了数据的输入输出的操作具体的实现,以及步骤,也更深层次的认识了什么是IO,记得我第一次去面试的时候,人家第一个问题叫我给他说说什么是IO,我当场不知道怎么说,在之前没有深入了解到这个知识,现在通过学习IO的知识,才发现自己当场知识的浅薄,我我一定要加入黑马,更加努力的学习更深层次的知识。

0 0
原创粉丝点击