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

目录
相关文章
|
1月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
14天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
8天前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
24天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
1月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
28 2
|
1月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
1月前
|
缓存 Java
【IO面试题 一】、介绍一下Java中的IO流
Java中的IO流是对数据输入输出操作的抽象,分为输入流和输出流,字节流和字符流,节点流和处理流,提供了多种类支持不同数据源和操作,如文件流、数组流、管道流、字符串流、缓冲流、转换流、对象流、打印流、推回输入流和数据流等。
【IO面试题 一】、介绍一下Java中的IO流
|
1月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
37 2
|
1月前
|
Java Android开发
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
133 1