文件类
Java中读取文件流的知识是必不可少的,我们先回顾一下!
文件类是Java IO的一个对象,用于指定文件相关信息、位置和名称信息。例如,txt文件和csv文件是Java的文件类。
开发手册中指出,文件类对象的第一个参数是一个pathname
路径名,在windows下就是例如:
D:\Java\apache-tomcat-8.5.84
另外还指出\
在Java中为转义字符需要使用\\
那么路径名就变成了C:\\Users\\fireapproval\\Desktop\\数据集\\test.csv
。
File类还提供了几种获取路径信息的方法:
方法 | 描述 |
---|---|
获取名称() | 获取字典 |
获取路径() | 获取完整路径名 |
该File仅用于存储路径信息,无实际操作。
文件类IO
在Java中,文件可以通过两种方式读取:字节流或字符流。人物流程就介绍到这里。
在字符流字符输入和输出流分别对应Reader
和Writer
,一个是读文件一个是写文件。对文件操作的实现类是FileReader
,用该对象即可实现文件的读取。FileWriter
是文件写入实现类。
文件流读取
FileReader的继承关系如下:
FileReader 构造函数可用于指定编码并创建 FileReader 对象。
FileReader fileReader = new FileReader("C:\\Users\\fireapproval\\Desktop\\数据集\\test1.csv");
如图所示,FilReader对象提供的方法是没办法获取文件内容的。需要通过字符流获取。
字符流转换
Java提供了BufferdReader
类来操作文件流,如下:
BufferdReader的构造方法的第一个参数是Reader
字符流,那么它就可以操作任何继承了该接口的实现类。
BufferdReader
读取文件流:
该字符流中提供了readLine()
方法读取文件一行内容。
@Test
public void method5(){
try {
FileReader fileReader = new FileReader("C:\\Users\\fireapproval\\Desktop\\数据集\\test.csv");
System.out.println(fileReader);
BufferedReader reader = new BufferedReader(fileReader);
System.out.println(reader.readLine());
}catch (IOException e){
e.printStackTrace();
}
}
如图所示已经成功读取。该对象只能一行一行读取。
需要注意的是,该对象读取文件时,会自动记录行数,并从前往后依次读取。
例如,使用reader对象读取会自动换行:
BufferedReader reader = new BufferedReader(fileReader);
System.out.println(reader.readLine());
System.out.println(reader.readLine());
System.out.println(reader.readLine());
文件流写入
FileWriter fileWriter = new FileWriter(new File("D://profile//test.csv"));
如何可以看到FileWriter的对象提供了诸如append()
,write()
,close()
方法,向文件中写入内容。
@Test
public void method5(){
try {
FileWriter fileWriter = new FileWriter(new File("C:\\Users\\fireapproval\\Desktop\\数据集\\test.txt"));
fileWriter.write("Hello World");
}catch (IOException e){
e.printStackTrace();
}
}
csv文件解析
对csv文件解析首先要了解csv文件的结构,还不清楚结构请移步Java操作redis数据库读取csv文件开头有文件结构。
读取csv文件指定列
public class ReadCSV {
BufferedReader br=null;
String line = null;
public ReadCSV(){
}
//获取某一列返回数组
public List<String> getOneColumn(String path,int column){
//参数为路径和指定列
//该列表用于存储读取的指定列元素
ArrayList arrayList = new ArrayList();
try {
br = new BufferedReader(new FileReader(path));
/* 不需要标头执行此行 line = br.readLine(); */
//循环读取每行的指定列元素
while ((line = br.readLine()) != null) {
//","分割每行第column列
//System.out.println(line.split(",")[column]);
String a= line.split(",")[column];
if(a !=null && a !=""){
arrayList.add(a);}
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return arrayList;
}
具体思想是:循环读取文件每一行,以,
分割为数组,再读取数组的指定列,直至循环结束。
演示csv文件如下:
阅读第 7 栏:
@Test
public void method6(){
ReadCSV readCSV = new ReadCSV();
List<String> maps = readCSV.getOneColumn("C:\\Users\\fireapproval\\Desktop\\数据集\\test1.csv", 7);
System.out.println(maps);
}
读取csv文件若干列
public List<ArrayList> readTwoColumn(String path,int column1,int column2){
List<ArrayList> list = new ArrayList<>();
try {
br = new BufferedReader(new FileReader(path));
br.readLine();
while ((line = br.readLine()) != null) {
//","取出任意两列
//System.out.println(line.split(",")[column]);
String columnOne= line.split(",")[column1] ; //取column1列
String columnTwo = line.split(",")[column2]; // 。。。
if(columnOne != "" && columnTwo !=""){
ArrayList arrayList = new ArrayList();
arrayList.add(columnOne);
arrayList.add(columnTwo);
list.add(arrayList);
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return list;
}
只需阅读几列并定义一些参数即可。
演示:
@Test
public void method6(){
ReadCSV readCSV = new ReadCSV();
List<ArrayList> maps = readCSV.readTwoColumn("C:\\Users\\fireapproval\\Desktop\\数据集\\test.csv", 7, 9);
System.out.println(maps);
}