• java存储数据到本地txt文件中-以及-读取txt文件的内容


    java存储数据,方便打印日志等

    1、会覆盖以前的数据

    1. try {
    2. File writeName = new File("D:\data.txt"); // 相对路径,如果没有则要建立一个新的output.txt文件
    3. if(!writeName.exists()) {
    4. writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
    5. }
    6. FileWriter writer = new FileWriter(writeName);
    7. BufferedWriter out = new BufferedWriter(writer);
    8. out.write(data);
    9. out.flush(); // 把缓存区内容压入文件
    10. out.close();
    11. } catch (IOException e) {
    12. e.printStackTrace();
    13. }

    2、接下一行存储,数据不覆盖 

    1. try {
    2. File file = new File("D:\data.txt");
    3. if(!file.exists()) {
    4. file.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
    5. }
    6. FileOutputStream fos = new FileOutputStream(file,true);
    7. OutputStreamWriter osw = new OutputStreamWriter(fos);
    8. BufferedWriter bw = new BufferedWriter(osw);
    9. bw.write(data);
    10. bw.newLine();
    11. bw.flush();
    12. bw.close();
    13. osw.close();
    14. fos.close();
    15. }catch (FileNotFoundException e1) {
    16. e1.printStackTrace();
    17. } catch (IOException e2) {
    18. e2.printStackTrace();
    19. }

    从txt文件中读取数据:

    JDK8,你可以这样,按行读取:

    1. Path path = Paths.get("D:/aa.txt");
    2. List<String> lines = Files.readLines(path);

    JDK8,你可以这样,读取全部:

    1. Path path = Paths.get("D:/aa.txt");
    2. byte[] data = Files.readAllBytes(path);
    3. String result = new String(data, "utf-8");

    对于JDK11及以上版本,读取文本文件异常简单,我们只需要这样:

    1. Path path = Paths.get("D:/aa.txt");
    2. String data = Files.readString(path);
    3. System.out.println(data);

    1.读取文件的乱码问题:

    使用类库:Cpdetector。

    请直接添加相关jar包或者使用maven导入。

    1. CodepageDetectorProxy codepageDetectorProxy = CodepageDetectorProxy.getInstance();
    2. codepageDetectorProxy.add(JChardetFacade.getInstance());
    3. Charset charset = codepageDetectorProxy.detectCodepage(file.toURI().toURL());

    最原始的方法:

    java提供了一个FileInputStream,我们可以直接以文件路径构造这个流,也可以以文件对象构造他,如:FileInputStream fin = new FileInputStream("d:/aa.txt");

    然后使用这个流就可以直接读取到文件了,但是这个时候读取到的内容是int类型的数值,所以需要进一步的处理,我们把fin外面包上一个InputStreamReader,就变成了这样:

    InputStreamReader reader = new InputStreamReader(fin);

    但是这一个reader读取文本并不是很方便,有一点要注意,在这一个reader的构造方法上面可以设定字符编码;接下来,使用这个reader构造BufferedReader,BufferedReader拥有一个名为readLine的方法,可以读取一整行的文本,作为字符串返回,因此用起来会比较方便。

    BufferedReader buffReader = new BufferedReader(reader);

    接下来就是借助循环来读取文件中的字符串了,然后,去做你想做的事情好了

    1. import java.io*;
    2. public class MainStart{
    3. public static void main(String args[]){
    4. String filePath = "D:/aa.txt";
    5. FileInputStream fin = new FileInputStream(filePath);
    6. InputStreamReader reader = new InputStreamReader(fin);
    7. BufferedReader buffReader = new BufferedReader(reader);
    8. String strTmp = "";
    9. while((strTmp = buffReader.readLine())!=null){
    10. System.out.println(strTmp);
    11. }
    12. buffReader.close();
    13. }
    14. }

    二进制读取方式:

    2.1 使用DataInputStream:

    1. DataInputStream din = new DataInputStream(new FileInputStream(file));
    2. byte[] data = new byte[1024];
    3. while(din.read(data) > 0) {
    4. // 处理数据
    5. }
    6. din.close();

    2.2 使用RandomAccessFile

    1. RandomAccessFile randomFile = new RandomAccessFile(file, "r");
    2. byte[] data = new byte[1024];
    3. while(randomFile.read(data) > 0) {
    4. // 处理数据
    5. }
    6. randomFile.close();

    2.3两者的区别

    RandomAccessFile可以通过移动文件指针改变读取的位置,可以按照几种基本类型直接读取数据,可以跳过一定的字节,整体来看,文件就像一个大的二进制数组。而DataInputStream就是单纯的输入流。

    3. 大量数据的处理思路:

    3.1 借助ByteBuffer使用堆外内存,在不导致oom的情况且内存充足的情况下可以大量申请内存。

    3.2 借助RandomAccessFile分块读取,记录读取的最后位置,处理完毕后继续读。或者多线程处理,拆分整个文件为多个大小相等的块,分入多个子线程进入线程池并发处理。

    3.3 用BufferedReader和正则,匹配到特征数据后暂停,然后处理数据,然后继续读取。

  • 相关阅读:
    CSDN第11次竞赛题解与总结
    grpc在arm架构cpu的linux环境下生成java代码
    学习笔记4--自动驾驶汽车感知系统
    悄悄上线:CSS @starting-style 新规则
    Webrtc Rtp包解密
    hls4ml 从github源码安装
    Mac(M1)安装mysqlclient失败解决办法-error: subprocess-exited-with-error
    12个开源免费的程序员简历模板
    【翻译】分布式系统
    一线大厂Redis高并发缓存架构实战与性能优化
  • 原文地址:https://blog.csdn.net/zlfjavahome/article/details/127965025