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

Java中使用IO函数进行输入和输出的10个技巧

发布时间:2023-06-16 14:52:27

1. 使用try-with-resources

在使用IO函数进行输入和输出的时候,经常会出现文件资源关闭不彻底,或者忘记关闭文件资源的情况。为了避免这种情况的发生,我们可以使用Java7引入的try-with-resources语句,对资源的关闭进行自动处理,避免资源泄漏。

例如:

try (FileInputStream fis = new FileInputStream("input.txt");

     FileOutputStream fos = new FileOutputStream("output.txt")) {

    // 进行文件读取和写入操作

} catch (IOException e) {

    e.printStackTrace();

}

2. 使用BufferedReader和BufferedWriter

在进行文件操作的时候,使用BufferedReader和BufferedWriter可以提高程序的效率。BufferedReader和BufferedWriter是套在其他字符输入输出流上的一种缓存流,通过缓存技术减少了频繁的读写磁盘的次数,提高了文件的读写效率。

例如:

try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));

     BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {

    String line;

    while ((line = br.readLine()) != null) {

        bw.write(line);

        bw.newLine();

    }

} catch (IOException e) {

    e.printStackTrace();

}

3. 使用Scanner读取输入

在进行控制台输入时,可以使用Scanner类读取输入,避免使用System.in进行输入操作。Scanner类可以方便地读取控制台输入的各种类型数据,例如整数、浮点数、字符串等。

例如:

Scanner scanner = new Scanner(System.in);

System.out.print("请输入一个整数:");

int num = scanner.nextInt();

System.out.println("您输入的整数为:" + num);

4. 使用File类进行文件操作

在进行文件操作时,可以使用File类来操作文件和目录。File类提供了创建、删除、重命名、判断文件是否存在、获取文件大小等基本操作,能够满足大部分的文件操作需求。

例如:

File file = new File("input.txt");

if (file.exists()) {

    System.out.println("文件已存在,大小为:" + file.length());

} else {

    System.out.println("文件不存在");

}

5. 使用PrintWriter进行输出

在进行输出操作时,可以使用PrintWriter类进行输出。PrintWriter类具有自动刷新输出缓冲区的功能,可以避免因为程序异常而导致输出内容不完整的情况。

例如:

PrintWriter pw = new PrintWriter("output.txt");

pw.println("Hello, world!");

pw.close();

6. 使用ByteArrayInputStream和ByteArrayOutputStream

在进行字节流操作时,可以使用ByteArrayInputStream和ByteArrayOutputStream类。ByteArrayInputStream类可以将byte数组作为输入流,ByteArrayOutputStream类可以将byte数组作为输出流。可以用于在内存中对数据进行读写操作,避免频繁地进行文件操作。

例如:

byte[] bytes = "Hello, world!".getBytes();

ByteArrayInputStream bis = new ByteArrayInputStream(bytes);

ByteArrayOutputStream bos = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len;

while ((len = bis.read(buffer)) != -1) {

    bos.write(buffer, 0, len);

}

System.out.println(new String(bos.toByteArray()));

7. 使用ObjectInputStream和ObjectOutputStream

在进行对象序列化和反序列化时,可以使用ObjectInputStream和ObjectOutputStream类。可以将Java对象转换成二进制流进行存储和传输,也可以将二进制流转换成Java对象进行使用。

例如:

Person person = new Person("张三", 18);

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("output.dat"));

oos.writeObject(person);

oos.close();

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("output.dat"));

Person person1 = (Person) ois.readObject();

ois.close();

System.out.println(person1.getName() + "," + person1.getAge());

8. 避免使用DataInputStream和DataOutputStream

在进行数据的读写操作时,应避免使用DataInputStream和DataOutputStream类。这两个类仅仅是对InputStream和OutputStream进行了包装,添加了一些读写数据的方法,但是这些读写方法的数据格式是固定的,不能够灵活地读写各种类型的数据。建议使用ObjectInputStream和ObjectOutputStream类进行数据的序列化和反序列化操作。

9. 注意处理异常

在进行IO操作时,必须要考虑到异常的处理。IOException是一个常见的异常类型,代表着出现了读写错误、文件不存在、文件权限等问题。在使用IO函数时,必须对可能发生的异常进行处理,避免导致程序运行出现不可预料的错误。

例如:

try (FileInputStream fis = new FileInputStream("input.txt")) {

    // 进行文件读取操作

} catch (FileNotFoundException e) {

    System.out.println("文件不存在");

} catch (IOException e) {

    e.printStackTrace();

}

10. 使用NIO进行高性能IO操作

在进行高性能IO操作时,可以使用Java的NIO(New IO)包进行操作。NIO包提供了一种基于通道(Channel)和缓冲区(Buffer)的新IO方式,能够更快地进行IO操作,比传统的IO方式更高效。

例如:

FileChannel inChannel = new FileInputStream("input.txt").getChannel();

FileChannel outChannel = new FileOutputStream("output.txt").getChannel();

ByteBuffer buffer = ByteBuffer.allocate(1024);

while (inChannel.read(buffer) != -1) {

    buffer.flip();

    outChannel.write(buffer);

    buffer.clear();

}

inChannel.close();

outChannel.close();