`
zengshaotao
  • 浏览: 791866 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java处理流,IO

    博客分类:
  • java
 
阅读更多

字符流的抽象基类是:Writer 和 Reader !

用于操作字符流的子类对象有:

1. FileReader  和 FileWriter .

        2. 功能对象:BufferedReader  和 BufferedWriter  他们分别对应于:FileReader 和 FileWriter ,用来达到对FileReader  和 FileWriter 的高效操作,具体见下文讲解。

——————————————————————————————————————————

 

【FileWriter】的学习,将从如下5点展开,并通过具体示例来体现:

1.      基本方法的演示

2.      对象创建的细节。

3.       对象操作的细节:close()  write()  flush()

4.      续写换行

5.      文件处理是的——异常处理规范!

 

示例一:将一个段文字数据写入到硬盘上.

 

  1. import java.io.FileWriter;  
  2. import java.io.IOException;  
  3.   
  4. public class FileWriterDemo {  
  5.     public static void main(String[] args) throws IOException {  
  6.         /*   
  7.         //需求:将一个段文字数据写入到硬盘上. 
  8.         思路: 
  9.         1,一段文字就是字符串数据。 
  10.         2,写到硬盘上,从哪到哪呢?字符串数据在内存中,写到硬盘上——将内存中的数据搞到硬盘上, 
  11.         这就涉及到了设备之间的数据处理。就要用到IO技术。 
  12.         既然是从内存到硬盘,应该是输出流。 
  13.         3,对于文字而言,io中提供了便捷的操作,比如字符流。 
  14.         4,结合两者,需要输出流,需要字符流,可以使用字符输出流。Writer 
  15.         5,具体用哪个子类对象呢?硬盘上用于存储数据的体现:文件。在这个体系中有对象FileWriter 。  
  16.          */  
  17.           
  18.           
  19.         //1,通过FileWriter创建流对象。构造时,必须明确写入数据需要存储的位置。   
  20.         /* 
  21.          * 该对象一创建,目的文件就会被创建。 
  22.          * 如果该文件已经存在,会被覆盖。  
  23.          * 做了什么事呢?在堆内存中创建一个对象。同时调用了系统的资源。 
  24.          */  
  25.         FileWriter fw = new FileWriter("demo.txt");  
  26.           
  27.         //2,使用字符输出流对象将字符串进行写入。调用写入方法。  
  28.         //数据没有直接写入到目的文件中,而是写入到了临时缓冲中。  
  29.         fw.write("abcdef");  
  30.           
  31.         //3,怎么把数据弄到文件中呢?发现Writer类中有一个flush()方法。刷新缓冲区,将缓冲的数据立即写入到目标中。  
  32.         fw.flush();  
  33.           
  34.         fw.write("haha");         
  35.         //4,关闭此流,关闭资源。在关闭之前,先刷一次缓冲,将数据都写入到目的中。  
  36.         fw.close();  
  37.                   
  38.         /* 
  39.          * flush()和close()有什么区别? 
  40.          * flush():仅将缓冲中的数据刷新到目的地。流对象可以继续使用。可以使用多次。 
  41.          * close():将缓冲中的数据刷到目的地后,直接关闭流资源,流无法继续使用。只能使用一次。 
  42.          * 在close()方法当中其实在关闭之前都会调用一次flush(); 
  43.          *  
  44.          */  
  45.     }  
  46. }  

 

通过上述示例,我们必须注意以下几点:

1.      通过FileWriter创建流对象。构造时,必须明确写入数据需要存储的位置。

2.      使用字符输出流对象将字符串写入时,必须调用 writer() 方法,但是这些字符并没有直接被写到 目的地中,而是被写在了Writer类默认的缓冲区中,这可以在Java源代码中查到。

3.      将缓冲区中的数据写到目的中,需要调用flush()方法,将缓冲区刷新。

4.      在一系列操作完成后,必须要做的动作是,关闭流,释放系统资源。需调用close()。

5.      其次就是,flush()和 close()方法调用,这两者之间的区别:上文已经提到,不在赘述。

 

示例二:想对刚才的文件demo.txt 进行一个续写!

 

  1. import java.io.FileWriter;  
  2. import java.io.IOException;  
  3.   
  4. public class FileWriterDemo2 {  
  5.   
  6. private static final String LINE_SPARATOR = System.getProperty("line.separator");  
  7.   
  8.     public static void main(String[] args) throws IOException {  
  9.   
  10.         /* 
  11.          * 需求:想要来个续写。 
  12.          * 这个对象创建是不行的,因为该构造一创建,就覆盖了已有的文件。  
  13.          * 可以使用另一个构造函数,加入一个boolean参数,为true,就可以实现续写。 
  14.          *  
  15.          * 需求:想要将数据分行写入。 
  16.          *  
  17.          * window中的特有软件比如notepad。只识别window中的特有换行 \r\n. 
  18.          * 为了在不同系统平台下换行。使用System类获取当前系统信息。 
  19.          *  
  20.          *  
  21.          */  
  22.         //该构造方式,通过第二个参数来决定是否进行续写  
  23.         FileWriter fw = new FileWriter("demo2.txt",true);  
  24.         fw.write("xi"+LINE_SPARATOR+"xi");  
  25.         fw.close();               
  26.     }  
  27. }  

 

上述示例主要提示我们一下几点:

1.    如果想在原来的文本后,在继续添加文字,该怎么办?这时,可以使用FileWriter的另外一个构造方法,传入加入一个boolean参数,为true,就可以实现续写。

2.    其次,就是,当数据需要分行写入时,为了让程序在不同的系统平台上都可以运行,不能讲换行的符号写死,可以动态的获取系统的属性来取到当前系统中的换行符:

private static final String LINE_SPARATOR =      System.getProperty("line.separator");

3.    无论如何都不能忘记:流不再使用的时候,必须得关闭。

 

 

在对IO系列中的FileWriter对象有了大概的了解后,我们会发现,在程序中的很多地方都会发生异常:繁多而又不同的异常。因此,我们有必要来介绍一下,Java中IO体系的异常处理规范:当然了,也是从一个示例讲起:

 

  1. import java.io.FileWriter;  
  2. import java.io.IOException;  
  3. public class FileWriterDemo3 {  
  4.       
  5.     public static void main(String[] args) {  
  6.         /* 
  7.          * IO异常的处理规范。  
  8.          * 创建流对象—————— 在try外创建流对象的引用。 在try内对流对象进行初始化。 
  9.          */  
  10.         FileWriter fw = null;  
  11.         try {  
  12.             fw = new FileWriter("k:\\demo3.txt");  
  13.   
  14.             fw.write("abcde");  
  15.             fw.flush();  
  16.   
  17.         } catch (IOException e) {  
  18.   
  19.             System.out.println(e.toString());  
  20.         } finally {  
  21.             //在关闭之间必须得判断这个流是否存在,是否被创建。  
  22.             if (fw != null)  
  23.                 try {  
  24.                     fw.close();  
  25.                 } catch (IOException e) {  
  26.   
  27.                     // 相关的代码处理。比如说,将关闭失败的信息记录到日志文件中。  
  28.                     throw new RuntimeException("关闭失败");  
  29.                 }  
  30.         }  
  31.     }  
  32. }  

 

通过以上示例,我们的明白,在Java中IO异常的处理时:

1.    对象的创建方式——创建流对象时, 在try外创建流对象的引用。 在try内对流对象进行初始化。

2.    在finally的代码中,流的关闭时必须得执行的动作。但是,在关闭前,必须得判断,这个流是否创建成功,如果没有创建成功的话,何谈关闭。

3.    在处理流关闭失败后,可以进行一系列的操作:或者将关闭失败的信息记录到日志文件中。


 

————————————————————————————

 

下面我们来讲解:另一个重要的对象——FileReader。

 FileReader: 这个对象的主要用途在于读取,因此,我们将着重分析,它对指定文件的读取方式,FileReader 读取字符时有两种方式:

1. 读取单个字符的方法:读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。返回值:作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1

2. 读取字符数组:将读到的字符存储到字符数组里面,并且返回字符数组的长度。如果到达流的末尾,返回-1.

下面来演示,他们的具体应用:

 

  1. import java.io.FileNotFoundException;  
  2. import java.io.FileReader;  
  3. import java.io.IOException;  
  4.   
  5. public class FileReaderTest {  
  6.   
  7.     public static void main(String[] args) throws IOException {  
  8.         // TODO Auto-generated method stub  
  9.         FileReader fr = new FileReader("IO流.txt");  
  10.           
  11.         //演示读取单个字符  
  12.         long time = System.currentTimeMillis();  
  13.         readChar(fr);  
  14.         long timereadChar = System.currentTimeMillis();  
  15.           
  16.         System.out.println("time Read char is  = " + (timereadChar-time));  
  17.         //演示读取字符到缓冲区中。  
  18.           
  19.         long time2 = System.currentTimeMillis();  
  20.         readToBuf(fr);  
  21.         long timeReadBuf = System.currentTimeMillis();  
  22.         System.out.println("time Read to Buf is =  " + (timeReadBuf-time2));  
  23.           
  24.   
  25.     }  
  26.     private static void readToBuf(FileReader fr) throws IOException {  
  27.         //定义一个字符缓冲区,用于存放读到的字符。  
  28.         char[] buf = new char[50];  
  29.         //设刚开始读到的字符为0  
  30.         int len = 0 ;  
  31.         //一直循环读取字符到缓冲区中,直到读到流的末尾。  
  32.         while((len = fr.read(buf)) != -1){  
  33.             //将每次读满的缓冲区中的字符,变成字符串打印出来。  
  34.             System.out.println(new String(buf , 0 , len));        
  35.         }     
  36.     }  
  37.     private static void readChar(FileReader fr) throws IOException {  
  38.         //设每个读取到的字符整数值为ch.  
  39.         int ch = 0;   
  40.         //循环读取字符,直到流的末尾  
  41.         while((ch = fr.read()) != -1){  
  42.             //将读取到的字符,强制转换为 char  
  43.             System.out.print((char) ch);  
  44.         }  
  45.     }  
  46. }  

 

上述两种读取方式,最明前的区别在于:

   第二种读取字符的方式,要比第一种方式高效。

 

 

到目前为止,我们已经学了FileReader, FileWrite的具体使用,以及IO异常的处理方式,下面将通过一个具体的示例,来综合的应用上述所学的知识:

我们将完成一个:文件复制的练习。并且使用两种读取字符方式来完成。该例子中用的路径,假设在你的机器中也存在。

 

 

题目:

   

        * 练习:将c盘的一个文本文件复制到d盘。

        * 思路:

        * 1,c盘的文件是一个数据的源。

        * 复制到的d盘,说明d盘是数据的存储的目的。该目的中应该有一个文件。

        * 2,先读取c盘的文件。将读取到的数据写入到目的地中。

        *3,既然是操作文本文件,只要使用字符流即可。

 

 

1.用缓冲区数组,来完成读写操作;

  1. import java.io.FileReader;  
  2. import java.io.FileWriter;  
  3. import java.io.IOException;  
  4.   
  5. public class CopyTextTest1 {  
  6.   
  7.       
  8.     public static void main(String[] args) {  
  9.   
  10.         /* 
  11.          *  
  12.          * 使用缓冲区数组。 
  13.          * 使用的就是可以操作数组的读写方法。 
  14.          */  
  15.         //1,定义字符输入流和字符输出流的引用。   
  16.         FileReader fr = null;  
  17.         FileWriter fw = null;  
  18.           
  19.         try {  
  20.             //2,对流对象进行初始化。  
  21.             fr = new FileReader("demo.txt");  
  22.             fw = new FileWriter("copy_demo2.txt");  
  23.               
  24.             //3,定义一个数组缓冲区。用于缓冲读取到的数据。   
  25.             char[] buf = new char[1024];  
  26.               
  27.             //4,读写操作。   
  28.             int len = 0;  
  29.             while((len = fr.read(buf))!=-1){  
  30.                 fw.write(buf,0,len);  
  31.             }  
  32.               
  33.         } catch (Exception e) {  
  34.             System.out.println(e.toString());  
  35.         }finally{  
  36.               
  37.             if(fw!=null)  
  38.                 try {  
  39.                     fw.close();  
  40.                 } catch (IOException e) {  
  41.                       
  42.                     throw new RuntimeException("写入关闭失败");  
  43.                 }  
  44.               
  45.             if(fr!=null)  
  46.                 try {  
  47.                     fr.close();  
  48.                 } catch (IOException e) {  
  49.                       
  50.                     e.printStackTrace();  
  51.                 }  
  52.         }  
  53.     }  
  54. }  

2. 用读取单个字符的方式来完成。

  1. import java.io.FileReader;  
  2. import java.io.FileWriter;  
  3. import java.io.IOException;  
  4.   
  5. public class CopyTextTest {  
  6.   
  7.     /** 
  8.      * @param args 
  9.      * @throws IOException  
  10.      */  
  11.     public static void main(String[] args) throws IOException {  
  12.   
  13.       
  14.           
  15.         //1,创建字符读取流对象和源相关联。   
  16.         FileReader fr = new FileReader("IO流.txt");  
  17.           
  18.         //2,创建字符输出流对象,明确要存储数据的目的。  
  19.         FileWriter fw = new FileWriter("copy_demo.txt");  
  20.           
  21.         //3,进行读写操作。读取一个,就写入一个。  
  22.         int ch = 0;  
  23.         while((ch=fr.read())!=-1){  
  24.             fw.write(ch);  
  25.         }     
  26.         //4,关闭资源。  
  27.         fw.close();  
  28.         fr.close();  
  29.           
  30.     }  
  31.   
  32. }  

 

缓冲区高效的原因:

流对象的read():是从目的地一次读取一个;

缓冲区的read() :是通过流对象的read( [  ] ) 将一批数据读取到缓冲数组,然后再从数组中一次取一个,所以内存操作要比硬盘操作要高效。

 

 

就在刚才,我们用的高效读取方式,是将字符全部读取到数组中,来达到高效的目的,在Java中,为了提高程序的性能,为我们专门提供了对应的类:

BufferedReader  和BufferedWriter . 接下来,我们将开始学习,这两个对象。

——————————————————————————————————

 

【BufferedReader 】 

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。(他的构造方法有两个,一个构造方法使用的是默认大小的缓冲区,另一个构造方法,可以设定自己的缓冲区大小)

他的牛逼之处在于,提供了一个一次读取一行的方法:

readline() ——读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。返回值:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

下面来具体应用:

 

  1. import java.io.BufferedReader;  
  2. import java.io.FileReader;  
  3. import java.io.IOException;  
  4.   
  5. public class BuffereReaderDemo {  
  6.   
  7.     public static void main(String[] args) throws IOException {  
  8.         /** 
  9.          * 演示:BufferedReader 
  10.          * 1. 先有字符读取流; 
  11.          * 2. 该类有一个特有方法。readLine(). 一次读一行。 
  12.          */  
  13.         //创建读取流对象 和 文件相关联。  
  14.         FileReader fr = new FileReader("Demo.txt");  
  15.           
  16.         //创建读取缓冲区对象 和 流对象关联对其进行高效 操作;  
  17.         BufferedReader  bufr = new BufferedReader(fr);  
  18.         //简写形式:  
  19.         //BufferedReader bufr = new BufferedReader(new FileReader("Demo.txt"));  
  20.           
  21.         String line = null ;  
  22.         while((line = bufr.readLine()) != null){  
  23.             System.out.println(line);  
  24.         }  
  25.         bufr.close();  
  26.     }  
  27. }  

 

在上述示例中我们应当注意的是:

1.      BufferedReader的简写形式。

BufferedReader bufr = newBufferedReader(new FileReader("Demo.txt"));

 

2. 【readLine().一次读一行的原理

  从缓冲区中取出字符存储到该方法的容器中。当取出的字符是回车符时,就将已经存储的数据作为字符串返回。就是一行数据。

   ReadLine()  调用buf.read()将缓冲区中的数据存储到,自己建立的容器中。ReadLine()建立自己的容器—— StringBuilder 最合适。

 

 

下面我们来学习,BufferedWriter,作为与BufferedReader配套出现的亲兄弟,他的作用,当然显而易见。

  1. import java.io.BufferedWriter;  
  2. import java.io.FileWriter;  
  3. import java.io.IOException;  
  4.   
  5. public class BufferedWriterDemo {  
  6.   
  7.     public static void main(String[] args) throws IOException {  
  8.   
  9.         //创建一个流对象。  
  10.         FileWriter fw = new FileWriter("buf.txt");  
  11.           
  12.         //为了提高效率。创建缓冲区对象,并和要被提高效率的流相关联。   
  13.         BufferedWriter bufw = new BufferedWriter(fw);  
  14.       
  15.         for(int x=0;x<4; x++){  
  16.             bufw.write(x+"--hahaha");  
  17.             //写入一个换行符。  
  18.             bufw.newLine();  
  19.             //要对缓冲区进行刷新。记住:一般只要使用了缓冲区,就一定要刷新。   
  20.             bufw.flush();  
  21.         }  
  22.           
  23.         //关闭缓冲区。   
  24.         bufw.close();//问:还用关闭fw.close()?不用,因为关闭缓冲区,其实就是在关闭缓冲区关联的流。  
  25.           
  26.     }  
  27. }  

在上述示例中,我们应当注意:

1.      写入一个新行的方法:newline();

2.      每写一次,就要讲缓冲区刷新一次。

3.      在使用完后,关闭缓冲区即可,不需要在关闭流。因为流已经与缓冲区相关联了。

 

 

至此:我们已经学习了IO体系中的四个对象:

 

FileReader  FileWriter  BufferedReader BufferedWriter

分享到:
评论

相关推荐

    Java中文件IO流.pdf

    Java 中文件 IO 流 Java 中文件 IO 流是指 Java 语言中对文件的输入输出操作,通过定义文件流来实现文件的读写...在 Java 中,文件 IO 流操作是非常重要的,掌握文件 IO 流操作可以帮助我们更好地处理文件相关的任务。

    IO流 javaio java 流

    3. 处理流: - Filter流:这些流没有自己的数据源或目的地,而是包装其他流,提供额外的功能,如数据过滤、压缩等。例如,DataInputStream和DataOutputStream用于处理基本数据类型,GZIPOutputStream用于压缩数据。...

    Java-Io流,练习

    1. 字节流:Java的`java.io`包中提供了处理字节流的类,如`InputStream`和`OutputStream`作为所有字节输入流和输出流的基类。它们的子类如`FileInputStream`和`FileOutputStream`分别用于文件的读写。 2. 字符流:...

    JAVA IO流技术

    Java IO流技术是Java平台中用于处理输入输出的重要机制,其核心在于数据的传输,从数据源到程序或从程序到目的地...在实际编程中,根据需求选择适当的流类型,结合处理流进行优化,可以构建出高效、灵活的IO解决方案。

    java中的io流详解

    Java 中的 IO 流详解 Java 中的 IO 流是指在 Java 语言中对输入输出操作的抽象,主要用于实现程序与外部设备和其他计算机之间的交流,尤其是对磁盘文件的操作。IO 流的概念是在 1984 年由 C 语言第一次引入的,后来...

    java基础之IO流

    - **定义**:在Java中,IO流(Input/Output Streams)是用来处理输入输出的基本工具。流是一种有序的数据集合,通常涉及从源到目的地的数据传输过程。源可以是文件、键盘输入、网络连接等;而目的地则可能是屏幕显示...

    Java IO流 总结

    在Java IO流中,节点流是指离数据源或程序最近的流处理流,主要有两种类型:字节流和字符流。字节流可以处理一切类型的数据,如纯文本、音频、视频等,而字符流只能处理纯文本数据。 2. 字节流: 字节流是Java IO...

    java零基础自学 之 JavaIO流处理

    Java IO流处理是Java编程中一个非常重要的概念,主要用于数据的输入和输出操作。对于Java初学者来说,理解和掌握IO流的基本使用至关重要。在Java中,流被形象地比喻为数据传输的通道,数据可以从一个源头(如文件、...

    java IO流精讲 JAVA IO流实例开发

    Java IO流是Java平台中用于处理输入/输出操作的核心组件,它允许程序与各种数据源(如文件、网络连接、内存缓冲区等)进行交互。Java IO流的精讲涵盖了许多概念和技术,包括流的分类、流的方向、缓冲区的使用、字符...

    java_IO流的处理.ppt

    Java IO流处理是Java编程中一个非常重要的概念,它用于在不同数据源之间传输数据,如文件、网络、内存等。在Java中,IO流分为两大类:输入流(Input Stream)和输出流(Output Stream),它们分别用于数据的读取和...

    java io流 案例

    Java IO流是Java平台中的重要组成部分,用于处理输入和输出操作。它允许程序与外部设备如硬盘、网络、内存等进行数据传输。IO流的概念基于流(Stream)模型,数据以字节或字符序列的形式流动。Java IO库提供了丰富的...

    彻底明白java中的IO流

    Java中的IO流是Java核心库java.io中的关键组成部分,它为程序提供了与外部资源交互的能力,包括文件读写、标准设备输入输出等。Java的IO流机制基于流的概念,流可以被视为数据传输的通道,数据按照序列化的方式从...

    Java的例外处理和IO流

    Java的异常处理和IO流是Java编程中两个重要的概念,它们在处理程序错误和数据输入输出方面发挥着关键作用。 4.1 异常处理 Java的异常是一种在程序运行时发生的问题,它中断了正常的代码执行流程。异常是通过异常...

    Java IO流文档

    在Java中,输入输出流(简称IO流)是用来处理文件读写的核心技术之一。它主要包括两类:以字节为导向的流和以字符为导向的流。 ##### 1.1 以字节为导向的流 以字节为导向的流是指按照字节来进行数据读写的流,适用...

    JavaIO流详细总结

    Java IO流是Java编程语言中处理输入和输出的重要机制,它允许程序与各种类型的输入源(如键盘、文件、网络连接)以及输出目标(如显示器、文件、网络)进行交互。在Java中,I/O流被设计为面向对象,使得处理数据变得...

    java之io流实例

    - File类是Java处理文件的基础,提供了创建、删除、重命名文件以及获取文件属性的方法。 - Files类提供了更多高级的文件操作,如复制、移动文件,读取文件内容等。 在实际开发中,我们通常会根据需求选择合适的流...

    java_io流的处理

    ### Java IO流处理详解 #### I/O流概述 在Java编程中,输入/输出(I/O)处理是一项核心技能,涉及从键盘读取数据、向屏幕输出数据、从文件读写数据以及在网络连接上进行读写操作。Java将这些不同的输入输出源抽象...

    Java基础篇:IO流.pdf

    本知识点将深入探讨Java IO流的相关细节,包括节点流与处理流的概念,以及文件流、标准输入输出流、缓冲流、转换流、打印流、数据流和对象流的处理过程和使用方法。 首先,Java中的IO流根据数据流向可以分为输入流...

    java中的IO流整理

    3. 按功能:节点流(直接操作数据源,如FileInputStream)和处理流(不直接操作数据源,而是包裹其他流,如BufferedInputStream) 四、常用类 1. FileInputStream/FileOutputStream:文件字节输入/输出流,用于读写...

    Javaio流思维导图

    Java I/O 流是Java平台中的一个重要组成部分,它在处理数据输入和输出方面扮演着核心角色。I/O流系统提供了一种标准化的方式来读取、写入数据,无论是从磁盘、网络、内存还是其他类型的输入输出设备。在这个思维导图...

Global site tag (gtag.js) - Google Analytics