• Java进阶篇(五)——Java的I/O技术


      程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们。Java的I/O技术可以将数据保存到文本文件、二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求。

      本篇我们要介绍的内容就是Java的I/O技术,即输入/输出。

    一、输入/输出流

      流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流。

      而专门负责各种方式的输入、输出的类,都被放在java.io包中。所有输入流都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。

      1. 字节输入/输出流

      下面是一个字节输入/输出流的实例。其中,第14行为从输入流中读取字节并存入buffer数组中,最长读取2500个字节,返回值b为实际读取的长度。

     1 import java.io.File;  
     2 import java.io.FileInputStream;  
     3 import java.io.FileOutputStream;  
     4   
     5 public class IOExample {  
     6     public static void main(String[] args) {  
     7         try {  
     8             int b;  
     9             File file = new File("E:\test.txt");      // 创建一个文件
    10            
    11             FileInputStream readfile = new FileInputStream(file);   // 创建输入流     
    12 
    13             byte buffer[] = new byte[2500];        // 创建字节数组  
    14             b = readfile.read(buffer, 1, 2000);    // 1为buffer数组中的起始偏移量  
    15             String str = new String(buffer, 0, b, "Default");  
    16             System.out.println(str);  
    17             readfile.close();     // 关闭流  
    18 
    19             FileOutputStream writefile = new FileOutputStream(file, true);      // 创建一个输出流,true为保留原有数据,新数据追加至结尾
    20             writefile.write(buffer, 0, b);  
    21             writefile.close();  
    22         } catch (Exception e) {  
    23             e.printStackTrace();  
    24         }  
    25     }  
    26 }      

       上述代码中的FileInputStream类和FileOutputStream类属于文件输入输出流,该类分别继承自InputStream类和OutputStream类。

      InputStream类常用方法需了解read()、close()、reset()等方法;OutputStream类常用方法需了解write()、flush()、close()等方法。具体可参照API。

      2. 字符输入/输出流

      下面是一个字符输入/输出流的实例。

     1 import java.io.FileReader;  
     2 import java.io.FileWriter;  
     3   
     4 public class IOExample {  
     5     public static void main(String[] args) {  
     6         try {  
     7             FileReader fileread = new FileReader("E:\test.txt");                    // 字符输入流,读取文件信息    
     8 
     9             char[] cbuf = new char[500];  
    10             int b = fileread.read(cbuf, 0, 500);  
    11             System.out.println(String.valueOf(cbuf));  
    12             fileread.close();  
    13 
    14             FileWriter filewriter = new FileWriter("E:\test.txt", true);             // 字符输出流,向输出流中写入信息,并且保留原有数据,追加数据值末尾处 
    15             filewriter.write(cbuf);  
    16             filewriter.close();  
    17         } catch (Exception e) {  
    18             e.printStackTrace();  
    19         }  
    20     }  
    21 }  

      上述代码中的FileReader类和FileWriter类也属于文件输入输出流。

      3. 文件输入/输出流

      上面的代码中出现了一个新的名词叫文件输入/输出流,也就是FileInputStream、FileOutputStream和FileReader、FileWriter。它们的作用是与指定的文件建立连接,将需要的数据永久保存到文件中。

      FileInputStream类和FileOutputStream类都是用来操作磁盘文件的,如果用户的文件读取比较简单,则可使用该类。但由于汉字在文件中占用两个字节,读取不好可能出现乱码现象。

      FileReader类和FileWriter类可避免乱码现象,分别对应了FileInputStream类和FileOutputStream类。

    二、File类

      File类是io包中唯一代表磁盘文件本身的对象,可以通过调用File类中的方法,实现创建、删除、重命名文件等。

      1. 文件的创建与删除

      可以使用File类创建一个文件对象,三种构造方法的语法格式如下:

    new File(String pathname)
    new File(String parent, String child)
    new File(File f, String child)

       pathname是路径名称,parent是父路径字符串,child是子路径字符串,f是父路径对象。如下例:

    File file = new File("E:/test.txt");
    File file = new File("E:/myword","word.txt");

      如果E:/myword目录下没有名称为word的文件,File类对象可通过createNewFile()方法创建一个名称为word.txt的文件;如果存在,可通过delete()方法将其删除。

      2. 获取文件信息

      File类提供了许多方法用于获取文件本身的一些信息,下表是一些常用方法。

    方法 说明
    getName() 获取文件的名称
    canRead() 判断文件是否可读
    canWrite() 判断文件是否可以被写入
    exist() 判断文件是否存在
    length() 获取文件的长度
    getAbsolutePath() 获取文件的绝对路径
    getParent() 获取文件的父路径
    isFile() 判断文件是否存在
    isDirectory() 判断文件是否是一个目录
    isHidden() 判断文件是否是隐藏文件
    lastModifed() 获取文件最后修改时间

      如我们创建一个文件,获取文件长度等信息如下:

     1 import java.io.File;
     2 
     3 public class FileTest {
     4 
     5     public static void main(String[] args) {
     6         File file = new File("E:/myword", "word.txt");    // 创建文件对象
     7         if(file.exists()) {    // 判断文件是否存在
     8             String name = file.getName();    // 获取文件名称
     9             long length = file.length();    // 获取文件长度
    10             boolean hidden = file.isHidden();    // 判断文件是否是隐藏文件
    11             
    12             System.out.println("文件名称:" + name);
    13             System.out.println("文件长度是:" + length);
    14             System.out.println("是否是隐藏文件:" + hidden);
    15         } else {
    16             System.out.println("文件不存在");
    17         }
    18     }
    19 
    20 }

    三、带缓存的输入/输出流

      缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区。

      1. BufferedInputStream类与BufferedOutputStream类

      构造函数如下:

    BufferedInputStream(InputStream in)
    BufferedInputStream(InputStream in, int size)
    BufferedOutputStream(OutputStream in)
    BufferedOutputStream(OutputStream in, int size)

      2. BufferedReader类与BufferedWriter类

      常用方法如下:

    方法 说明
    read() 读取单个字符
    readLine() 读取一个文本行,返回为字符串;若无数据则返回为null
    write(String s, int off, int len) 写入字符串的某一部分
    flush() 刷新该流的缓存
    newLine() 写入一个行分隔符

      这里要注意,在使用BufferedWriter类的write()方法时,数据并没有立刻被写入到输出流时,而是首先进入缓存区中,如果想立刻将缓冲区中的数据写入输出流中,一定要调用flush()方法。 

    四、数据输入/输出流

      数据输入/输出流为DataInputStream类与DateOutputStream类,允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型。

      构造方法如下:

    DataInputStream(InputStream in)
    DataOutputStream(OutputStream out)

      DataOutputStream类提供了以下三种写入字符串的方法:

    writeBytes(String s)
    writeChars(String s)
    writeUTF(String s)

    五、ZIP压缩输入/输出流

      利用ZipOutputStream类对象,可将文件压缩为.zip文件。

      构造函数如下:

    ZipOutputStream(OutputStream out);

      ZipInputStream类可读取ZIP压缩格式的文件,包括对已压缩和未压缩条目的支持。

      构造函数如下:

    ZipInputStream(InputStream out);
  • 相关阅读:
    linxu 网络管理
    Linux 命令2
    crontab命令
    Linux 命令
    Linux 命令
    Git命令
    GIT
    Python 修改文件内容
    logging模块
    CSS 选择器
  • 原文地址:https://www.cnblogs.com/adamjwh/p/8379903.html
Copyright © 2020-2023  润新知