Java中的IO流

news2024/11/19 9:39:14

Java中的IO流

image-20221110153850629

image-20221110153902226

image-20221110153934293

image-20221110154606692

Java中的4大IO抽象类

image-20221110154710555

InputStream/OutputStream 为字节输入输出流

Reader/Writer 为字符输入输出流

InputStream

image-20221110154939666

OutputStream

image-20221110155134332

Reader

image-20221110155143360

Writer

image-20221110155255762

Java中流的概念细分

image-20221110155436935

image-20221110155503244

二进制文件(图片、影音)用字节流

文本信息用字符流

image-20221110155727756

image-20221110155747580

image-20221110155844830

IO流的体系

image-20221110160005253

image-20221110160358045

image-20221110160621062

练手案例

public class FirstDemo {
    public static void main(String[] args) throws IOException {
        // 创建字节输入流对象
        InputStream fileInputStream = new FileInputStream("D:\\桌面\\新建文本文档.txt");
        int s1;
        while ((s1 = fileInputStream.read())!=-1){
            System.out.println(s1);
            System.out.println((char)s1);
        }
        fileInputStream.close();
    }
}

File类

image-20221110165608105

针对文件操作的方法

image-20221110165645626

image-20221112203454845

针对目录的方法

image-20221110165850740

常用流对象

文件字节流

实现文件拷贝

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream stream = new FileInputStream("D:\\桌面\\a.png");
        OutputStream outputStream = new FileOutputStream("D:\\桌面\\aa.jpg");
        int tem = 0;
        while((tem = stream.read()) != -1){
            System.out.println(tem);
            outputStream.write(tem);
        }
        outputStream.flush();
        stream.close();
        outputStream.close();
    }
}

通过缓冲区提高读写效率

方式一:

image-20221112213859286

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream stream = new FileInputStream("D:\\桌面\\a.png");
        OutputStream outputStream = new FileOutputStream("D:\\桌面\\aa.jpg");
        int tem = 0;
        byte[] buffer = new byte[1024];
        while((tem = stream.read(buffer)) != -1){  // 数组装满返回长度,装不满返回-1
            outputStream.write(buffer,0,tem);// 将buffer中0到tem的数据写入
        }
        outputStream.flush();
        stream.close();
        outputStream.close();
    }
}

方式二:

image-20221112213922859

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream stream = new FileInputStream("D:\\桌面\\a.png");
        OutputStream outputStream = new FileOutputStream("D:\\桌面\\aa.png");
        int tem = 0;
        byte[] buffer = new byte[stream.available()]; //  stream.available()是该文件的预估大小
        stream.read(buffer);
        outputStream.write(buffer);
        outputStream.flush(); // 将内存转入磁盘
        stream.close();
        outputStream.close();
    }
}

通过字节缓冲流提高效率

缓冲流为处理流

image-20221112215208687

缓冲区中,默认有一个数组,默认为8192

public class Test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\桌面\\a.png");
        FileOutputStream fos = new FileOutputStream("D:\\桌面\\aa.png");
        BufferedInputStream bis  = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int tem = 0;
        while ((tem = bis.read()) != -1){
            bos.write(tem);
        }
        bos.flush();
        bos.close();
        bis.close();
        fis.close();
        fos.close();
    }
}

定义文件拷贝工具类

public static void copyFile(String src,String des) throws IOException {
    FileInputStream fis = new FileInputStream(src);
    FileOutputStream fos = new FileOutputStream(des);
    BufferedInputStream bis = new BufferedInputStream(fis);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    int temp = 0;
    while ((temp = bis.read()) != -1){
        bos.write(temp);
    }
    bos.flush();
    bis.close();
    bos.close();
    fis.close();
    fos.close();
}

文件字符流

文件字节流可以处理所有的文件,但是处理文本文件时,我们也可以使用文件字符流,他以字符为单位进行操作。

实现文件拷贝

public class readerwriter {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("D:\\桌面\\a.txt");
        FileWriter fileWriter = new FileWriter("D:\\桌面\\aa.txt");
        int temp = 0;
        while ((temp = fileReader.read()) != -1){
            fileWriter.write(temp);
        }
        fileWriter.write("\r\n");// 回车换行
        fileWriter.write("hhhhhhhhhhhhhhhh");
        fileWriter.flush();
        FileWriter fileWriter2 = new FileWriter("D:\\桌面\\aa.txt",true); // 不加true默认覆盖,加了true为在尾部添加
        fileWriter2.write("houyiming");
        fileWriter2.flush();
        fileReader.close();
        fileWriter.close();
        fileWriter2.close();
    }
}

缓冲区提高效率

public class readerwriter {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("D:\\桌面\\a.txt");
        FileWriter fileWriter = new FileWriter("D:\\桌面\\aa.txt");
        int temp = 0;
        char[] buffer = new char[1024];
        while ((temp = fileReader.read(buffer)) != -1){
            fileWriter.write(buffer,0,1024);
        }
        fileWriter.flush();
        fileReader.close();
        fileWriter.close();
    }
}

字符缓冲流

image-20221113192247909

image-20221113192631565

实现文件拷贝:

public class readerwriter {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("D:\\桌面\\a.txt");
        FileWriter fileWriter = new FileWriter("D:\\桌面\\aa.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        String temp = "";
        while ((temp = bufferedReader.readLine()) != null){
            bufferedWriter.write(temp);
            bufferedWriter.newLine();
        }
        bufferedWriter.flush();
        bufferedReader.close();
        bufferedWriter.close();
        fileReader.close();
        fileWriter.close();
    }
}

转换流

image-20221115193320563

public class ConvertStream {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String s = bufferedReader.readLine();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
        bufferedWriter.write(s);
        bufferedWriter.flush();
        bufferedReader.close();
        bufferedWriter.close();
    }
}

字节流读取文件并添加行号

public class ConvertStream {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\桌面\\a.txt")));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\桌面\\aa.txt")));
        String s = "";
        int i = 1;
        while ((s = bufferedReader.readLine()) != null){
            bufferedWriter.write(i+++": "+s);
            bufferedWriter.newLine();
        }
        bufferedWriter.flush();
        bufferedWriter.close();
        bufferedWriter.close();
    }
}

字符输出流

节点流。

image-20221115201524367

加行号:

public class ConvertStream {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\桌面\\a.txt")));
        PrintWriter printWriter = new PrintWriter("D:\\桌面\\aa.txt");
        String s = "";
        int i = 1;
        while ((s = bufferedReader.readLine()) != null){
            printWriter.println(i+++": "+s);
        }
        printWriter.close();
        bufferedReader.close();
    }
}

字节数组流

image-20221115203535081

public static void main(String[] args) throws IOException {
    byte[] bytes = "abcdefg".getBytes();
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
    StringBuilder stringBuilder = new StringBuilder();
    //stringBuilder可以使用append的方法不断地添加元素创建字符串
    int temp = 0;
    while ((temp = byteArrayInputStream.read()) != -1){
        stringBuilder.append((char)temp);
    }
    System.out.println(stringBuilder.toString());
}

image-20221115204702047

public static void main(String[] args) throws IOException {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    byteArrayOutputStream.write('a');
    byteArrayOutputStream.write('b');
    byteArrayOutputStream.write('c');
    byte[] arr = byteArrayOutputStream.toByteArray();
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
}

数据流

image-20221115210439566

image-20221115210446615

public static void main(String[] args) throws IOException {
    DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\桌面\\a1.txt")));
    dos.writeInt(1);
    dos.writeChar('a');
    dos.writeDouble(9.99);
    dos.writeUTF("houyiming");
    dos.flush();
    dos.close();
    DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("D:\\桌面\\a1.txt")));
    // 注意:读取的顺序要与写入的顺序一致。
    System.out.println(dis.readInt());
    System.out.println(dis.readChar());
    System.out.println(dis.readDouble());
    System.out.println(dis.readUTF());
}

对象流

image-20221116185152801

对象的序列化和反序列化

image-20221116185241793

序列化:将java对象转化为字节序列

反序列化:将字节序列还原为java对象

image-20221116185556346

image-20221116185705305

操作基本数据类型

之前学的数据流只能对基本数据类型进行操作,但是对象流不仅可以操作基本数据类型,还可以操作Java对象。

public static void main(String[] args) throws IOException {
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\桌面\\a1.txt")));
    objectOutputStream.writeInt(1);
    objectOutputStream.writeBoolean(true);
    objectOutputStream.writeChar('a');
    objectOutputStream.writeUTF("aaaaaaaaaaa");
    objectOutputStream.flush();
    ObjectInputStream objectInputStream = new ObjectInputStream(new BufferedInputStream(new FileInputStream("D:\\桌面\\a1.txt")));
    // 读出的顺序要与写入的顺序一致
    System.out.println(objectInputStream.readInt());
    System.out.println(objectInputStream.readBoolean());
    System.out.println(objectInputStream.readChar());
    System.out.println(objectInputStream.readUTF());
    objectInputStream.close();
    objectOutputStream.close();
}

操作对象

public static void main(String[] args) throws IOException, ClassNotFoundException {
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\桌面\\a2.txt"));
    Users users = new Users(1,"hym","22");
    objectOutputStream.writeObject(users); // 序列化到外部
    objectOutputStream.flush();
    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\a2.txt"));
    // 反序列化
    Users users1 = (Users) objectInputStream.readObject();
    System.out.println(users1.toString());
    objectInputStream.close();
    objectOutputStream.close(); 
}

随机访问流

image-20221116201017668

3个核心的方法:

image-20221116202221096

public static void main(String[] args) throws IOException, ClassNotFoundException {
    RandomAccessFile randomAccessFile = new RandomAccessFile("D:\\桌面\\aa.txt","rw");
    // 将数据写入文件
    int[] ints = new int[]{1,2,3,4,5,6,7,8,9,10};
    for (int i = 0; i < ints.length; i++) {
        randomAccessFile.writeInt(ints[i]);
    }
    randomAccessFile.seek(4);//整数占4个字节,将指针移动到4,为2的第一个字节。
    System.out.println(randomAccessFile.readInt());
    // 在第八个字节位置替换
    randomAccessFile.seek(8);
    randomAccessFile.writeInt(33);
    randomAccessFile.close();
}

ApacheIO包

下载与添加commons-IO包

下载地址:Commons IO – Download Apache Commons IO

image-20221116204813754

选择commons-io-2.11.0.jar加入即可

这个地方显示即为成功

image-20221116205148136

FileUtils的使用

image-20221116205336679

image-20221116205403537

image-20221116205519925

读取txt文件并以字符串形式输出:

public static void main(String[] args) throws IOException {
    String s = FileUtils.readFileToString(new File("D:\\桌面\\a.txt"),"utf-8");
    System.out.println(s);
}

IOUtils的使用

image-20221116211000999

image-20221116211043442

image-20221116211135493toString方法的使用:

public static void main(String[] args) throws IOException {
    String s = IOUtils.toString(new FileInputStream("d:\\桌面\\a.txt"),"utf-8");
    System.out.println(s);
}

总结

image-20221116211621290

image-20221116211640282

image-20221116211654354

image-20221116211749378

image-20221116211847790

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

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

相关文章

HTML入门

目录1 HTML快速入门1.1 HTML 的介绍1.1.1 HTML 的组成标签属性1.2 入门案例1.2.1 案例效果1.2.2 实现步骤1.3 总结2 HTML 基本语法2.1 HTML 的注释2.2 HTML 标签2.3 HTML 的属性2.4 HTML 的特殊字符3 HTML 案例 新闻文本3.1 案例效果3.2 案例分析3.2.1 div 样式布局3.2.2 文本标…

软件测试面试真题 | Selenium 的工作原理是什么?

搜索微信公众号&#xff1a;TestingStudio 霍格沃兹的干货都很硬核 Selenium 通常被我们用做测试web的自动化测试工具&#xff0c;其实 Selenium 不仅仅是个API&#xff0c;它是一组工具集合&#xff0c;它是由三大组件组成 WebDriver: 可以模拟真正的用户去操作浏览器页面&am…

机械转码日记【24】继承

目录 前言 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 4.1构造函数 5.设计一个不能被继承的类 6.继承与…

瑞吉外卖(三) 分类管理

瑞吉外卖 分类管理瑞吉外卖 分类管理 需求分析自动填充 代码思想ThreadLocal 的 引入瑞吉外卖 分类管理 需求分析 对于当前的多个Model&#xff0c;存在了多个相同的字段 比如说&#xff1a;更新时间&#xff0c;创建时间&#xff0c; 更新人等 这些重复的业务可以通过统一的接…

已有项目eclipse开发配置步骤

已有项目eclipse开发配置步骤 前提&#xff1a;jdk8安装、tomcat8安装 1、eclipse打开已有项目 File->import->Existing Projects into Workspace 说明&#xff1a;我这里已经打开项目了 2、配置Properties 项目根目录右击->点击Properties Java Build Path -&…

【僵尸进程和文件系统调用】

目录虚拟空间物理空间僵尸进程僵尸进程产生僵尸进程的解决孤儿进程文件系统调用虚拟空间物理空间 内存与磁盘的运行速度1&#xff1a;20 x86 32位 4G–> 物理内存&#xff1a;寻址能力4G 4G供内核1G&#xff0c;用户态的3G&#xff0c; 虚拟空间4G&#xff0c;虚拟空间可以…

周阳老师JUC并发编程

1. 序章 1&#xff09;JUC是什么&#xff1f; java.util.concurrent在并发编程中使用的工具包 对JUC知识的高阶内容讲解和实战增强 2&#xff09;为什么学习并用好多线程极其重要&#xff1f; 硬件方面&#xff1a; 摩尔定律: 它是由英特尔创始人之一Gordon Moore(戈登摩尔…

Linux 下编译实现C/Fortran调用动态库

目录 FORTRAN语言 生成动态库Demo 查看动态库中的函数 Fortran语言 FORTRAN语言是Formula Translation的缩写&#xff0c;意为“公式翻译”。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的&#xff0c;其数值计算的功能较强。 FORTRAN语言是…

样式补充(精灵图、背景图片、阴影),项目前置认知、结构搭建

一、网页制作 根目录 图片文件夹&#xff1a;images 样式文件夹&#xff1a;CSS 首页&#xff1a;index.html <link rel"stylesheet" href"./CSS/index.css"> 二、项目样式补充 1. 精灵图 场景&#xff1a;项目中将多张小图片&#xff0c;合并…

基于粒子群算法训练常规自动编码器附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

docker安装mysql,tomcat,redis,nginx

docker安装常用应用安装mysql解决docker mysql5.7中文乱码的问题开启防火墙指定端口docker MySQL容器被删除后数据恢复docker 配置MySQL主从创建master创建slave配置主从测试安装tomcat安装redis安装nginx安装mysql docker安装之前&#xff0c;需要查看宿主机上是否已安装&…

基于matlab仿真多普勒效应及其影响(附源码)

目录 一、介绍 二、估计直升机的叶片速度 三、直升机回声模拟 四、叶片返回微多普勒分析 五、汽车雷达中的行人识别 六、行人微多普勒提取 七、总结 八、程序 本例介绍了由于目标旋转而对目标进行雷达回波时微多普勒效应的基本概念。可以使用微多普勒特征来帮助识别目标…

UE4 回合游戏项目 16- 控制玩家

在上一节&#xff08;UE4 回合游戏项目 15- 生成玩家、控制玩家&#xff09;基础上&#xff0c;继续完善控制玩家的步骤 步骤&#xff1a; 1.打开1lantu&#xff0c;将Alpha的值设为1&#xff0c;这样玩家控制的角色会随着鼠标的移动而产生一个偏头的效果 2.接下来给角色添加…

java设计模式之原型模式

一&#xff1a;原型模式 1.什么是原型模式? 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 基本介绍 1.原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0…

STM32CubeMX学习笔记(47)——USB接口使用(MSC基于内部Flash模拟U盘)

一、USB简介 USB&#xff08;Universal Serial BUS&#xff09;通用串行总线&#xff0c;是一个外部总线标准&#xff0c;用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、…

数据库知识之图的创建以及各种遍历、生成树的形成

利用邻接矩阵创建图并打印输出利用递归完成dfs算法遍历利用非递归完成bfs算法遍历利用prim算法得出最小生成树利用kruskal算法得出最小生成树 #include <iostream> #include <cstdlib>//包含一些特定函数 #include <string> //邻接矩阵结构存储图 #defin…

量子计算(六):量子计算软件介绍

文章目录 量子计算软件介绍 一、量子语言 二、量子软件开发包 三、量子云平台 量子计算软件介绍 一、量子语言 由于当前量子计算机的通用体系架构未得到统一&#xff0c;在硬件层面上的技术路线也未最终确定&#xff0c;所以目前还无法确定哪种量子机器指令集相对更科学、…

2010年408大题总结

2010年408大题第41题第42题第43题第44题第45题第46题第47题第41题 这个考的是散列表&#xff08;巧了&#xff0c;我没复习&#xff0c;这就去看&#xff09; 第一个要记住的是装填因子&#xff0c;关键字个数/装填因子 数组长度 第二个是线性探测再散列&#xff0c;表示如果当…

Android App开发之安全加固中反编译、代码混淆、第三方加固以及重签名的讲解及实战(图文解释 简单易懂)

觉得有帮助请点赞关注收藏~~~ 一、反编译 编译是把代码编译为程序&#xff0c;反编译是把程序破解为代码。 下面介绍反编译的完整过程 首先准备反编译的三个工具&#xff0c;分别是apktool&#xff0c;dex2jar&#xff0c;jd-gui 注意下载它们的最新版本 apktool 对APK文件解…

ASEMI整流桥UD6KB100,UD6KB100尺寸,UD6KB100特征

编辑-Z ASEMI整流桥UD6KB100参数&#xff1a; 型号&#xff1a;UD6KB100 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1000V RMS反向电压VR(RMS)&#xff1a;700 平均整流输出电流&#xff08;IO&#xff09;&#xff1a;6A 峰值正向浪涌电流&#xff…