Java中使用IO函数进行输入和输出的10个技巧
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();
