IO流

IO流用来处理设备之间的数据传输,Java程序中,对于数据的输入/输出操作 都是以“流”的方式进行的。java.io包下提供了各种“流”类的接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

一、File类

1、文件的创建与删除

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

new File(String pathname)        //pathname是路径名称
new File(String parent, String child)   //parent是父路径字符串,
new File(File f, String child)     //f是父路径对象,child是子路径字符串

例:

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

如果不存在文件,File类对象可通过createNewFile()方法创建的文件;如果存在文件,可通过delete()方法将其删除。

2、获取文件信息

常用的方法:

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

例:

public class Demo04File {
    public static void main(String[] args) {
        File file = new File("E:/myword", "word.txt");   // 创建文件对象
        if(file.exists()) {    // 判断文件是否存在
            String name = file.getName();    // 获取文件名称
            long length = file.length();    // 获取文件长度
            boolean hidden = file.isHidden();    // 判断文件是否是隐藏文件

            System.out.println("文件名称:" + name);
            System.out.println("文件长度是:" + length);
            System.out.println("是否是隐藏文件:" + hidden);
        } else {
            System.out.println("文件不存在");
        }
    }

}

二、输入/输出流

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

  • 而专门负责各种方式的输入、输出的类,都被放在java.io包中。

  • 所有输入流都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;

  • 所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。

如图所示:

21:IO流_输出流

21:IO流_字符串_02

1、字节输入/输出流

所有字节输入/输出流的分别都是InputStream(输入流)以及OutputStream(输出流)的抽象类。其中InputStream负责读取数据;OutputStream负责写入数据

代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Demo01 {
    public static void main(String[] args) {
        File file = new File("E:\\test.txt");                    //创建文件对象
        try {                                                    //捕捉异常
            FileOutputStream out = new FileOutputStream(file);   //创建FileOutputStream对象
            byte[] buy = "你好,java".getBytes();                 //创建byte型数组
            out.write(buy);                                      //将数组的信息写入到文件中
            out.close();                                         //将输出流关闭
        } catch (Exception e) {                                  //catch语句处理异常信息
            e.printStackTrace();                                 //输出异常信息
        }
        try {
            FileInputStream in = new FileInputStream(file);     //创建FileInputStream对象
            byte byt[] = new byte[1024];                        //创建byte型数组
            int len = in.read(byt);                             //从文件中读取信息
            String str = new String(byt,0,len);                 //创建str对象获取文件信息
            System.out.println("文件信息是:" + str);             //输出文件信息
            in.close();                                         //关闭输入流
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

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

2、字符输入/输出流

所有字节输入/输出流的分别都是Reader(输入流)类以及Writer(输出流)类的抽象类。其中Reader负责读取数据;Writer负责写入数据

代码如下:

import java.io.*;

public class Demo02 {
    public static void main(String[] args) {
        File file = new File("E:\\test.txt");            //创建文件对象
        try{                                                      //抛出异常
            FileWriter fileWriter = new FileWriter(file);         //创建字符输出流对象fileWriter
            String cr = "我想学Java";
            fileWriter.write(cr);                                //向文件写入信息
            fileWriter.close();                                  //关闭输出流
        }catch (Exception e){
            e.printStackTrace();
        }
        try {
            FileReader fileReader = new FileReader(file);       //创建字符输入流对象fileReader
            char[] ca = new char[1024];                         //创建byte型数组
            int len = fileReader.read(ca);                      //从文件中读取信息,获取长度
            String str = new String(ca,0,len);            //创建str对象获取文件信息,获取内容
            System.out.println(str);                            //输出文件信息
            fileReader.close();                                 //关闭输入流
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

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

缓存是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() 写入一个行分隔符

例:

import java.io.*;

public class Demo03 {
    public static void main(String[] args) {
        String content[] = {"你好!","再见"};
        File file = new File("E:\\test.txt");   //创建文件对象
        try {
            FileWriter fileWriter = new FileWriter(file);      //创建FileWriter对象
            BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);  //创建BufferedWriter类对象
            for (int i = 0; i < content.length; i++) {        //循环遍历数组
                bufferedWriter.write(content[i]);             //将字符串数组中的元素写入到磁盘文件中
                bufferedWriter.newLine();                     //将数组中的单个元素以单行的形式写入文件
            }
            bufferedWriter.close();                          //关闭BufferedWriter流
            fileWriter.close();                              //关闭FileWriter流
        }catch (Exception e){                                //异常处理
            e.printStackTrace();
        }
        try {
            FileReader fileReader = new FileReader(file);         //创建FileReader对象
            BufferedReader bufferedReader = new BufferedReader(fileReader);  //创建BufferedReader类对象
            String str = null;                                 //创建字符串对象
            int i = 0;                                         //声明int变量
            //如果文件的文本行数不为null,则进入循环
            while ((str = bufferedReader.readLine()) != null){
                i++;                                           //做自增运算
                System.out.println("第" + i + "行" + str);      //输出文件数据
            }
            bufferedReader.close();                            //关闭BufferedReader流
            fileReader.close();                                //关闭FileReader流
        }catch (Exception e){                                //异常处理
            e.printStackTrace();
        }
    }
}

运行结果:

第1行你好!
第2行再见

注意:在使用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);