文件类
Java 读文件流的知识不可少,先复习一下吧!
OREACLE JDK8 DOCS
文件类是Java IO的一个对象,用于指定文件的相关信息,位置和名称信息。如txt文件,csv文件对Java来说就是一个文件类。

开发手册中指出,文件类对象的第一个参数是一个pathname路径名,在windows下就是例如:
D:\Java\apache-tomcat-8.5.84另外还指出\在Java中为转义字符需要使用\\那么路径名就变成了C:\\Users\\fireapproval\\Desktop\\数据集\\test.csv。
File类也提供了若干方法获取路径信息:
| 方法 | 描述 |
|---|---|
| getName() | 获取dictionnary |
| getPath() | 获取完整路径名 |
这个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);
}




















