欢迎访问宙启技术站
智能推送

Java中的IO操作函数和类

发布时间:2023-05-23 04:08:35

Java中的IO(输入输出)操作函数和类是用于数据读取和写入的重要工具。Java IO有着广泛的应用,可以用于文件读写、网络通信、数据库访问等多种场合。本文将介绍Java中常用的IO类和函数,以及它们的用法和特点。

1. I/O流

在Java中,I/O流是一个常用的概念,流是数据在程序中传输的一种方式,可以理解为将数据分段传输。Java中的I/O流包括两种类型:字节流和字符流。字节流传输的是二进制数据,而字符流传输的是Unicode编码的字符序列。其中,字节流和字符流都是基于输入流和输出流构建的,输入流用于读取数据,输出流用于写入数据。

2. File类

Java中的File类提供了对文件系统的访问,它可以用于创建、删除、查找文件等操作。下面是一些常见的File类的方法:

- File(String path): 创建一个File对象,指定文件路径。

- exists(): 判断文件是否存在。

- isDirectory(): 判断是否为目录。

- isFile(): 判断是否为文件。

- getParent(): 获取父目录路径。

- list(): 获取该目录下的子文件名数组。

3. 文件读写操作

在Java中,可以使用FileInputStream和FileOutputStream类进行文件读写操作。

- FileInputStream:用于打开一个文件来进行读取操作。

- FileOutputStream:用于打开一个文件来进行写入操作。

- read():从输入流中读取一个字节数据。

- write():写入一个字节数据到输出流中。

例如,下面的代码可以读取一个文本文件的所有内容:

import java.io.File;
import java.io.FileInputStream;

public class ReadFileDemo {
    
    public static void main(String[] args) {
        
        try {
            File file = new File("file.txt");
            FileInputStream fis = new FileInputStream(file);

            int content;
            while ((content = fis.read()) != -1) {
                System.out.print((char) content);
            }
            
            fis.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. BufferedReader和BufferedWriter

如果需要读取文本文件,可以使用BufferedReader类来提高读取效率,该类继承自Reader类。BufferedReader类的readLine()方法可以读取一行文本内容。

例如,下面的代码可以读取一个文本文件的所有内容:

import java.io.BufferedReader;
import java.io.FileReader;

public class ReadFileDemo {
    
    public static void main(String[] args) {
        
        try {
            FileReader fr = new FileReader("file.txt");
            BufferedReader br = new BufferedReader(fr);

            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            
            br.close();
            fr.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果需要写入文本文件,也可以使用BufferedWriter类来提高写入效率,该类继承自Writer类。

例如, 下面是将String写入文件的示例代码:

import java.io.BufferedWriter;
import java.io.FileWriter;

public class WriteFileDemo {
    
    public static void main(String[] args) {
        
        try {
            FileWriter fw = new FileWriter("file.txt");
            BufferedWriter bw = new BufferedWriter(fw);

            String content = "hello world";
            bw.write(content);
            
            bw.close();
            fw.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5. ByteArrayInputStream和ByteArrayOutputStream

Java中的ByteArrayInputStream和ByteArrayOutputStream类可以在内存中操作字节流,也就是说,不需要访问文件系统就可以进行数据的读写操作。

ByteArrayInputStream类可以将一个字节数组包装为一个输入流对象,从而可以对其进行数据读取操作。

例如,下面的代码演示了如何使用ByteArrayInputStream类读取一个字节数组中的数据:

import java.io.ByteArrayInputStream;

public class ByteArrayInputStreamDemo {
    
    public static void main(String[] args) {
        
        byte[] buffer = {'a', 'b', 'c', 'd', 'e'};
        ByteArrayInputStream bis = new ByteArrayInputStream(buffer);

        int content;
        while ((content = bis.read()) != -1) {
            System.out.print((char) content);
        }
        
        bis.close();
    }
}

ByteArrayOutputStream类可以将一个字节数组包装为一个输出流对象,从而可以对其进行数据写入操作。

例如,下面的代码演示如何使用ByteArrayOutputStream类写入一些数据到一个字节数组中:

import java.io.ByteArrayOutputStream;

public class ByteArrayOutputStreamDemo {
    
    public static void main(String[] args) {
        
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        String content = "hello world";
        byte[] buffer = content.getBytes();

        try {
            bos.write(buffer);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // toByteArray() 将流中的所有内容转换为字节数组
        byte[] result = bos.toByteArray();
        System.out.println(new String(result));
        
        bos.close();
    }
}

6. ObjectInputStream和ObjectOutputStream

ObjectInputStream和ObjectOutputStream类可以用于序列化和反序列化Java对象。序列化是指将对象转化为字节流,而反序列化则是将字节流转化为Java对象。

例如,下面的代码是将一个Java对象进行序列化并写入到文件中:

import java.io.*;

public class ObjectOutputStreamDemo {
    
    public static void main(String[] args) {
        
        try {
            Student student = new Student("tom", 18, "male");
            FileOutputStream fos = new FileOutputStream("file.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            oos.writeObject(student);
            
            oos.close();
            fos.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Student implements Serializable {
    
    private String name;
    private Integer age;
    private String gender;
    
    public Student(String name, Integer age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    
    // 省略 getter 和 setter 方法
}

如果需要将文件中的字节流反序列化成Java对象,可以使用ObjectInputStream类。

例如,下面的代码是从文件中读取一个Java对象并反序列化:

import java.io.*;

public class ObjectOutputStreamDemo {
    
    public static void main(String[] args) {
        
        try {
            FileInputStream fis = new FileInputStream("file.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);

            Student student = (Student) ois.readObject();
            System.out.println(student.getName());
            
            ois.close();
            fis.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

7. NIO(New Input/Output)

NIO是Java1.4版本引入的新IO库,它提供了一种新的IO模型,可以提高IO效率。NIO采用通道(Channel)和缓冲区(Buffer)的模式来进行数据的传输。通道是传输数据的路径,而缓冲区是数据传输时的容器。

下面是NIO中一些常用的类:

- FileChannel:用于读取、写入、映射和操作文件的通道。

- SocketChannel:用于读取和写入网络Socket数据的通道。

- ByteBuffer:用于从通道中读取或写入字节的缓冲区。

例如,下面的代码演示了如何使用FileChannel读取文件内容:

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelDemo {
    
    public static void main(String[] args) {
        
        try {
            RandomAccessFile file = new RandomAccessFile("file.txt", "rw");
            FileChannel channel = file.getChannel();
            ByteBuffer buffer = ByteBuffer.allocate(1024);

            int bytesRead = channel.read(buffer);
            while (bytesRead != -1) {
                buffer.flip();

                while (buffer.hasRemaining()) {
                    System.out.print((char) buffer.get());
                }

                buffer.clear();
                bytesRead = channel.read(buffer);
            }

            file.close();
            channel.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上就是Java IO操作函数和类的一些介绍,这些类和函数可以帮助