Java基础 | IO流(四)

简介: Java中的IO流讲解

(五)案例

1.集合到文件

代码实现:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class ArrayToFile {
    public static void main(String[] args) throws IOException {
        //创建集合对象
        ArrayList<String> array = new ArrayList<>();

        //存储字符串元素
        array.add("hello");
        array.add("java");

        //创建字符缓冲输出流对象
        BufferedWriter br = new BufferedWriter(new FileWriter("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\test.txt"));

        //遍历集合,得到每一个字符串数据
        for(String s : array){
            //调用字符缓冲输出流对象的方法写数据
            br.write(s);
            br.newLine();
            br.flush();
        }

        //释放资源
        br.close();

    }
}

2.文件到集合

代码实现:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class FileToArrayList {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输入对象
        BufferedReader br = new BufferedReader(new FileReader("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\test.txt"));

        //创建ArrayList集合对象
        ArrayList<String> array = new ArrayList<>();

        //调用字符缓冲输入对象读取数据
        String line;
        while ((line = br.readLine()) != null) {
            array.add(line);
        }

        //释放资源
        br.close();

        //遍历集合
        for (String s : array) {
            System.out.println(s);
        }
    }
}

3.点名器

需求:有一个文件里面存储了班级同学的姓名,每个姓名占一行,要求通过程序实现随机点名器

代码实现:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class FileToArrayList {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输入对象
        BufferedReader br = new BufferedReader(new FileReader("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\test.txt"));

        //创建ArrayList集合对象
        ArrayList<String> array = new ArrayList<>();

        //调用字符缓冲输入对象读取数据
        String line;
        while ((line = br.readLine()) != null) {
            array.add(line);
        }

        //释放资源
        br.close();

        //遍历集合
        for (String s : array) {
            System.out.println(s);
        }
    }
}

4.集合到文件(升级版)

把ArrayLIst中的学生数据写入到文本文件中。要求:每一个学生对象的数据作为文件中的一行数据

代码实现:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class ArrayToFileProDemo {
    public static void main(String[] args) throws IOException {
        //创建缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\Student.txt"));

        //创建ArrayList集合对象
        ArrayList<Student> array = new ArrayList<>();

        //创建学生对象
        Student s1 = new Student(19103201,"学生1",20,"天津");
        Student s2 = new Student(19103202,"学生2",21,"北京");
        Student s3 = new Student(19103203,"学生3",22,"河北");

        //把学生对象添加到集合中
        array.add(s1);
        array.add(s2);
        array.add(s3);

        //遍历集合得到每一个学生对象
        for(Student s : array){
            String result = getString(s);
            bw.write(result);
            bw.newLine();
            bw.flush();
        }

        //释放资源
        bw.close();
    }


    public static String getString(Student s) {
        StringBuilder sb = new StringBuilder();
        sb.append(s.getSid()).append(", ").append(s.getName()).append(", ").append(s.getAge()).append(", ").append(s.getAddress());

        String ss = sb.toString();

        return ss;
    }
}

5.文件到集合(升级版)

需求:把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个学生对象的成员变量值

代码实现:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class FileToArrayListDemo {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输出流对象
        BufferedReader br = new BufferedReader(new FileReader("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\Student.txt"));

        //创建ArrayList集合
        ArrayList<Student> array = new ArrayList<>();

        //读取数据
        String line;
        while((line = br.readLine())!= null) {
            //将字符串按一定格式分割,得到一个数组
            String[] StrArr = line.split(", ");

            //创建学生对象
            Student s = new Student();
            s.setSid(Integer.parseInt(StrArr[0]));
            s.setName(StrArr[1]);
            s.setAge(Integer.parseInt(StrArr[2]));
            s.setAddress(StrArr[3]);

            //把学生对象添加到集合
            array.add(s);
        }

        //释放资源
        br.close();
        //遍历集合
        for(Student s :array){
            System.out.println(s.getSid()+", "+s.getName()+", "+s.getAge()+", "+s.getAddress());
        }
    }
}

6.集合到文件(数据排序升级版)

需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)。要求按照成绩总分从高到低写入文本文件

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;

public class TreeSetToFile {
    public static void main(String[] args) throws IOException {
        //创建TreeSet集合,通过比较器排序进行排序
        TreeSet<Student1> ts = new TreeSet<>(new Comparator<Student1>() {
            @Override
            public int compare(Student1 s1, Student1 s2) {
                int num = s2.sum() - s1.sum();
                int num2 = num == 0 ? s2.getEnglishScore() - s1.getEnglishScore() : num;
                int num3 = num2 == 0 ? s2.getChineseScore() - s1.getChineseScore() : num2;
                int num4 = num3 == 0 ? s2.getName().compareTo(s1.getName()) : num3;
                return num4;
            }
        });

        for(int i =0;i<3;i++){
            //键盘录入学生数据
            Scanner sc = new Scanner(System.in);
            System.out.println("请录入第"+(i+1)+"个学生的信息:");
            System.out.println("请输入学生姓名");
            String name = sc.nextLine();
            System.out.println("请输入学生语文成绩");
            int chineseScore = sc.nextInt();
            System.out.println("请输入学生数学成绩");
            int mathScore = sc.nextInt();
            System.out.println("请输入学生英语成绩");
            int englishSore = sc.nextInt();

            //创建学生对象
            Student1 s = new Student1();
            //将键盘录入的值赋给成员变量
            s.setName(name);
            s.setChineseScore(chineseScore);
            s.setEnglishScore(englishSore);
            s.setMathScore(mathScore);

            //将学生对象添加到集合中
            ts.add(s);
        }

        //创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\Student1.txt"));

        //遍历集合
        for(Student1 s : ts) {
            String ss = getString(s);
            bw.write(ss);
            bw.newLine();
            bw.flush();
        }

        //释放资源
        bw.close();

    }

    //定义获得指定格式字符串的方法
    public static String getString(Student1 s) {
        StringBuilder sb = new StringBuilder();
        sb.append(s.getName()).append(", ").append(s.getChineseScore()).append(", ").append(s.getEnglishScore()).append(", ").append(s.getMathScore()).append(", ").append(s.sum());

        String ss = sb.toString();
        return ss;
    }
}

7.复制单级文件夹

代码实现:

import java.io.*;

public class CopyFolderDemo {
    public static void main(String[] args) throws IOException {
        //创建数据源目录
        File srcFolder = new File("F:\\testCopyTEMP27");
        //获取数据源目录File对象的名称(TEMP27)
        String srcFolderName = srcFolder.getName();
        //创建目的地目录File对象,路径名是模块名+TEMP27
        File destFolder = new File("src\\TEMP",srcFolderName);
        //判断目的地目录对应的File是否存在,如果不存在,就创建
        if(!destFolder.exists()){
            destFolder.mkdir();
        }

        //获取数据源目录下的所有文件的File数组
        File[] listFile = srcFolder.listFiles();
        //遍历数组获得每一个文件
        for(File file : listFile) {
            //获取每个文件的文件名
            String fileSrcName = file.getName();
            //创建目的地文件的File对象
            File destFile = new File(destFolder,fileSrcName);
            //复制文件
            copyFile(file,destFile);
        }
    }

    private static void copyFile(File file, File destFile) throws IOException {
        //创建字节输入输出缓冲流对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

        //读写数据(一次读一个字节数组)
        byte[] bys = new byte[1024];
        int len;
        while((len = bis.read(bys))!=-1){
            bos.write(bys,0,len);
        }

        //释放资源
        bis.close();
        bos.close();
    }
}

8.复制多级文件夹

import java.io.*;

public class CopyProDemo {
    public static void main(String[] args) throws IOException {
        //创建数据源对象File
        File srcFile = new File("F:\\testCopyTEMP27");
        //创建目的地File对象
        File destFile = new File("src\\TEMP");
        //写方法实现文件夹的复制
        copyFolder(srcFile, destFile);
    }

    private static void copyFolder(File srcFile, File destFile) throws IOException {
        //判断数据源File是否为目录
        if (srcFile.isDirectory()) {
            //在目的地创建名字一样的目录
            String srcFileName = srcFile.getName();
            File newDestFolder = new File(destFile, srcFileName);
            if (!newDestFolder.exists()) {//判断是否存在
                //创建新的文件夹
                newDestFolder.mkdir();
            }
            //获取数据源File下的所有文件或者目录的数组
            File[] FileArray = srcFile.listFiles();
            //遍历该数组,获取每一个File对象
            for (File file : FileArray) {
                copyFolder(file, newDestFolder);
            }
        } else {
            //创建一个新的文件名与源文件相同的路径
            File newDestFile = new File(destFile,srcFile.getName());
            copyFile(srcFile,newDestFile);
        }

    }

    private static void copyFile(File file, File destFile) throws IOException {
        //创建字节输入输出缓冲流对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

        //读写数据(一次读一个字节数组)
        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }

        //释放资源
        bis.close();
        bos.close();
    }
}

(六)复制文件的异常处理

在这里插入图片描述

代码演示:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class ExceptionDemo {
    public static void main(String[] args) {

    }

    //处理异常方法1(直接抛出)
    private static void method1() throws IOException {
        FileReader fr = new FileReader("fr.txt");
        FileWriter fw = new FileWriter("fw.txt");

        char[] chs = new char[1024];
        int len;
        while ((len = fr.read(chs)) != -1) {
            fw.write(chs, 0, len);
        }

        fr.close();
        fw.close();
    }

    //处理异常方法2(正常try...catch..finally标准格式处理异常)
    private static void method2() {
        FileReader fr = null;
        FileWriter fw = null;
        try {
            fr = new FileReader("fr.txt");
            fw = new FileWriter("fw.txt");

            char[] chs = new char[1024];
            int len;
            while ((len = fr.read(chs)) != -1) {
                fw.write(chs, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fw != null) {
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //处理异常方法3(JDK7的改进方案)
    private static void method3() {
        try (FileReader fr = new FileReader("fr.txt");
             FileWriter fw = new FileWriter("fw.txt");){
            char[] chs = new char[1024];
            int len;
            while ((len = fr.read(chs)) != -1) {
                fw.write(chs, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //处理异常方法4(JDK9的改进方案)
    private static void method4() throws IOException{   //此处相对JDK7来说还要抛出异常
        FileReader fr = new FileReader("fr.txt");
        FileWriter fw = new FileWriter("fw.txt");
        try (fr;fw){ //注意此处是分号;而不是逗号,
            char[] chs = new char[1024];
            int len;
            while ((len = fr.read(chs)) != -1) {
                fw.write(chs, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

目录
相关文章
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
376 0
|
10月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
379 1
|
12月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
269 3
|
12月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
716 23
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
578 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
390 10
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
595 0