zoukankan      html  css  js  c++  java
  • Java基础之IO技术(一)

    ---恢复内容开始---

      Java基础中的IO技术可谓是非常重要,俗话说的好,万丈高楼起于垒土之间。所以学习Java一定要把基础学好,今天我们来学习IO技术的基础。

      IO无非就是输入与输出,而其中处理的数据无非是字符与字节。字符最简单的定义就是这个数据是否是纯文本组成,除此之外所有的都是字节。Java给我们提供了字符和字节的处理,其中字符的处理有Writer和Reader两个抽象父类(分别对应的是写和读),字节的处理有OutputStream和InputStream两个抽象类(分别对应的是写和读)。今天我们就看看字符的处理。

      字符的处理

      1.字符的读(FileReader)

      首先请看一段代码:

     1 import java.io.*;
     2 
     3 public class FileReader1 {
     4     public static void main(String[] args){
     5         FileReader fr = null;
     6         try{
     7             fr = new FileReader("1.txt");
     8             int ch = 0;
     9             //read():字符读取,如果已经达到流的结尾,则为-1
    10             //这个可以作为读取文件结束的条件
    11             while((ch = fr.read()) != -1){
    12                 //进行强制转换
    13                 System.out.print((char)ch);
    14             }
    15             sop("读取结束");
    16 
    17         }catch(FileNotFoundException e){
    18             sop(e.toString());
    19         }catch(IOException e){
    20             sop(e.toString());
    21         }finally{
    22             try {
    23                 if(fr != null) {
    24                     fr.close();
    25                 }
    26             }catch(IOException e){
    27                 sop(e.toString());
    28             }
    29         }
    30     }
    31     public static void sop(Object obj){
    32         System.out.println(obj);
    33     }
    34 }

      这是文件读取的第一种方法,这种方法是将文件中的数据一个一个的读出来,这样操作比较耗资源,因此有了第二种读取方法,请看下面这段代码。

     1 import java.io.*;
     2 
     3 public class FileReader2 {
     4     public static void main(String[] args){
     5         FileReader fr = null;
     6         try{
     7             fr = new FileReader("1.txt");
     8             //read(char[] cbuf):将字符读取到数组中
     9             //这个数组大小1024整数倍
    10             char[] buff = new char[1024];
    11             int num = 0;
    12             while((num = fr.read(buff)) != -1){
    13                 sop(new String(buff, 0, num));
    14             }
    15 
    16         }catch(FileNotFoundException e){
    17             sop(e.toString());
    18         }catch(IOException e){
    19             sop(e.toString());
    20         }finally{
    21             try{
    22                 if(fr != null) {
    23                     fr.close();
    24                 }
    25             }catch(IOException e){
    26                 sop(e.toString());
    27             }
    28         }
    29 
    30     }
    31     public static void sop(Object obj){
    32         System.out.println(obj);
    33     }
    34 }

      这种方法是利用一个数组(这个数组大小一般定义为1024的整数倍),将文件中的数据传入到一个数组中,然后将数组中的数据一次性的处理。显而易见这种方法更好。

      文件打开是需要关闭的,通过close方法。

      2.字符的写(FileWriter)

      首先请看下面一段代码

     1 import java.io.*;
     2 
     3 public class FileWriterDemo {
     4     public static void main(String[] args){
     5         fileWriter();
     6 
     7     }
     8     public static void fileWriter(){
     9         FileWriter fw = null;
    10         try {
    11             fw = new FileWriter("1.txt");
    12 
    13             fw.write("asdsadasdafd");
    14             fw.flush();
    15 
    16             fw.append("
    "+123);
    17             fw.flush();
    18 
    19         }catch(IOException e){
    20             sop(e.toString());
    21         }finally{
    22             try{
    23                 if(fw != null) {
    24                     fw.close();
    25                 }
    26             }catch(IOException e){
    27                 sop(e.toString());
    28             }
    29         }
    30     }
    31     public static void sop(Object obj){
    32         System.out.println(obj);
    33     }
    34 }

      首先对象的创立,有多个构造函数。这里我介绍两种,FileWriter(String fileName)和FileWriter(String fileName, boolean append)。在第二个构造函数中有一个布尔型参数,为false就和第一个构造函数一样,每次向目的地中写入数据时都会覆盖原来的数据,若不想覆盖原来的数据,可以使用append方法;为true时,就不会覆盖原来的数据,而是在原数据后面追加数据。

      文件的写入是通过一个缓冲区(为了解决cpu和硬盘速度并不匹配的问题),因此在写入一段数据后,要通过flush方法刷新缓冲区,将数据送到目的地中(文件)。最后通过close方法关闭资源,在关闭之前也会刷新缓冲区。每次向目的地写入数据时,都会检测是否有目的文件,若没有则创建一个。

      为提高数据的读写效率,Java中提供了缓冲技术,对原来的FileWriter与FileReader进行修饰,其中涉及到了修饰设计模式,这里就不具体讲解。下面就对缓冲技术进行讲解。

      3.修饰后的写(BufferedWriter)

      我们还是来看看具体代码

     1 import java.io.*;
     2 
     3 public class BufferedWriterDemo {
     4     public static void main(String[] args){
     5         //创建一个字符写入流对象
     6         FileWriter fw = null;
     7         BufferedWriter bw = null;
     8         try{
     9             fw = new FileWriter("2.txt", true);
    10             //为提高字符写入的流效率,加入了缓冲技术。
    11             //只要将需要提高效率的流对象作为参数传递给缓冲区的构造函数
    12             bw = new BufferedWriter(fw);
    13             for(int i=0; i<5; i++) {
    14                 bw.write("sdadadas"+i);
    15                 bw.newLine();
    16             }
    17             //记住,只要用到缓冲区就要刷新
    18             bw.flush();
    19 
    20         }catch(IOException e){
    21             sop(e.toString());
    22 
    23         }finally {
    24             try{
    25                 //其实关闭缓冲区,就是在关闭与缓冲区关联的流对象
    26                 bw.close();
    27             }catch(IOException e){
    28                 sop(e.toString());
    29             }
    30         }
    31 
    32 
    33     }
    34     private static void sop(Object obj){
    35         System.out.println(obj);
    36     }
    37 }

      这一段知识尽在代码与注释中。其中有一个newLine方法,让我们看看1.8api中解释(写一行行分隔符。 行分隔符字符串由系统属性line.separator定义,并不一定是单个换行符(' n')字符)。在不同系统中,换行符都不同。而使用了这个方法后,同样的代码不会在不同的系统中出现乱码的问题。

      最后的close方法,有一个疑问(到底是使用流对象的close方法还是使用缓冲技术的close方法呢),首先我们回到一开始,缓冲技术是用来修饰流操作的,必然他们操作的是流。因此使用其中任何一个close方法都会关闭这个流资源。

      4.修饰后的读(BufferedReader)

      请看下一段代码

     1 import java.io.*;
     2 
     3 public class BufferedReaderDemo {
     4     public static void main(String[] args){
     5         FileReader fr = null;
     6         BufferedReader br = null;
     7         try{
     8             //创建一个读取流对象并与文件关联
     9             fr = new FileReader("2.txt");
    10             //为了提高效率,加入了缓冲区技术。将字符读取流对象作为参数传入到缓冲对象的构造函数
    11             br = new BufferedReader(fr);
    12 
    13             String line = null;
    14             while((line = br.readLine()) != null){
    15                 sop(line);
    16             }
    17 
    18         }catch(FileNotFoundException e){
    19             sop(e.toString());
    20         }catch(IOException e){
    21             sop(e.toString());
    22         }finally {
    23             try{
    24                 if(br != null){
    25                     br.close();
    26                 }
    27             }catch(IOException e){
    28                 sop(e.toString());
    29             }
    30         }
    31     }
    32 
    33     private static void sop(Object obj){
    34         System.out.println(obj);
    35     }
    36 }

      

      这段知识的原理和上一段的知识类似,就不做具体的解释了。就说说其中的readLine方法,我们来看看api文档,public String readLine(),(读一行文字。 一行被视为由换行符(' n'),回车符(' r')中的任何一个或随后的换行符终止),也就是说把文件中的一行数据读取出来。

      我们总结一下字符的体系

     1 /**
     2  * 读:
     3  *      Reader
     4  *          |--FileReader(两种读的方法,资源的关闭)
     5  *          |--BufferedReader(修饰设计模式,高效的处理方式,readLine方法,close方法关闭资源)
     6  *
     7  * 写:
     8  *      Writer
     9  *          |--FileWriter(两种构造方法,write方法与append方法,)
    10  *          |--BufferedWriter(修饰设计模式,高效的处理方式,newLine方法,close方法关闭资源)
    11  *
    12  *
    13  * */

      今天只讲解了字符的操作,关于字节的操作和其他IO的基础知识,在后面会相应的推出。

    ---恢复内容结束---

  • 相关阅读:
    C++17 filesystem文件系统
    简易版本vue的实现
    javaSE基础04
    javaSE基础03
    javaSE基础02
    JavaSE基础01
    Document对象和window对象
    进程和子进程及端口的常用命令
    vue分页组件二次封装---每页请求特定数据
    css图片垂直水平居中及放大(实现水平垂直居中的效果有哪些方法?)
  • 原文地址:https://www.cnblogs.com/dx520/p/10303104.html
Copyright © 2011-2022 走看看