下载文件
我们学习了如何请求图片、excel等文件,此类二进制文件无法把内容输出在 console 进行查看的,所以请求结果必须写入文件。
本节我们就来一起学习如何写文件。在 Java 中写文件必须经历三个步骤:
创建文件对象
↓
写入内容
↓
关闭写入操作
打开和关闭的步骤,是为了确保同一个文件同时只能被一个程序写,否则内容会错乱。
写入文本文件
在程序中写入字符串内容的语句:
import java.io.File;
import java.io.FileWriter;
// 文件对象
File file = new File("foo.txt");
// 写入内容
FileWriter fileWritter = new FileWriter(file.getName());
fileWritter.write(content);
// 关闭
fileWritter.close();
File是文件类,FileWriter是用来给文件写入内容的类。再次强调,写入文件类必须执行关闭操作。
大家可以看到,foo.txt 文件已经生成了。点击可以查看我们刚刚写入的字符内容。
写入二进制文件
当然,写入的内容不限定是文本,excel等二进制文件也可以。
第3章第2节的作业中,我们请求了一个 excel 文件(网址 https://style.youkeda.com/img/ham/course/py2/china-city-list.xlsx),文件的数据类型是 byte[]。
假设文件数据的变量是 byte[] data,那么写入本地文件的代码如下:
import java.io.File;
import java.io.FileOutputStream;
// 文件对象
File file = new File("china-city-list.xlsx");
// 写文件
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
// 必须刷新并关闭
fos.flush();
fos.close();
与写入文本内容不同,写入二进制内容,需要用
FileOutputStream。再次强调,必须执行刷新、关闭操作。
请求完毕并且已经已经正确生成了 china-city-list.xlsx 文件,但是需要 office 软件才能打开,不能直接看哦。
解析excel
前面我们已经学了如何下载文件,下载后点击文本文件、图片,都可以直接查看其内容,另一种常见的文件是 excel 文件,但正常情况下需要 office 软件才能读取。
实际上,Java 很强大,已经有库可以操作 excel 文件了。
依赖库
easyexcel 是阿里巴巴出品的快速、简单操作 excel 文件的库。使用前必须在 pom.xml 文件中加入对库的依赖。。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
调用库
大家都知道,excel 文件是多 sheet 模式的,每个 sheet 实际上是一个表格,表格又分为行和列。
所以解析数据的路径一定是:sheet -> 行 -> 列
牢记计算机中,第一个单元格的位置是
0。第一个sheet、第一行、第一列的位置是0,0,0
我们在第一节的作业中已经下载了 xzq_201907.xlsx 文件,以此为例,解析其内容。
import com.alibaba.excel.EasyExcel;
import java.util.Map;
import java.util.List;
// 读取第一个sheet
List<Map<Integer, String>> sheetDatas = EasyExcel.read("xzq_201907.xlsx").sheet(0).doReadSync();
// List 中每个元素表示一行
for (Map<Integer, String> rowData : sheetDatas) {
// Map 中用序号指代每一列
for (Integer index : rowData.keySet()) {
// 列值
String columnValue = rowData.get(index);
}
}
解析文件的第一个步骤是读取文件内容,调用 EasyExcel.read() 方法,传入文件名称。然后这里解析的 第一个 工作表,所以调用 sheet() 方法,传入参数 0 。最后的 doReadSync() 表示同步方式读取文件内容,返回一个读取到的内容集合 List 。这是一个连贯的写法。
返回的 List 集合中,系统用 Map 类表示一行数据(因为系统不知道 excel 对应什么具体的对象,其实 Map 可以当做一种通用的对象)
下图帮助大家理解 excel 内容与 Java 集合之间的关系。

大家对照图示与代码,理解每个语句的作用和含义,掌握步骤即可。其实也不用特别背诵,当开发需要用的时候把本节课的内容复习即可。关键还是学会使用。
大家可以把
xzq_201907.xlsx文件的链接贴到浏览器地址栏中,下载到本地打开看内容,与程序的输出结果进行对照哦。
小知识点
System.out.print() 输出后不自动换行,等遍历完一行数据(即一个Map对象)后,使用 System.out.println() 输出一个空行,更加直观。
自动转换为类
在不能提前确定 excel 文件每一列的含义时,或者复杂场景下 excel 文件的列经常变化,用 Map 表示每一列的数据比较好。
但是如果知道 excel 文件每一列的含义,用自定义类来表示,会更加直观。
import com.alibaba.excel.EasyExcel;
import java.util.List;
// 读取第一个sheet
List<DemoData> sheetDatas = EasyExcel.read("xzq_201907.xlsx").head(DemoData.class).sheet(0).doReadSync();
注意这里多调用了一个方法:.head(DemoData.class),DemoData 就是自定义的类,表示一行数据,类的每个属性都表示一列的值。
Map 更灵活,自定义类更直观易理解。一般列数不太多(不超过 10 个)、不会变化,用自定义类
返回值为 List<DemoData> 就表示把每一行都转换为一个 DemoData 的实例对象,放入 List 集合中。
// 属性定义的顺序必须与列顺序保持一致
public class DemoData {
private String code1;
private String city1;
private String code2;
private String city2;
private String code3;
private String city3;
}
下图帮助大家理解 excel 内容与 自定义类 之间的关系。

code1 是第一个属性,映射 excel 文件第一列的值。这是为了让大家易懂,在属性名上加了数字,实际上,即使属性名是 code10000 ,只要放在最前面,就映射第一列的值。
注意 excel 表的列与自定义类的属性,是按顺序一一对应的,不是按名称哦。
总结
无论转换为自定义的类还是 Map,EasyExcel.XXXXXX.doReadSync() 最终返回的都是一个集合 List 。大家一定要理解的是,集合中的每一个元素,即每一个实例对象(无论是自定义类还是 Map),都表示一行数据。
大家在学习的过程中,不能只看代码。而是要用 Microsoft Excel 软件把文件打开,仔细对比文件内容与 console 输出结果,务必要理解文件中每一行、每一列、每个单元格的值,跟 java 类(无论是自定义类还是 Map)之间的关系是什么。
学编程会越来越多的面对抽象而复杂的问题,大家的思维必须能够从具体(文件)跨越到抽象(java 类)。
2732

被折叠的 条评论
为什么被折叠?



