Java字节流、字符流和对象流的读写文件操作

首先,在src文件夹下新建一个images文件夹 

在src文件夹下放入一张 名为Maize.jpg的图片

 执行代码,可见images文件夹下已出现复制过来的Maize.jpg

 

同时我们也看到生成了tickler.txt备忘录文件,

所以显示记事本文件已读取,内容为:    记得每天吃早餐!

接着我们输入5个学生的名字:

可见学生信息列表已读出相应名字,随机点名器也随机点名出一位同学的名字

而且还单独添加了一位同学的信息:lxh

接下来分别添加hrh、lgh、mzj的信息

最后学生信息列表读出最终的所有名字

 

 代码

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class TestIO{
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //上传图片到当前项目中(使用字节缓冲输入输出流)
        //创建文件输入流对象
        FileInputStream fis = new FileInputStream("src\\Maize.jpg");
        //创建文件输出流对象
        FileOutputStream fos = new FileOutputStream("src\\images\\Maize.jpg");
        //将创建的节点流的对象作为形参传递给缓冲流的构造方法
        BufferedInputStream bis=new BufferedInputStream(fis);
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        int len;                      //定义len,记录每次读取的字节
        //复制文件前的系统时间
        long begin = System.currentTimeMillis();
        //读取文件并判断是否到达文件末尾
        while ((len= fis.read())!=-1){
            bos.write(len);    //从第1个字节开始,向文件写入len个字节
        }
        //复制文件后的系统时间
        long end = System.currentTimeMillis();
        System.out.println("          复制文件耗时:    "+(end-begin)+"毫秒");
        bos.close();
        bis.close();


        //上传一个记事本文件到当前项目中(使用字符文件输入输出流)。
        File file = new File("tickler.txt");
        FileWriter fw=new FileWriter(file);
        fw.write("记得每天吃早餐!");
        fw.close();

        File file1=new File("tickler.txt");
        FileReader fr=new FileReader(file1);
        int len1;  //定义len,记录读取的字符
        //判断是否读取到文件的末尾
        System.out.print("记事本文件已读取,内容为:    ");
        while((len1= fr.read())!=-1){
            //输出文件内容
            System.out.print((char)len1);
        }
        fr.close();


        //添加5个学生的姓名到name.txt文件中(使用集合的方式用字符缓冲输入输出流)
        FileWriter fw1=new FileWriter("src/name.txt");

        BufferedWriter bw=new BufferedWriter(fw1);
        System.out.println("\n请输入5个学生的名字:");
        Scanner scanner1=new Scanner(System.in);
        List nameList=new ArrayList();
        //每次读取一行文本,判断是否到文件末尾
        for(int i=1;i<=5;i++){
            String name=scanner1.nextLine();
            nameList.add(name);
        }
        for(int j=0;j<=4;j++){
            bw.write((String) nameList.get(j));
            //写入一个换行符,该方法会根据不同操作系统生成相应换行符
            bw.newLine();
        }
        bw.close();  //释放资源

        String str;
        FileReader fr1=new FileReader("src/name.txt");        //创建字符缓冲输入流对象
        BufferedReader br=new BufferedReader(fr1);
        System.out.println("\n-----------学生信息列表------------");
        while((str=br.readLine())!=null) {
            System.out.println(str);
        }
        br.close();

        //点名器:在第3个实验中生成一个name.txt文件,里面存储了班级同学的姓名,每个姓名占一行,要求通过程序实现随机点名器。
        String str2;
        FileReader fr2=new FileReader("src/name.txt");
        List nameList2=new ArrayList();                      //创建ArrayList集合对象
        BufferedReader br2=new BufferedReader(fr2);          //创建字符缓冲输入流对象
        while((str2=br2.readLine())!=null) {                 //通过字符缓冲输入流对象的方法读数据,每读一个名字(一行数据)数据作为集合元素存储到集合中。
            nameList2.add(str2);
        }
        br2.close();                                         //释放资源

        System.out.print("随机点名器:");
        Random random=new Random();                          //使用Random产生一个随机数
        int count=random.nextInt(nameList2.size());          //随机数范围为【0,集合的长度)
        System.out.println(nameList2.get(count));            //随机数作为索引获取集合的元素并输出


        //添加一个用户信息到文件(使用对象输出输入流)
        Student student1=new Student("lxh");
        nameList.add(student1.getName());
        //创建文件输出流对象,将数据写入name.txt文件
        FileOutputStream fos1=new FileOutputStream("src/name.txt");
        //创建对象输出流对象
        ObjectOutputStream oos=new ObjectOutputStream(fos1);
        oos.writeObject(student1);      //将s对象序列化


        FileInputStream fis1=new FileInputStream("src/name.txt");
        ObjectInputStream ois=new ObjectInputStream(fis1);
        //从student.txt文件中读取数据
        Student student2=(Student)ois.readObject();
        System.out.println("已添加学生:"+student2.getName());


        //添加多个用户信息到文件(采用集合并使用对象输出输入流)
        System.out.print("请输入添加的学生信息的数量:");
        int number=scanner1.nextInt();
        System.out.println("请输入学生名字:");
        List nameList1=new ArrayList();
        //每次读取一行文本,判断是否到文件末尾
        for(int i=0;i<=number;i++){
            String name1=scanner1.nextLine();
            nameList1.add(name1);
        }
        for(int i=1;i<nameList1.size();i++){
            Student student3=new Student((String) nameList1.get(i));
            //===================创建文件输出流对象=================将数据写入name.txt文件
            FileOutputStream fos2=new FileOutputStream("src/name.txt");
            //创建对象输出流对象
            ObjectOutputStream oos1=new ObjectOutputStream(fos2);
            oos1.writeObject(student3);      //将s对象序列化

            //===================创建文件输入流对象==================
            FileInputStream fis2=new FileInputStream("src/name.txt");
            ObjectInputStream ois1=new ObjectInputStream(fis2);
            //从name.txt文件中读取数据
            Student student4=(Student)ois1.readObject();
            nameList.add(student4.getName());
            System.out.println("已添加学生:"+student4.getName());
        }
        System.out.println("\n-----------学生信息列表------------");
        for(int u=0;u<nameList.size();u++){
            System.out.println(nameList.get(u));
        }
    }
}
class Student implements Serializable{
    private String name;
    public Student(String name) {
        this.name = name;
    }


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZYT_庄彦涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值