java知识点——I/O输入输出处理(二)

news2024/9/21 4:53:04

读取字符流:

由于字符输入流的read()方法返回的是int类型的值,如果想获得字符就需要进行强制类型转换,所以输出语句中将变量len强转为了char类型。

 public static void main(String[] args) throws IOException {
        //创建FileReader对象
        FileReader fileReader = new FileReader("test.txt");
        //定义一个变量len,并且初始化
        int len = 0;
        //判断读到末尾了吗
        while((len = fileReader.read())!=-1){
            //输出读取到的字符
            System.out.println((char)len);


        }
        //关闭流
        fileReader.close();

    }

写入字符流:

public static void main(String[] args) throws IOException {

        //创建字符输出流文件,指定输出内容
        FileWriter fileWriter = new FileWriter("out.txt");

        fileWriter.write("轻轻的我来了");
        fileWriter.write("轻轻的我又走了");

        fileWriter.close();
    }

FileWriter同FileOutputStream一样,如果指定的文件不存在,就会先创建文件,再写入数据如果文件存在,则会首先清空文件中的内容,再进行写入。如果想在文件末尾追加数据,同样需要调用重载的构造方法,现将文件2中的第5行代码进行如下修改:

FileWriter writer = new FileWriter("writer.txt",true);

字符缓冲流: BufferedReader, BufferedWriter

上面两个文件示例通过字符流的形式完成了对文件内容的读写操作,但也是逐个字符进行读写,这样也需要频繁的操作文件,效率仍非常低。这里也可以使用提供的字符流缓冲区(类似于字节流缓冲区)进行读写操作,来提高执行效率。

读取包含中文的文本文件时,可能出现中文乱码

设置编码格式

InputStreamReader fr=new InputStreamReader(fis,"UTF-8");
字符流的缓冲区实现文件的拷贝 :

每次 fileReader.read(buff) 调用都会将读取的数据从数组的开头开始填充,因此写入时始终从 0 索引开始。

 public static void main(String[] args) throws Exception {
                       // 创建FileReader对象,并指定需要读取的文件
                       FileReader fileReader = new FileReader("reader.txt");
                       // 创建FileWriter对象,并指定写入数据的目标文件
                       FileWriter fileWriter = new FileWriter("writer.txt");
                       // 定义一个int类型的变量len,其初始化值为0
                       int len = 0;
                        // 定义一个长度为1024的字符数组
                        char[] buff = new char[1024];
                        // 通过循环来判断是否读取到了文件末尾
                        while ((len = fileReader.read(buff)) != -1) {
                                // 输出读取到的字符
                                fileWriter.write(buff, 0, len);
                            }
                        // 关闭流
                        fileReader.close();
                        fileWriter.close();
    }

使用这两个缓冲流实现文件的拷贝

字符流也提供了带缓冲区的字符缓冲流,分别是BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行操作,BufferedWriter用于对字符输出流进行操作。

代码解析:

每次循环都使用readLine()方法读取文件的一行,然后通过write()方法写入目标文件,同时使用了newLine()进行换行写入,否则读取源文件所有行内容都会追加写入目标文件一行中。其中readLine()方法会逐个读取字符,当读到回车符“\r”或换行符“\n”时会将读到的字符作为一行的内容返回。

BufferedReader br =new BufferedReader(new FileReader("reader.txt"));这句不懂

 public static void main(String[] args) throws IOException {
        BufferedReader br =new BufferedReader(new FileReader("reader.txt"));

        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("writer.txt"));

        //声明一个字符串变量str
        String str = null;
        //循环时每次读取一行,如果不为null,则继续循环
        while ((str = br.readLine())!=null){
            //通过缓冲流对象写入文件
            bufferedWriter.write(str);
            //进入下一行
            bufferedWriter.newLine();
        }
        //关闭流
        br.close();
        bufferedWriter.close();
    }

转换流:

有时字节流和字符流之间也需要进行转换

在JDK中,提供了两个类用于实现将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter。

先创建字节输入流对象获取源文件,放入InputStreamReader中,再转为字符流。

  public static void main(String[] args) throws Exception {
        // 1、创建字节输入流对象,获取源文件
        FileInputStream in = new FileInputStream("reader.txt");
        // 将字节输入流对象转换成字符输入流对象
        InputStreamReader isr = new InputStreamReader(in);
        // 创建字符输入缓冲流对象
        BufferedReader br = new BufferedReader(isr);
        // 2、创建字节输出流对象,指定目标文件
        FileOutputStream out = new FileOutputStream("writer.txt");
        // 将字节输出流对象转换成字符输出流对象
        OutputStreamWriter osw = new OutputStreamWriter(out);
        // 创建字符输出缓冲流对象
        BufferedWriter bw = new BufferedWriter(osw);
        // 定义一个字符串变量
        String line = null;
        // 通过循环判断是否读到文件末尾
        while ((line = br.readLine()) != null) {
            // 输出读取到的文件1
            bw.write(line);            
            bw.newLine();
        }
        // 关闭流
        br.close();
        bw.close();
        }

InputStreamReader:

InputStreamReader构造方法:

InputStreamReader构造方法的主要作用是将字节流 (InputStream) 转换为字符流 (Reader),并允许你指定字符编码。这是因为不同的字节编码方式(如 UTF-8、ISO-8859-1)会将相同的字节序列解释为不同的字符。因此,通过 InputStreamReader,你可以确保从字节流中读取的数据以正确的字符集转换为字符,从而正确处理文本数据。

InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)

FileReader类是InputStreamReader的子类FileReader(File file)FileReader(String name)该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型

System.out.println(System.getProperty("file.encoding"));  //获得本地平台的字符编码类型

OutputStreamWriter:

读写二进制文件:

DataInputStream类

FileInputStream的子类

与FileInputStream类结合使用读取二进制文件

DataOutputStream类

FileOutputStream的子类

与FileOutputStream类结合使用写二进制文件

序列化:

可能需要将一些数据永久的保存到磁盘上,而数据在Java中都是保存在对象当中的。这时就需要使用Java中的对象序列化。

对象序列化机制可以使内存中的Java对象转换成与平台无关的二进制流,既可以将这种二进制流持久地保存在磁盘上,又可以通过网络将这种二进制流传输到另一个网络节点,其他程序在获得了这种二进制流后,还可以将它恢复成原来的Java对象。这种将I/O流中的字节序列恢复为Java对象的过程被称之为反序列化(Deserialize)。

如果想让某个对象支持序列化机制,那么这个对象所在的类必须是可序列化的。在Java中,可序列化的类必须实现Serializable或Externalizable两个接口之一。

步骤:

1.这个student类如果想要序列化,那么就必须要实现Serializable接口或者Externalizable接口

2.创建一个输出流 ObjectOutputStream对象

3.通过输出流的.writeObject()方法写入文件

4.关闭输出流

public class Student implements java.io.Serializable{
    
}
//对象序列化,写入输出流
objectOutputStream.writeObject(list);

一个对象序列化,(这里的try-catch可以用throws代替)

  public static void main(String[] args) {
        ObjectOutputStream objectOutputStream = null;//创建一个对象输出流
        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream("writer.txt"));
            Student student = new Student("陈梦雨",20,"女");
            //将对象序列化
            objectOutputStream.writeObject(student);
        } catch (IOException e) {
           e.printStackTrace();
        }finally {
            if (objectOutputStream!= null){
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();

                }
            }
        }
    }

多个对象序列化:

使用集合保存对象,可以将集合中的所有对象序列化

  public static void main(String[] args) throws IOException {

        //保存多个学生对象
        ObjectOutputStream objectOutputStream = null;//创建一个对象输出流
        objectOutputStream = new ObjectOutputStream(new FileOutputStream("writer.txt"));

        Student student = new Student("陈梦雨", 20, "女");
        Student student2 = new Student("豆豆", 21, "女");
        ArrayList<Student> list = new ArrayList<Student>();
        list.add(student);
        list.add(student2);

        //对象序列化,写入输出流
        objectOutputStream.writeObject(list);


    
    }

反序列化:

如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取

步骤:

1.实现Serializable接口

2.创建对象输入流

3.调用readObject()方法,读取对象

4.关闭输入流

一个对象序列化:
public static void main(String[] args) {
        ObjectOutputStream objectOutputStream = null;//创建一个对象输出流
        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream("writer.txt"));
            Student student = new Student("陈梦雨",20,"女");
            //将对象序列化
            objectOutputStream.writeObject(student);

        } catch (IOException e) {
           e.printStackTrace();
        }finally {
            if (objectOutputStream!= null){
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

多个对象序列化:
public static void main(String[] args) {
            ObjectOutputStream objectOutputStream = null;//创建一个对象输出流
            try {
                objectOutputStream = new ObjectOutputStream(new FileOutputStream("writer.txt"));
                Student student1 = new Student("陈梦雨",20,"女");
                Student student2 = new Student("阿豆",15,"女");
                //将对象序列化
                ArrayList<Student> arrayList = new ArrayList<>();
                arrayList.add(student1);
                arrayList.add(student2);
                //对象序列化写入流
                objectOutputStream.writeObject(arrayList);

            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if (objectOutputStream!= null){
                    try {
                        objectOutputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
一个对象反序列化:
 public static void main(String[] args) throws Exception {
        //反序列化,输出

        ObjectInputStream objectInputStream =null;
        //创建objectInputStream输入流
        objectInputStream = new ObjectInputStream(new FileInputStream("writer.txt"));
        //反序列化,进行强转
        Student stu = (Student) objectInputStream.readObject();
        //输出生成后的信息
        System.out.println("姓名"+stu.getName());
        System.out.println("年龄"+stu.getAge());
        System.out.println("性别为"+stu.getSex());

        if (objectInputStream!=null){
            objectInputStream.close();
        }
    }

多个对象反序列化:
public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建对象
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("writer.txt"));
        //反序列化进行强制类型转换
        ArrayList<Student> students = (ArrayList<Student>) objectInputStream.readObject();
       // Student stu = (Student) objectInputStream.readObject();

        //输出对象信息
        for (Student stu :students){
            System.out.println("姓名"+stu.getName());
            System.out.println("年龄"+stu.getAge());
            System.out.println("性别为"+stu.getSex());
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP一体化解决方案高效整合与优化学校管理系统小程序源码

一体化解决方案&#xff0c;让学校管理系统焕发新生✨ &#x1f3eb; 开篇&#xff1a;传统管理的瓶颈与挑战 在快节奏的教育时代&#xff0c;传统的学校管理系统是否让你感到力不从心&#xff1f;&#x1f914; 信息孤岛、流程繁琐、效率低下...这些问题是否正困扰着你的工作…

巴黎奥运会引发体育健身热潮:气膜体育馆成为新宠—轻空间

随着巴黎奥运会的成功举办&#xff0c;全球范围内掀起了一股体育健身的热潮。各地的健身场所迎来了前所未有的参与热情&#xff0c;其中&#xff0c;融合了体育、娱乐、休闲等多种业态的综合气膜体育馆因其独特的优势&#xff0c;迅速成为群众健身的新宠&#xff0c;成为了大众…

PHP一键创建全球参与探索现代在线投票系统

一键创建全球参与探索现代在线投票系统 &#x1f310;✨ &#x1f680; 开篇&#xff1a;解锁全球互动新纪元 在这个数字化飞速发展的时代&#xff0c;每一个声音都值得被听见&#xff0c;每一份意见都能跨越山海相连。想象一下&#xff0c;只需轻轻一点&#xff0c;就能发起…

如何读懂以太坊源代码

以下是一个学习以太坊源代码的清晰思路&#xff1a; 一、前期准备 基础知识储备&#xff1a; 熟悉区块链的基本概念&#xff0c;如区块、交易、共识机制、哈希函数等。了解 Go 语言&#xff08;以太坊主要使用 Go 语言编写&#xff09;的基本语法和编程概念。 工具准备&#x…

包装和类练习(1)

目录 1.移除元素 2.删除有序数组中的重复项 3.合并两个有序数组 4.实现ArrayList类 4.下列在Java语言中关于数据类型和包装类的说法&#xff0c;正确的是&#xff08;&#xff09; 5. boolean类型没有包装用的类&#xff0c;这句话是否正确&#xff1f; 1.移除元素 这里使用…

今年读过最绝的一本书!几乎把ChatGPT讲透了——<ChatGPT 从⼊⻔到精通>

这本书从⼊⻔到精通&#xff0c;介绍了 ChatGPT 的基础知识、实现⽅法、进阶应⽤以及最新进展等多个⽅⾯。 ChatGPT 作为⼀种强⼤的⾃然语⾔处理模型&#xff0c;其应⽤前景⼴泛&#xff0c;可以应⽤于⾃然语⾔⽣成、对话系统、推荐系统、知识图谱构建、智能家居、⼈⼯智能教育…

【SQL】常见语句合集

SQL常见语句合集 一. 新建表1.1 语句1.2 结果 二. 新增数据2.1 语句2.2 结果 三. 新增字段列3.1 语句3.2 结果3.3 扩展 四. 更新指定数据4.1 语句4.2 结果 五. 更新指定列5.1 语句&#xff08;长度&#xff09; 六. 删除字段列6.1 语句 七. 删除指定数据7.1 语句 八. 查询 一. …

Spring拦截器与Servlet过滤器区别

前言 温馨提醒:希望读者了解Spring拦截器和Servlet过滤器基础知识 目录 前言 位置和层面 使用场景 配置方式 生命周期 执行顺序 总结 Spring拦截器基础知识https://blog.csdn.net/Dreamkidya/article/details/141825688?spm1001.2014.3001.5501 Servlet过滤器基础知识h…

计算机视觉软件教学平台

1、基本介绍 计算机视觉软件教学平台是中智讯公司开发的一款面向人工智能相关专业机器视觉方向的综合型实验平台&#xff0c;主要满足&#xff1a;图像处理、图像识别、机器视觉应用、边缘计算应用、智能算法等课程的实验和实训&#xff0c;是基于新工科和工程教育思维和专业改…

IPv6的部署会影响现有IPv4网络的运行吗

IPv6是新一代的互联网协议&#xff0c;到现在为止&#xff0c;担心它是否会影响现有IPv4网络的运行的人不在少数。 先来了解下IPv4和IPv6的区别。IPv4使用的是32位地址&#xff0c;IPv6使用的是128位地址&#xff0c;很多人现在不理解了&#xff0c;这和地址数有关系吗&#xf…

【从零开始学爬虫】采集58同城房源数据

本文以采集北京市58同城房源数据为例进行演示&#xff1a; l 采集网站 【场景描述】采集58同城房源数据。 【使用工具】前嗅ForeSpider数据采集系统 http://www.forenose.com/view/commodity/forespider.html 【入口网址】 https://bj.58.com/xiaoqu/?PGTID0d000000-000…

【小呆的热力学笔记】理想热力循环

文章目录 5.理想热力循环5.1 卡诺定理5.2 卡诺循环5.3 逆向卡诺循环 5.理想热力循环 5.1 卡诺定理 考虑这样的一个实际的热力循环&#xff0c;其过程为存在一个高温热源&#xff0c;工作介质从该高温热源中吸取热量Q1&#xff0c;其中一部分通过工作介质对外做功转化为机械功…

idea安装并使用maven依赖分析插件:Maven Helper

在 IntelliJ IDEA 中安装并使用 Maven Helper 插件可以帮助你更方便地管理 Maven 项目的依赖&#xff0c;比如查看依赖树、排除冲突依赖等。以下是安装和使用 Maven Helper 插件的步骤&#xff1a; 安装 Maven Helper 插件 打开 IntelliJ IDEA 并进入你的项目。 在 IDE 的右下…

【408 数据结构】第1章绪论

文章目录 绪论考纲DS 基本概念1. 基本概念2. 数据结构三要素 算法&#xff08;时/空间复杂度计算&#xff09;1. 算法概念2. 算法效率的度量时间复杂度&#xff1a;空间复杂度&#xff1a; 小结 绪论 考纲 计算时间复杂度和空间复杂度&#xff08;重点难点&#xff09; DS …

简化物业数据管理:使用 Indexify 进行高级数据提取和检索

使用 Indexify 进行文档查询的分步指南。欢迎来到雲闪世界。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 总结&#xff1a; 传统的数据提取方法通常会错过非结构化内容的更深层次的见解&#xff0c;尤其是在房地产领域。 本文探讨使用 Indexify&…

Mental-LLM——通过在线文本数据利用大型语言模型进行心理健康预测

概述 源码地址&#xff1a;https://github.com/neuhai/Mental-LLM.git 论文地址&#xff1a;https://arxiv.org/abs/2307.14385 在一项关于哪些法律硕士适合精神健康护理的研究中&#xff0c;对以下五种法律硕士进行了比较 羊驼-7b。羊驼-LoRA。FLAN-T5-XXLGPT-3.5GPT-4. 作…

TLS连接的握手过程

TLS&#xff08;传输层安全协议&#xff09;握手过程是客户端&#xff08;如浏览器&#xff09;和服务器&#xff08;如网站&#xff09;之间建立安全连接的一系列步骤。以下是TLS握手的详细过程&#xff1a; 图片来自Vector 1. 客户端问候&#xff08;Client Hello&#xff0…

PHP一键发起灵活定制多功能投票小程序系统源码

​一键发起&#xff0c;灵活定制 —— 多功能投票小程序 &#x1f680;【开篇&#xff1a;告别繁琐&#xff0c;投票新体验】&#x1f680; 还在为组织投票活动而头疼不已吗&#xff1f;繁琐的流程、有限的选项、难以统计的结果...这些都将成为过去式&#xff01;今天&#x…

将python项目打包成一个可执行文件(包含需要的资源文件)

目标 项目源码是采用Python编写&#xff0c;代码中需要读取部分资源文件。现在需要将项目打包成一个exe文件&#xff0c;没有其他任何多余文件&#xff0c;仅1个exe文件。 打包 安装pyinstaller 在自己项目的虚拟环境中&#xff0c;安装pyinstaller。注意一定要是虚拟环境&…

亚马逊运营秘籍:这些冷门知识,你不可不知!

今天&#xff0c;小编将揭秘几个鲜为人知的亚马逊运营冷知识&#xff0c;让我们一同探索并学习吧&#xff01; 退货佣金扣除&#xff1a;当买家提出退货时&#xff0c;无论是部分退款还是全额退款&#xff0c;亚马逊会直接从卖家账户中扣除20%的佣金&#xff0c;剩余的80%则返还…