文件读取和输出

一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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值