Java I/O 操作整理_相对路径



概述

Java IO是一套Java 用来读写数据(输入和输出)的API,大部分程序都需要处理一些输入,并由输入产生一些输出(PS: 输入和输出是相对CPU而言的,input 就是从外面到CPU,output就是从CPU到外面,CPU是主人公)。java.io 包下有大约80多个类,大概可以分成四组:


  1. 基于字节操作的I/O接口: InputStream和OutputStream


基于字符操作的I/O接口:Writer和Reader

基于磁盘操作的I/O接口:File

基于网络操作的I/O接口:Socket
java.io 包下的类如下:

Java I/O 操作整理_类图_02

File类

Java IO API中的File类可以让你访问底层文件系统,通过File类。你可以做到如下几点:

1. 检测文件是否存在 (file.exists())

2.读取文件长度 (file.length())

3.重命名或者移动文件(file.renameTo(new File("c:\data\new-file.txt"));)

4.删除文件(file.delete())

5.检测某个路径是文件还是目录。(file.isDirectory())

6.读取目录中的文件列表。(String[] fileNames = file.list())

PS: 在项目中用相对路径读取文件

运用相对路径读取文件,其实就是要找到Java编译(class 文件所在的目录)后的存放目录,然后在该目录下找文件。读取方法有如下两种。

1public class RelativePath {
2 public static void main(String[] args) {
3// 方法一
4 String fileName = ReaderTest.class.getResource("/inputTest.txt").getFile();
5 System.out.println("*****方法一相对路径读取到的文件地址:"+fileName);
6// 方法二
7 String fileName1 = Thread.currentThread().getContextClassLoader().getResource("inputTest.txt").getFile();
8 System.out.println("*****方法二相对路径读取到的文件地址:"+fileName1);
9 }
10}

运行结果:

Java I/O 操作整理_类图_03enter description here

输入和输出

输入流 用来表示那些从不同数据源产生输入的类。这些数据源包括:

1.字节数组

2.String 对象

3.文件

4.“管道”,工作方式与实际管道类似,即,从一端输入,从另一端输出

5.一个由其他种类的流组成的序列,以便我们可以将它们收集合并到一个流内

输出流: 决定输出所要去往的目标,目标包括:


  1. 字节数组
  2. 文件
  3. 管道

基于字节操作的I/O接口: InputStream和OutputStream

InputStream 的类图

Java I/O 操作整理_类图_04enter description here


运用InputStream的实现类读取文件

  1. 方法1️⃣
 1    /**
2 * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
3 * 当然也是可以读字符串的。
4 *
5 * @param fileName
6 */
7 public static void readString1(String fileName) throws IOException {
8// FileInputStream 用于读取诸如图像数据之类的原始字节流,读取字符流,请使用FileReader
9 InputStream is = new FileInputStream(fileName);
10 StringBuilder stringBuilder;
11 try {
12 stringBuilder = new StringBuilder();
13 byte[] bytes = new byte[1024];
14 while (is.read(bytes) != -1) {
15 stringBuilder.append(bytes);
16 }
17 } finally {
18 if (is != null) {
19 is.close();
20 }
21 }
22 System.out.println("读取到的结果:" + stringBuilder.toString());
23 }
  1. 方法2️⃣
 1    /**
2 * 按字节读取字符串,一次性读取完
3 * @param fileName
4 * @throws IOException
5 */
6 public static void readString2(String fileName) throws IOException {
7 InputStream inputStream = new FileInputStream(fileName);
8 try {
9 // size 为字串的长度 ,这里一次性读完
10 byte[] bytes = new byte[inputStream.available()];
11 inputStream.read(bytes);
12 System.out.println("读取到的结果是:"+new String(bytes,"UTF-8"));
13 } finally {
14 if (inputStream != null) {
15 inputStream.close();
16 }
17 }
18
19 }

OutputStream 的类图

Java I/O 操作整理_类图_05enter description here

运用OutputStream的实现类写入文件

  1. 方法1️⃣

    使用FileOutputStream进行写入。
 1    /**
2 * 使用FileOutputStream
3 * @param file
4 * @throws IOException
5 */
6 public static void writeStringToFile1(File file) throws IOException {
7 FileOutputStream fos = new FileOutputStream(file);
8 try {
9 fos.write("www.jay".getBytes());
10 fos.flush();
11 } finally {
12 if (fos != null) {
13 fos.close();
14 }
15 }
16 }
  1. 方法2️⃣

    使用PrintStream进行写入
 1   /**
2 * 使用PrintStream写入
3 * @param file
4 * @throws FileNotFoundException
5 */
6 public static void writeStringToFile2(File file) throws FileNotFoundException {
7 PrintStream printStream = null;
8 try {
9 printStream = new PrintStream(new FileOutputStream(file));
10 printStream.append("你好");
11 printStream.append("java");
12 } finally {
13 if (printStream != null) {
14 printStream.close();
15 }
16 }
17 }

基于字符操作的I/O接口:Writer和Reader

Reader 的类图

enter description here

运用Reader的实现类读取文件内容(只能读取字符流)

  1. 方法1️⃣
 1    public static void readFileToString1(String fileName ) throws IOException {
2 File file = new File(fileName);
3 FileReader fileReader = new FileReader(file);
4 int length = Integer.valueOf(String.valueOf(file.length()));
5 //定义一个大小等于文件大小的字符数组
6 char[] chars = new char[length];
7 StringBuilder str = new StringBuilder();
8 try {
9 int data;
10 while ((data=fileReader.read(chars))>0) {
11 System.out.println("读取到的字符是="+data);
12 str.append(chars);
13 }
14 System.out.println("读取到的结果:"+str.toString());
15 } finally {
16 if (fileReader != null) {
17 fileReader.close();
18 }
19 }
20 }
  1. 方法2️⃣
 1 /**
2 * InputStreamReader+BufferedReader读取字符串 ,
3 * InputStreamReader类是从字节流到字符流的桥梁,
4 * 按行读对于要处理的格式化数据是一种读取的好方式
5 * @param fileName
6 * @throws IOException
7 */
8 public static void readFileToString2(String fileName) throws IOException {
9 BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
10 try {
11 StringBuilder stringBuilder = new StringBuilder();
12 String data = null;
13 while ((data = bufferedReader.readLine()) != null) {
14 stringBuilder.append(data);
15 }
16 System.out.println("读取到的结果:"+stringBuilder.toString());
17 } finally {
18 if (bufferedReader != null) {
19 bufferedReader.close();
20 }
21 }
22 }

Writer  的类图

Java I/O 操作整理_类图_06enter description here

运用Writer的实现类写入内容到文件

  1. 方法1️⃣
 1 /**
2 * 使用BufferedWriter写入
3 * @param file
4 * @throws IOException
5 */
6 public static void writeStringToFile1(FileWriter file) throws IOException {
7 BufferedWriter bufferedWriter = new BufferedWriter(file);
8 bufferedWriter.append("bufferedWriter");
9 bufferedWriter.append("测试2111");
10 bufferedWriter.close();
11 }
  1. 方法2️⃣
 1 /**
2 * 使用PrintWriter写入
3 * @param fileWriter
4 * @throws IOException
5 */
6 public static void writeStringToFile2(FileWriter fileWriter) throws IOException {
7 PrintWriter printWriter = new PrintWriter(fileWriter);
8 printWriter.append("printWriter");
9 printWriter.append("实验");
10 printWriter.close();
11 }

总结

本文首先介绍了java.io 包中的重要接口和类,如InputStream接口,OutputStream接口,Reader接口和Writer接口。然后,通过几个小demo阐述了如何运用这些接口的实现类来操作文件。希望多读者朋友有所帮助。

源代码

https://github.com/XWxiaowei/JavaCode/tree/master/io-study-demo