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();
        }
    }
}

目录
相关文章
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
52 9
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
92 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
|
2月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
45 1
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
111 1
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
250 12
|
2月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
67 0
|
2月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
42 0
|
3月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践