一Scanner
@Test
void testReadFile1() throws IOException {
//文件内容:Hello World|Hello Zimug
String fileName = "D:\\data\\test\\newFile4.txt";
try (Scanner sc = new Scanner(new FileReader(fileName))) {
while (sc.hasNextLine()) { //按行读取字符串
String line = sc.nextLine();
System.out.println(line);
}
}
try (Scanner sc = new Scanner(new FileReader(fileName))) {
sc.useDelimiter("\\|"); //分隔符
while (sc.hasNext()) { //按分隔符读取字符串
String str = sc.next();
System.out.println(str);
}
}
//sc.hasNextInt() 、hasNextFloat() 、基础数据类型等等等等。
//文件内容:1|2
fileName = "D:\\data\\test\\newFile5.txt";
try (Scanner sc = new Scanner(new FileReader(fileName))) {
sc.useDelimiter("\\|"); //分隔符
while (sc.hasNextInt()) { //按分隔符读取Int
int intValue = sc.nextInt();
System.out.println(intValue);
}
}
}
二stream流
@Test
void testReadFile2() throws IOException {
String fileName = "D:\\data\\test\\newFile.txt";
// 读取文件内容到Stream流中,按行读取
Stream<String> lines = Files.lines(Paths.get(fileName));
// 1.随机行顺序进行数据处理
lines.forEach(ele -> {
System.out.println(ele);
});
// 2.顺序
lines.forEachOrdered(System.out::println);
// 3.转换成List<String>, 要注java.lang.OutOfMemoryError: Java heap space
List<String> collect = lines.collect(Collectors.toList()
}
三.BufferedReader 经典管道流的方式
@Test
void testReadFile6() throws IOException {
String fileName = "D:\\data\\test\\newFile3.txt";
// 带缓冲的流读取,默认缓冲区8k
try (BufferedReader br = new BufferedReader(new FileReader(fileName))){
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
//java 8中这样写也可以
try (BufferedReader br = Files.newBufferedReader(Paths.get(fileName))){
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
四、CsvReader文件读取
4.1.POM文件
<!--csv文件操作-->
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
package com.task.test;
import com.csvreader.CsvReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: Test2
* @Author: BlueBlue
* @Description:
* @Date: 2023/3/7 0007 15:50
*/
public class Test2 {
public static void main(String[] args) {
String fileName = "C:\\Users\\Administrator\\Desktop\\Jfile\\CSV\\20230327.csv";
List<String[]> list = Test2.readCsvByCsvReader(fileName);
for (String[] str :list) {
for (String num : str) {
System.out.print(num + "|");
}
}
//打印二
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.get(i).length; j++) {
System.out.println(list.get(i)[j]);
}
}
}
public static List<String[]> readCsvByCsvReader(String filePath) {
List<String[]> arrList = new ArrayList<String[]>();
try {
CsvReader reader = new CsvReader(filePath, ',', Charset.forName("GBK"));
while (reader.readRecord()) {
arrList.add(reader.getValues()); // 按行读取,并把每一行的数据添加到list集合
}
reader.close();
System.out.println("读取的行数:" + arrList.size());
} catch (Exception e) {
e.printStackTrace();
}
return arrList;
}
public static List<List<String>> readCsvByCsvReader2(String filePath) {
List<List<String>> arrList = new ArrayList<List<String>>();
try {
CsvReader reader = new CsvReader(filePath, ',', Charset.forName("GBK"));
while (reader.readRecord()) {
arrList.add(Arrays.asList(reader.getValues())); // 按行读取,并把每一行的数据添加到list集合
}
reader.close();
System.out.println("读取的行数:" + arrList.size());
} catch (Exception e) {
e.printStackTrace();
}
return arrList;
}
4.4.优缺点
优点:代码简单,可自行调节文本分隔符和读取文件的编码
缺点:不知道,以后再说
注:两个测试类没区别,就是返回值的数据类型不一样
四、将输出流OutputStream转化为输入流InputStream的方法:
1、ByteArrayOutputStream转成ByteArrayInputStream
用于把OutputStream 转化为 InputStream。
适合于数据量不大,且内存足够全部容纳这些数据的情况。
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byteArrayOutputStream.write("hello,world!!!\n".getBytes());
byteArrayOutputStream.write("hello,China!!!\n".getBytes());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
int length = -1;
byte [] buffer = new byte[1024 * 1024];
while ((length = byteArrayInputStream.read(buffer))!=-1){
System.out.println(new String(buffer,0,length));
}
byteArrayInputStream.close();
byteArrayOutputStream.close();
2、PipedOutputStream转成PipedInputStream
用于把OutputStream 转化为 InputStream。
适合于数据量大的情况,一个类专门负责产生数据,另一个类负责读取数据。
PipedInputStream pipedInputStream = new PipedInputStream();
PipedOutputStream pipedOutputStream = new PipedOutputStream(pipedInputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(pipedOutputStream);
bufferedOutputStream.write("hello,world!!!".getBytes());
bufferedOutputStream.flush();
byte [] buffer = new byte[10240];
int length = pipedInputStream.read(buffer);
System.out.println(new String(buffer,0,length));