【Java基础】IO流

news2024/9/22 15:46:38

IO流

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

最后一定要关闭流,防止资源泄露

字节流

一次读取1字节,8比特

FileInputStream



import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

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

    }
    //单个字节的读取
    @Test
    public void test1() throws IOException{
        FileInputStream in = null;
        FileOutputStream out = null;
        String path="src\\single\\in.txt";
        String dpath="src\\single\\out.txt";
        try {
            in = new FileInputStream(path);
            //String,boolean true追加;false覆盖,默认
            out = new FileOutputStream(dpath,true);
            int datacode;
            //read()一次读取一个字节,返回读取字节的ASCII码,返回-1,表示读取完毕
            while ((datacode = in.read()) != -1) {
                System.out.println(datacode);//输出ASCII码 例如  a 是97 ;一个汉字是3个字节
                System.out.println((char)datacode);
                out.write(datacode);
            }

        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
    @Test
    public void test2() throws IOException{
        FileInputStream in = null;
        FileOutputStream out = null;
        String path="src\\single\\in.txt";
        String dpath="src\\single\\out.txt";
        try {
            in = new FileInputStream(path);
            out = new FileOutputStream(dpath);
            //一次读取多个字节,返回读取字节的长度
            byte[] buf=new byte[2];
            int datalen=0;
            while((datalen=in.read(buf))!=-1){
                System.out.println(datalen);
                System.out.println(new String(buf,0,datalen));
                out.write(buf,0,datalen);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

字符流

FileReader

package file;

import org.junit.jupiter.api.Test;

import java.io.*;

public class FileReader_ {
    public static void main(String[] args) {
    }
    //单个字符
    @Test
    public void readFile01() {
        String filePath = "src\\file\\in.txt";
        String dPath="src\\file\\out.txt";
        FileReader fileReader = null;
        FileWriter fileWriter=null;
        int datacode = 0;
        //1. 创建 FileReader 对象
        try {
            fileReader = new FileReader(filePath);
            fileWriter=new FileWriter(dPath);
            //循环读取 使用 read, 单个字符读取
            while ((datacode = fileReader.read()) != -1) {
                System.out.print(datacode);
                System.out.println((char) datacode);
                fileWriter.write(datacode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileReader != null) {
                    fileReader.close();
                }
                if(fileWriter!=null){
                    //这里一定要关闭,才会写入  或者flush   
                    //close 等价于  flush + close
                    //底层还是字节流
                    fileWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void readFile02() {
        String filePath = "src\\file\\in.txt";
        String dPath="src\\file\\out.txt";
        FileReader fileReader = null;
        FileWriter fileWriter=null;

        int readLen = 0;
        char[] buf = new char[8];
        //1. 创建 FileReader 对象
        try {
            fileReader = new FileReader(filePath);
            fileWriter=new FileWriter(dPath,true);
            //循环读取 使用 read(buf), 返回的是实际读取到的字符数
            //如果返回-1, 说明到文件结束
            while ((readLen = fileReader.read(buf)) != -1) {
                System.out.print(new String(buf, 0, readLen));
                fileWriter.write(buf,0,readLen);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileReader != null) {
                    fileReader.close();
                }
                if(fileWriter!=null){
                    fileWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

处理流

BufferedReader

在这里插入图片描述

在这里插入图片描述

处理流以节点流为基础,提供了更加强大的功能

package file;

import java.io.*;

/**
 * @author 韩顺平
 * @version 1.0
 * 演示 bufferedReader 使用
 */
public class BufferedReader_ {
    public static void main(String[] args)  {
        String filePath = "src\\file\\in.txt";
        String dPath="src\\file\\out.txt";
        //创建 bufferedReader
        BufferedReader bufferedReader =null; 
        BufferedWriter bufferedWriter=null;
        try {
            bufferedReader=new BufferedReader(new FileReader(filePath));
            bufferedWriter=new BufferedWriter(new FileWriter(dPath));
            //读取
            String line; //按行读取, 效率高
            //说明
            //1. bufferedReader.readLine() 是按行读取文件
            //2. 当返回 null 时,表示文件读取完毕
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
                bufferedWriter.write(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            
                //关闭流, 这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭 节点流
                try {
                    if(bufferedReader!=null) {
                        bufferedReader.close();
                    }
                    if(bufferedWriter!=null){
                        bufferedWriter.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            

        }
       

    }
}

打印流

PrintWriter

也是一种处理流

打印流只有输出流,没有输入流

打印到显示器或文件

PrintStream out = System.out;
//在默认情况下,PrintStream 输出数据的位置是 标准输出,即显示器
/*
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
*/
out.print("john, hello");
//因为 print 底层使用的是 write , 所以我们可以直接调用 write 进行打印/输出
out.write("韩顺平,你好".getBytes());

//我们可以去修改打印流输出的位置/设备
//1. 输出修改成到 "e:\\f1.txt"
//2. "hello, 韩顺平教育~" 就会输出到 e:\f1.txt
//3. public static void setOut(PrintStream out) {
// checkIO();
// setOut0(out); // native 方法,修改了 out
// }
System.setOut(new PrintStream("e:\\f1.txt"));
System.out.println("hello, 韩顺平教育~");

out.close();//flush + 关闭流, 才会将数据写入到文件.

标准输入输出流

System.in

System.out

System.in System.out System.err
程序启动时创建,退出时关闭。
不需要程序员关闭

package single;

import org.junit.jupiter.api.Test;

import java.util.Scanner;

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

    }

    @Test
    public void test1(){
        Scanner scanner = new Scanner(System.in);
        /*
        System.in
        System 的public final static InputStream in = null;
        编译类型InputStream
        运行类型BufferedInputStream
        标准输入是键盘
        */

        System.out.println();
        /*
        System.out
         System 的 public final static PrintStream out = null;
         编译类型PrintStream
         运行类型PrintStream
         标准输出是屏幕
         */

    }

}

ObjectOutputStream

对象处理流

序列化
是将对象的状态信息转换为可以存储或传输的二进制形式的过程。
就是在保存数据的时候,保存数据的值和数据类型
反序列化
将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程
就是在恢复数据的时候,恢复数据的值和数据类型

需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:

  • Serializable //这是一个标记接口(没有方法),推荐
  • Externalizable //有方法,他也实现了Serializable
@Test

public void objectoutputstream() throws Exception{

    //序列化后的文本格式,是按他自己的方式

    String path="D:\\IDEA_file\\Learn_8\\src\\file\\Files\\file5.dat";

    ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(path));

    oos.write(100);//int->Integer,实现了Serializable

    oos.writeBoolean(false);//boolean->Boolean,实现了Serializable

    oos.writeChar('7');//char->Character,实现了Serializable

    oos.writeDouble(9.8);//double->Double,实现了Serializable

    oos.writeUTF("china");//String,实现了Serializable

    oos.writeObject(new Dog("wnag",19));

    //关闭流

    oos.close();

}

}

//要想数据可序列化,必须继承Serializable

class Dog implements Serializable {

String name;

int age ;

public Dog(String name, int age) {

    this.name = name;

    this.age = age;

}

}

如果有些字段不想进行序列化,

对于不想进行序列化的变量,使用 transient 关键字修饰。

transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。

关于 transient 还有几点注意:

  • transient 只能修饰变量,不能修饰类和方法。
  • transient 修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰 int 类型,那么反序列后结果就是 0
  • static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化。

serialVersion

  • serialVersionUID作用是什么以及如何生成的? - 腾讯云开发者社区-腾讯云 (tencent.com)
  • serialVersionUID 是干什么的? - 知乎 (zhihu.com)
  • (46条消息) idea如何一键自动生成序列化serialVersionUID_秋竹的博客-CSDN博客_idea 生成serialversionuid

序列化运行时与每个可序列化类关联一个版本号(称为 serialVersionUID),该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否已加载与序列化兼容的类。如果接收方为对象加载了一个类,该类的串行版本UID与相应发送方的类的类不同,则反序列化将导致无效类异常,可序列化类可以通过声明一个名为 的字段来显式声明自己的串行VersionUID,该字段必须是静态的、最终的和类型:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
不能被继承

转换流

inputStremReader

把字节流转换成字符流

字节流可以指定编码格式,可以处理中文乱码等情况

public class InputStreamReader_ {
public static void main(String[] args) throws IOException {
String filePath = "e:\\a.txt";
//解读
//1. 把 FileInputStream 转成 InputStreamReade
//2. 指定编码 gbk
//InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");
//3. 把 InputStreamReader 传入 BufferedReader
//BufferedReader br = new BufferedReader(isr);
//将 2 和 3 合在一起
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(filePath), "gbk"));
//4. 读取
String s = br.readLine();
System.out.println("读取内容=" + s);
//5. 关闭外层流
br.close();
    

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

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

相关文章

2023最新网络工程师面试大全,全都答得上offer绝对拿到手软

一、目录 TCP和UDP都可以实现客户端/服务端通信,这两个协议有何区别? 是第几层的协议,其作用是什么? 请说一下FTP,SSH,TELNET,DNS,HTTP,HTTPS,SMTP协议的端口…

我的三周年创作纪念日——学习不止,创作不停

机缘 最开始写文章博客,是为了用输出倒逼自己输入。 从校园离开后,才逐渐意识到学习的不容易。没有写好的教材课程、没有画好的考点重点,没有一起学习的同学,更没有明确的学习方向和路径。 数据分析方向可以学的东西太多了&…

SUMO安装并实现交通仿真Demo

sumo简介sumo是一种开源,微观,多模态的交通模拟仿真软件,每辆车都是明确建模的,有自己的路线,并在网络独立移动下载安装sumo前往sumo官网下载,如下图红色标注所示,一键安装。实现Demo3.1加载道路文件.net.x…

软件工程学习

文章目录前言软件特点分类软件工程软件危机项目管理工具总结前言 本博客仅做学习笔记,如有侵权,联系后即刻更改 科普: 软件 软件的定义 软件不是程序,而是程序、数据以及开发、使用和维护程序需要的所有文档的完整集合。 特点 …

100份简历才找一个合适的,2023,软件测试岗位饱和了吗?

各大互联网公司的接连裁员,政策限制的行业接连消失,让今年的求职雪上加霜,想躺平却没有资本,还有人说软件测试岗位饱和了,对此很多求职者深信不疑,因为投出去的简历回复的越来越少了。 另一面企业招人真的…

为什么启动一个线程不用run()方法,而是用start()方法

在使用java多线程时,有三种方式创建线程 复习传送门 当使用继承Thread来实现多线程时, 我们会把线程执行的代码写在run() 方法中, 使用Thread的start()方法来启动一个线程。 代码如下: public class ThreadDemo extends Thread{O…

RocketMQ快速入门:消息发送、延迟消息、消费重试

一起学编程,让生活更随和! 如果你觉得是个同道中人,欢迎关注博主gzh:【随和的皮蛋桑】。 专注于Java基础、进阶、面试以及计算机基础知识分享🐳。偶尔认知思考、日常水文🐌。 目录1、RocketMQ消息结构1.1…

算法训练营 day50 动态规划 单词拆分 多重背包理论基础

算法训练营 day50 动态规划 单词拆分 多重背包理论基础 单词拆分 139. 单词拆分 - 力扣(LeetCode) 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词…

佳能iC MF645CX彩色激光多功能打印机报E302-0001故障码检修

故障现象: 一台佳能iC MF645CX彩色激光多功能一体机开机报E302-0001故障代码,如果设备未恢复,请联系经销商或客户支持中心。 维修分析: 佳能iC MF645CX彩色激光多功能一体机开机报E302-0001故障代码的

java中NumberFormat 、DecimalFormat的介绍及使用,java数字格式化,BigDecimal数字格式化

文章目录前言一、NumberFormat1、概述2、实例化方法3、货币格式化4、百分比格式化5、NumberFormat的坑5.1、不同的格式化对象处理相同数值返回结果不同问题源码分析:二、DecimalFormat1、概述2、常用方法3、字符及含义0与#的区别分组分隔符的使用“%” 将数字乘以10…

Python 基本数据类型(二)

1. 列表 列表是 Python 最常用的数据类型,它是有序元素的集合,元素之间以逗号分隔,用中括号括起来,可以是任何数据类型。同时它也是一种序列,支持索引、切片、加、乘和成员检查等。 **数组:**数据类型必须…

程序员的接单外卖平台

今天王同学给大家安利一款非常实用并且能接单的一款非常好的平台—— 独自开 独自开的功能非常之多 简直不要太香~ 集成第三方数学接口,形成标准化解决方案,提供开发者调用 支付分账功能电子签单功能税务接口硬件接口 独自开的开发功能简直不要太多~ 如…

LinkedList集合对元素进行增、查、删操作

ArrayList集合在查询元素时速度很快,但在增删元素时效率较低,为了克服这种局限性,可以使用List接口的另一个实现类LinkedList。LinkedList集合内部包含有两个Node类型的first和last属性维护一个双向循环链表,在链表中的每一个元素…

Python机器学习入门笔记(3)—— 线性回归

目录 线性回归 算法简述 LinearRegression() API SGDRegressor API LinearRegression() 和 SGDRegressor对比 过拟合与欠拟合 岭回归 应用场景 线性回归 算法简述 线性回归是一种基本的机器学习算法,它用于建立自变量和因变量之间的线性关系模型。它假设…

【Linux系统】第七篇:Linux调试器gdb的使用

文章目录一、gdb简介二、gdb的安装三、gdb使用3.1、release和debug版本3.2、gdb基本使用命令1、启动gdb2、调试命令3、显示代码(list)4、断点命令(breakpoint)5 、变量命令(variable)6、特殊调试命令7、调用…

企业微信的聊天机器人来了,免费下载(Python版)

大家好,这里是程序员晚枫,个人网址:python-office.com 上次分享了微信机器人的视频以后,视频下面有一个热门评论: 什么时候开发企业版微信机器人?自动回复、自动群发等等~ 在经历了一段时间的查找和开发以…

Github隐藏功能:显示自己的README,Github 个人首页的 README,这样玩儿

内容概览 前言创建仓库修改 README 的内容总结前言 大家最近有没有发现这个现象,有些名人的 Github 首页变得更丰富了?尤其是那个夺目的 README 板块!!! 请看,这是 iOS 喵神 的 Github 首页: …

Flink-时间和窗口(水位线、窗口、迟到数据的处理等)

文章目录时间和窗口时间水位线(Watermark)时间和窗口水位线有序和无序流的插入水位线生成策略(Watermark Strategies)水位线的传递窗口(Window)窗口窗口的分类窗口API概述窗口分配器(Window Ass…

“离开浪浪山”是假象,80%年轻人下班后还在学习,真实是想先上个山。

最近,又有一个关于年轻人与职场的新词横空出世—— 浪浪山。 什么是浪浪山? 每个人心中都有一座浪浪山。 浪浪山,其实是人生的一种状态,步入社会时满腔热血,然而很快就被现实给修理了一顿;想要辞职不干出去…

Eclipse各版本安装Tomcat插件全攻略

Eclipse Tomcat 插件的作用 Eclipse Tomcat 插件可以将Tomcat 集成到Eclipse中,插件安装之后在Eclipse中可以看到类似下面的几个图标: Eclipse Tomcat 插件的主要作用有: 在Eclipse 中可以直接启动,关闭和重启本机的Tomcat可以…