您的位置:

Java IO流概述

输入/输出(Input/Output)是计算机系统中非常基础的一部分,用于从计算机的外部读取数据或将数据写出到计算机的外部。在Java中,I/O操作被封装在Java IO流中。Java IO流提供了非常灵活的方法来操作各种类型的数据,包括文件、网络连接、内存和其他设备等。

一、Java IO流类型

在Java中,IO流可以分为两种类型:字节流和字符流。字节流主要用于读写二进制文件,如图片和视频等;字符流主要用于读写纯文本文件,如TXT文件等。

1、字节流

字节流是IO操作的基础,在Java中,字节流主要有两个抽象类:InputStream和OutputStream。InputStream是用于读取数据的抽象类,而OutputStream则是用于写出数据的抽象类。

//读取文件并输出文件内容
public void readFile(String fileName) throws IOException{
    FileInputStream fis = new FileInputStream(fileName);
    byte[] buffer = new byte[1024];
    int len = 0;
    while((len = fis.read(buffer)) != -1){
        System.out.println(new String(buffer,0,len));
    }
    fis.close();
}

//将数据写入到指定文件
public void writeFile(String fileName,String content) throws IOException{
    FileOutputStream fos = new FileOutputStream(fileName);
    fos.write(content.getBytes());
    fos.close();
}

2、字符流

字符流是针对纯文本文件进行操作的IO流。在Java中,字符流主要有两个抽象类:Reader和Writer。Reader是用于读取数据的抽象类,而Writer则是用于写出数据的抽象类。

//读取文件并输出文件内容
public void readFile(String fileName) throws IOException{
    FileReader fr = new FileReader(fileName);
    char[] buffer = new char[1024];
    int len = 0;
    while((len = fr.read(buffer)) != -1){
        System.out.println(new String(buffer,0,len));
    }
    fr.close();
}

//将数据写入到指定文件
public void writeFile(String fileName,String content) throws IOException{
    FileWriter fw = new FileWriter(fileName);
    fw.write(content);
    fw.close();
}

二、Java IO流的读写方式

Java IO流提供了多种读写方式,我们可以根据需要来选择适合的方式进行读写。下面将介绍Java IO流的常用读写方式。

1、字节流的读写方式

字节流提供了多种读写方式,其中常用的有FileInputStream和FileOutputStream。这两个类可以分别向文件中读写字节流。

//使用FileInputStream读取文件内容并输出
public void readFile(String fileName) throws IOException{
    FileInputStream fis = new FileInputStream(fileName);
    byte[] buffer = new byte[fis.available()];
    fis.read(buffer);
    System.out.println(new String(buffer));
    fis.close();
}

//使用FileOutputStream写出文件内容到指定文件中
public void writeFile(String fileName,String content) throws IOException{
    FileOutputStream fos = new FileOutputStream(fileName);
    fos.write(content.getBytes());
    fos.close();
}

2、字符流的读写方式

字符流提供了多种读写方式,常用的有FileReader和FileWriter。这两个类可以分别向文件中读写字符流。

//使用FileReader读取文件内容并输出
public void readFile(String fileName) throws IOException{
    FileReader fr = new FileReader(fileName);
    char[] buffer = new char[fr.read()];
    fr.read(buffer);
    System.out.println(new String(buffer));
    fr.close();
}

//使用FileWriter写出文件内容到指定文件中
public void writeFile(String fileName,String content) throws IOException{
    FileWriter fw = new FileWriter(fileName);
    fw.write(content);
    fw.close();
}

三、Java IO流的性能优化

在Java中,IO操作是非常耗时的一个过程。为了提高IO操作的效率,我们可以使用缓冲区或者NIO来进行优化。

1、缓冲区的使用

使用缓冲区可以大大提高读写效率,在Java中,InputStream和OutputStream都提供了BufferedReader和BufferedWriter用于缓冲读写。

//使用BufferedReader读取文件内容并输出
public void readFile(String fileName) throws IOException{
    BufferedReader br = new BufferedReader(new FileReader(fileName));
    String line = null;
    while((line = br.readLine()) != null){
        System.out.println(line);
    }
    br.close();
}

//使用BufferedWriter写出文件内容到指定文件中
public void writeFile(String fileName,String content) throws IOException{
    BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
    bw.write(content);
    bw.close();
}

2、NIO的使用

NIO(Non-blocking IO)是Java 1.4引入的新特性,主要用于对IO操作进行优化。在NIO中,使用通道(Channel)来读写数据。

//使用NIO读取文件内容并输出
public void readFile(String fileName) throws IOException{
    RandomAccessFile raf = new RandomAccessFile(fileName,"rw");
    FileChannel channel = raf.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    while(channel.read(buffer) > 0){
        buffer.flip();
        System.out.println(new String(buffer.array()));
        buffer.clear();
    }
    channel.close();
}

//使用NIO写出文件内容到指定文件中
public void writeFile(String fileName,String content) throws IOException{
    RandomAccessFile raf = new RandomAccessFile(fileName,"rw");
    FileChannel channel = raf.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    buffer.put(content.getBytes());
    buffer.flip();
    channel.write(buffer);
    channel.close();
}

四、Java IO流的异常处理

在进行IO操作的时候,可能会出现各种异常,例如文件不存在、没有读写权限等。为了确保程序的稳定性,在进行IO操作的时候一定要进行异常处理。

//读取文件内容并输出
public void readFile(String fileName) throws IOException{
    BufferedReader br = null;
    try{
        br = new BufferedReader(new FileReader(fileName));
        String line = null;
        while((line = br.readLine()) != null){
            System.out.println(line);
        }
        br.close();
    }catch(FileNotFoundException e){
        System.out.println("文件不存在!");
    }catch(IOException e){
        System.out.println("读取文件出错!");
    }finally{
        if(br != null){
            br.close();
        }
    }
}

//将数据写入到指定文件
public void writeFile(String fileName,String content) throws IOException{
    BufferedWriter bw = null;
    try{
        bw = new BufferedWriter(new FileWriter(fileName));
        bw.write(content);
        bw.close();
    }catch(FileNotFoundException e){
        System.out.println("文件不存在!");
    }catch(IOException e){
        System.out.println("写出文件出错!");
    }finally{
        if(bw != null){
            bw.close();
        }
    }
}

总结

Java IO流提供了多种读写方式,并且还有缓冲区和NIO等优化方式来提高IO操作的效率。在进行IO操作的时候一定要进行异常处理,确保程序的稳定性。