逸学java【初级菜鸟篇】10.I/O(输入/输出)

news2024/11/17 15:32:25

hi,我是逸尘,一起学java吧


目标(任务驱动)

1.请重点的掌握I/O的。

场景:最近你在企业也想搞一个短视频又想搞一个存储的云盘,你一听回想到自己对于这些存储的基础还不是很清楚,于是回家开始了复习基础。

我们前面学习了变量,数组,集合,但是我们发现那些都是暂时存在的,一旦关闭电脑或者程序,那么就会空空如也。那么我们想要不丢失文件,永久的存储程序创建的数据,就需要保存到磁盘中,也就是内存数据存储到磁盘文件中,我们也称之为持久化。我们可以使用java的I/O技术将数据保存到文本,二进制文件,甚至是zip压缩包中,达到永久保存。

流是一组有序的数据序列     (我们之前的Stream是处理流,不是这个流。)

可以理解为在计算机中两个不同位置之间建立的一个通道·,该通道用于传输数据。

输入输出流

我们根据流操作的正反方向划分,我们可以分为输入和输出流两种。

如果我们想对象序列化,程序内容对象到磁盘等外部,我们是输出流,正向的。

ps;我们以程序为根本(锚点)外部为目标  判断方向,所以是输出

反而言之反序列化就是输入流,反向的。

 虽然说I/O流通常是与磁盘文件存取有关,但是也可以是鼠标键盘内存或者显示器为目的地/源。

字符字节流

我们在最开始的章节学习了,计算机底层存储只能是二进制的,字节(Byte)是二进制数据的单位,一个字节存储8位无符号数,我们也学习了字符集,在不同的编码方式下,一个字符占的字节可能不一样,以UTF-8的编码来看,中文一般占三个字节。

我们根据数据单位规格来区分又可以分为字符流和字节流。

总结

 那么根据这些划分的不同,我们可以整理一下IO流体系

I/O流体系

 我们的字节流可以做一切的文本数据拷贝,但是不适合读文本内容,涉及到处理字符文本我们优先考虑字符流(英文一个字节还好说,但是中文不是,那么就适合直接使用字符为单位处理)。

 一些方法

读的API

写的API 

File类 

我们介绍了,I/O流,我们发现需要获取文件,文件夹在磁盘的定位,用来获取或者删除,或者其他操作信息。在java中,我们有File类定义了一些用来操作文件的方法。

它有三种常用的构造方法

相对路径和绝对路径

绝对路径:以windows操作系统为例,包括盘符在内的文件或文件目录的完整路径,固定的位置。

或者可以右键鼠标的属性找到


相对路径:相对于某一个文件目录来讲的相对的位置,它是依靠一个文件作为一个定位。
在idea中,如果使用单元测试方法:相对于当前的module来讲
如果使用main()方法:相对于当前的project来讲

 创建一个文件

package com.yd.yc;

import java.io.File;

public class FileOne {
    public static void main(String[] args) {
        //注意绝对路径名前要用\\ 而不是\
        // "/" 分隔符,"\" 转义字符
//        File file = new File("D:\\aaa.txt");
        File file = new File("D:/aaa.txt");
        //相对路径请按照自己项目
//        File file = new File("src\\com\\yd\\yc\\8888.txt");
        if (file.exists()){
            file.delete();
            System.out.println("文件删除");
        }else{
            try {
                file.createNewFile();
                System.out.println("文件已创建");
            }catch (Exception e){
                e.printStackTrace();
            }

        }



    }
}

有的朋友相对路径不正确,看看自己的运行工作目录

需要注意一下的是在运行配置地址

工作目录要注意一下

常见的其他File的一些API

需要注意一下

 还有一个

public file[] listfiles()

获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回 

package com.yd.yc;

import java.io.File;

public class FileTwo {
    public static void main(String[] args) {
        File file = new File("src\\com\\yd\\yc");
        File fileOne = new File("src\\com\\yd\\yc\\www");
        if (file.exists()){
            //创建一个一级文件夹
            fileOne.mkdir();
            String name = file.getName();//获取文件名称
            file.length();//获取文件长度
            file.isHidden();//是否是隐藏文件
            file.lastModified();//最后修改文件的时间
            File[] files = file.listFiles();//获取文件目录西安
            for (File o:  files){
                System.out.println(o.getName());
            }
            System.out.println("文件夹名称 "+name);
        }else{
            System.out.println("文件不存在");
        }

    }
}

输入输出字节流

回到我们的I/O流,我们在字节流中有两个实现类FileInputStream和FileOutPutStream接下来我们要介绍一下这两个类

FileInputStream和FileOutPutStream

这两个类分别提供了操作磁盘文件的读和写的能力(相对简单的读文件可以使用FileInputStream)

 

示例一 读写操作

package com.yd.yc;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class IoOne {
    public static void main(String[] args) {
        File file = new File("src\\com\\yd\\yc\\8888.txt");
        try {
            //写
            //创建一个字节输出流
            FileOutputStream out = new FileOutputStream(file);
            //字节  内存对象数据
            //String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。
            byte[] buy="家人们谁懂呀,我真的要无语死了".getBytes();
            //FileOutputStream的写方法
            out.write(buy);
            //关闭字节流
            out.close();

            //读
            //创建一个字节输入流
            FileInputStream in = new FileInputStream(file);
            //缓存字节数组,如果不够中文是三个字节,4个字节会乱码一个
            byte[] buffer=new byte[4];
            //FileInputStream的写方法
            int read = in.read(buffer);
            System.out.println(new String(buffer,0,read));
            
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

示例二 拷贝资源

/**
 * 拷贝资源
 */

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class CopyDemo {
    public static void main(String[] args) {
        //创建一个字节输入流管道(接入原视频)
        try {
            FileInputStream is = new FileInputStream("C:\\迅雷云盘\\b站\\666.flv");
        //接通目标(复制)
            FileOutputStream os = new FileOutputStream("one/src/new.flv");
        //定义一个字节数组转移数据
            byte[] buffer=new byte[1024];
            int len;//记录读取字节数
            while ((len=is.read(buffer))!=-1){
                os.write(buffer,0,len);
            }
            System.out.println("复制完毕");
            os.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输入输出字符流

FileReader和FileWriter

字符流中有Reader抽象类是输入流处理字符的简化,Writer也是输出流的字符简化,他们对应的两个实现类FileReader和FileWriter,接下来我们要介绍一下这两个类

字符流读取文本特别是中文不会出现乱码的情况,但是性能比较慢

package com.yd.yc;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class IoTwo {
    public static void main(String[] args) throws IOException {
        //写出,程序输出流,创建一个字符输出流的管道
        FileWriter fileWriterOne = new FileWriter("src\\com\\yd\\yc\\8888.txt");
        //源数据
        String word="大江东去浪淘尽";
        fileWriterOne.write(word);
        fileWriterOne.close();

        //读,程序输入流
        FileReader fileReaderOne = new FileReader("src\\com\\yd\\yc\\8888.txt");
        //缓存字符数组
        char[] buffer = new char[1024];
        int len;
        //读入(放入)缓存数组中,      如果读完就返回-1,没读完继续
        //buffer中可能就有[大江东去浪淘尽]
        while ((len=fileReaderOne.read(buffer))!=-1){
            String s = new String(buffer, 0, len);
            System.out.println(s);

        }
        fileReaderOne.close();
    }
}

总结一下

 

高级流

在之前我们所学的是基础流 ,我们接下来学习高级流,需要注意的是高级流是要 包装低级流的

缓冲流

我们之前学习的流都是属于基础流,性能其实不是最好的,缓冲流读写数据的性能会更好一些 。
缓冲流也称为高效流 或者高级流。之前学习的字节流可以称为原始流。缓冲流自带缓冲区, 以提高原始字节流,字符流读写数据的性能。

字节缓冲流性能优化原理:
字节缓冲输入流自带了8kb缓冲池,以后我们直接从缓冲池读取数据,所以性能较好。
字节缓冲输出流自带了8kb缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了。

package com.yd.yc;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class IoSix {
    public static void main(String[] args) throws Exception {
        File file = new File("src\\com\\yd\\yc\\8888.txt");
        //低级流
        FileReader fileReader = new FileReader(file);
        //包装低级流
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String len;
       //readLine读取一行数据,一行无了就返回null
        while ((len=bufferedReader.readLine())!=null){
            System.out.println(len);
        }
        bufferedReader.close();
    }
}

对象序列化与反序列化

那么学习流的其他内容,我们先谈谈序列化

序列化不一定要持久化,但是序列化为持久化做了格式的处理

与之相反还有反序列化,我们将磁盘中的对象数据恢复到内存对象中。

对象字节输出流objectoutputstram,在实现序列化对象的要求是对象必须实现序列化接口,

implements Serializable

对象反序列化用到了对象字节输入流objectlnputstram 类方法是 public object readobject() 

package com.yd.yc;

import java.io.*;

public class IoFive {
    public static void main(String[] args) throws Exception {
        Employee employee = new Employee("小尘", 40, 1111, "男", "环卫工");
        File file = new File("src\\com\\yd\\yc\\999.txt");
        //字节输出流,管道
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        //对象序列化,管道包装成高级流,高级输出流
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        //调用序列化方法
        objectOutputStream.writeObject(employee);
        //释放资源
        objectOutputStream.close();
        System.out.println("序列化完成");

        //低级流 输入流 对程序输入
        FileInputStream inputStream = new FileInputStream(file);
        //变成高级流
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        //方法读
        Object o = objectInputStream.readObject();
        System.out.println(o);

    }
}

打印流

打印流一般是指:printstream,printWrite两个类,该对象具有特有的方法,print println可以打印任何数据类型的数据。

特有的printf方法可以保持任意类型的数据表现形式的原样性,将数据输出到目的地(而Out

putStream父类中的write是将数据的字节写出去)

可以实现打印什么数据就是什么数据。

什么时候用?当需要保证数据表现的原样性时,就可以使用打印流的打印方法来完成,保证(表现形式)原样性的原理:其实就是将数据变成字符串,再进行写入操作。

package com.yd.yc;

import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class IoSeven {
    public static void main(String[] args) throws FileNotFoundException {
        //1.创建打印流
        PrintWriter pw=new PrintWriter("src\\com\\yd\\yc\\8888.txt");
        //2.打印
        pw.println(97);
        pw.println(true);
        pw.println(3.14);
        pw.println('a');
        pw.flush();
        //3.关闭
        pw.close();
        System.out.println("打印完毕");

    }

}

转换流

如果我们的代码和文件编码不一致,字符流读取会乱码,这个时候需要我们的转换流。

我们先获取原有的字节流,使用转化流且参数可以指定编码,这样就不会乱码了。

package com.yd.yc;

import java.io.*;

public class IoSeven {
    public static void main(String[] args) throws Exception {
        //1.创建字节输出流
        OutputStream ot = new FileOutputStream("src\\com\\yd\\yc\\8888.txt");
        //2.转换流
        OutputStreamWriter ott = new OutputStreamWriter(ot,"UTF-8");
        //3.再用缓冲流包装一下
        BufferedWriter otts = new BufferedWriter(ott);

        otts.write("我爱我的祖国");
        otts.close();
    }

}

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

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

相关文章

linux shell操作 - 05 IO 模型

文章目录 流IO模型阻塞IO非阻塞IOIO多路复用异步IO网络IO模型 流 可以进行IO(input输入、output输出)操作的内核对象;如文件、管道、socket…流的入口是fd (file descriptor); IO模型 阻塞IO, 一直等待,…

基于Vue+SpringBoot的数字化社区网格管理系统

项目编号: S 042 ,文末获取源码。 \color{red}{项目编号:S042,文末获取源码。} 项目编号:S042,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 源码 & 项目录屏 二、功能模块三、开发背景四、系统展示五…

Swing程序设计(6)边界布局,网格布局

文章目录 前言一、布局介绍 1.边界布局2.网格布局3.网格组布局.总结 前言 Swing程序中还有两种方式边界布局,网格布局供程序员使用。这两种布局方式更能体现出软件日常制作的排列布局格式。 一、布局介绍 1.BorderLayout边界布局 语法:new BorderLayout …

解决几乎任何机器学习问题 -- 学习笔记(组织机器学习项目)

书籍名:Approaching (Almost) Any Machine Learning Problem-解决几乎任何机器学习问题 此专栏记录学习过程,内容包含对这本书的翻译和理解过程 我们首先来看看文件的结构。对于你正在做的任何项目,都要创建一个新文件夹。在本例中,我 将项目命名为 “p…

使用Perplexity AI免费白嫖GPT4的使用次数((智能搜索工具)

一、Perplexity AI是什么 Perplexity AI是一款高质量的智能搜索工具,它可以为用户提供简洁清晰的搜索体验。Perplexity AI内置了基于GPT-4的Copilot搜索功能,用户可以在每四个小时使用五次(白嫖GPT-4)。此外,Perplexity AI有免费和付费&#…

Python是个什么鬼?朋友靠它拿了5个offer

闺蜜乐乐,外院科班出身,手持专八和CATTI证书,没想到找工作时却碰了钉子… 半夜12点,乐乐跟我开启了吐槽模式: 拿到offer的都是小公司的翻译活儿,只能糊个口。稍微好点的平台要求可就多了,不仅语…

以“防方视角”观文件上传功能

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自微信公众号“NearSec”,记录的某师傅接到一个hw项目,在充分授权的情况下,针对客户的系统进行渗透测试…

java计算下一个整10分钟时间点

最近工作上遇到需要固定在整10分钟一个周期调度某个任务,所以需要这样一个功能,记录下 package org.example;import com.google.gson.Gson; import org.apache.commons.lang3.time.DateUtils;import java.io.InputStream; import java.util.Calendar; i…

原型 原型对象 原型链

在面向开发对象开发过程中对每一个实例添加方法,会使每一个对象都存在该添加方法造成空间浪费 通过对原型添加公共的属性或方法,使所有实例对象都可访问 原型为了共享公共的成员 prototype 原型: JS为每个构造函数提供一个属性prototype(原型),它的值…

Redis与Mysql的数据强一致性方案

目的 Redis和Msql来保持数据同步,并且强一致,以此来提高对应接口的响应速度,刚开始考虑是用mybatis的二级缓存,发现坑不少,于是决定自己搞 要关注的问题点 操作数据必须是唯一索引 如果更新数据不是唯一索引&#…

原生小程序图表

原生小程序使用图表 话不多说直接进入正题 官方文档: https://www.ucharts.cn/v2/#/ 下载文件 首先去gitee上把文件下载到自己的项目中 https://gitee.com/uCharts/uCharts 找到微信小程序和里面的组件 把里面src下的文件全部下载下来放入自己项目中 项目文件 新建文件…

hdlbits系列verilog解答(Exams/m2014 q4h)-44

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路: 二、verilog源码 module top_module (input in,output out);assign out in;endmodule三、仿真结果 转载请注明出处!

java集合,ArrayList、LinkedList和Vector,多线程场景下如何使用 ArrayList

文章目录 Java集合1.2 流程图关系1.3 底层实现1.4 集合与数组的区别1.4.1 元素类型1.4.2 元素个数 1.5 集合的好处1.6 List集合我们以ArrayList集合为例1.7 迭代器的常用方法1.8 ArrayList、LinkedList和Vector的区别1.8.1 说出ArrayList,Vector, LinkedList的存储性能和特性1.…

【最新版】SolidWorks 2023 SP5.0 完整版安装包+安装教程

分享模式:免费/绿色,按教程安装 下载地址: https://pan.xunlei.com/s/VNL0-DD_ogcRFwy-xi0HUtlyA1?pwdfzqw# 提取码:fzqw SOLIDWORKS 2023新版本对电脑配置要求 更多详细说明请去官网查看。 安装使用方法: 一、卸…

还不会配置Nginx?刷完这篇就够了

Nginx是一个开源的高性能HTTP和反向代理服务器。它可以用于处理静态资源、负载均衡、反向代理和缓存等任务。Nginx被广泛用于构建高可用性、高性能的Web应用程序和网站。它具有低内存消耗、高并发能力和良好的稳定性,因此在互联网领域非常受欢迎。 为什么使用Nginx…

从 RBAC 到 NGAC ,企业如何实现自动化权限管理?

随着各领域加快向数字化、移动化、互联网化的发展,企业信息环境变得庞大复杂,身份和权限管理面临巨大的挑战。为了满足身份管理法规要求并管理风险,企业必须清点、分析和管理用户的访问权限。如今,越来越多的员工采用移动设备进行…

Python Web开发基础知识篇

一,基础知识篇 本片文章会简单地说一些python开发web中所必须的一些基础知识。主要包括HTML和css基础、JavaScript基础、网络编程基础、MySQL数据库基础、Web框架基础等知识。 1,Web简介 Web,全称为World Wide Web,也就是WWW,万…

入选数据结构与算法领域内容榜第26名

入选数据结构与算法领域内容榜第26名

【广州华锐互动】Web3D云展编辑器能为展览行业带来哪些便利?

在数字时代中,传统的展览方式正在被全新的技术和工具所颠覆。其中,最具有革新意义的就是Web3D云展编辑器。这种编辑器以其强大的功能和灵活的应用,正在为展览设计带来革命性的变化。 广州华锐互动开发的Web3D云展编辑器是一种专门用于创建、编…

【【linux C 编程记述 之 VIM的用法讲述】】

linux C 编程记述 之 VIM的用法讲述 我们所说的编写代码包括两部分:代码编写和编译,在Windows下可以使用Visual Studio来完成这两部,可以在 Visual Studio 下编写代码然后直接点击编译就可以了。但是在 Linux 下这两部分是分开的&#xff0c…