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

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读取一行数据,一行无了就返回nullwhile ((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.mzph.cn/news/168852.shtml

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

相关文章

java中关键字 volatile 和 synchronized 有什么区别

java中 volatile 和 synchronized 有什么区别?

uniapp H5、小程序、APP端自定义不同运行环境(开发、测试、生产)、自定义条件编译平台、以及动态修改manifest.json值讲解

文章目录 前言一、自定义条件编译平台是什么?二、新增自定义条件编译平台三、动态设置服务器请求地址四、动态修改manifest.json1.根目录新增文件 modifyManifest.js2.vue.config.js引入modifyManifest.js 总结示例代码 前言 企业项目开发流程上一般都要配置多个运…

npm WARN npm npm does not support Node.js v13.9.0

Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>node -v v13.9.0C:\Users\Administrator>npm -v npm WARN npm npm does not support Node.js v13.9.0 npm WARN npm You should probably upgrade to a newe…

NX二次开发UF_CURVE_ask_combine_curves 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_combine_curves Defined in: uf_curve.h int UF_CURVE_ask_combine_curves(tag_t combine_curve_feature, tag_t * first_curve_tag, UF_CURVE_combine_curves_directi…

Pycharm 教育版下载

1 访问 Jetbrains 主站-->Developer Tools-->PyCharm JetBrains: Essential tools for software developers and teams 2 页面往下划找到 PyCharm for Education-->CHECK IT OUT! PyCharm: the Python IDE for Professional Developers by JetBrains 3 点击 Downloa…

水淹七军(递归,又是递归)

北大2023级最强新生问我的,最后他的问题说是重写了一遍就解决了 乐死了,有的时候根本看不出源代码漏了哪里 我的思路是: 一个数组记录本次放水所经过的格子,经过的不再递归 一个数组记录地图上各地点的高度 一个数组记录地图…

vue3 for循环创建的多个e-form 添加校验

v-for 创建 ref <el-form :model"item" :rules"state.rules" :ref"el > getRiskSpreadRef(el, index)" ></el-form>// 定义ref list const riskSpreadRefList ref<HTMLElement[]>([]);// ref存到数组 const getRiskSpread…

物流公司打印用什么软件,佳易王物流运单打印管理系统软件下载

物流公司打印用什么软件&#xff0c;佳易王物流运单打印管理系统软件下载 软件特色&#xff1a; 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。 2、物流开单打印&#xff0c;可以打印两联单或三联单&#x…

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

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

c语言:模拟实现各种字符串函数

strlen函数&#xff1a; 功能&#xff1a;获取到\0之前的的字符个数。 代码模拟实现函数&#xff1a; //strlen //这里用了递归法&#xff0c; //如abc&#xff0c;1bc&#xff0c;然后11c&#xff0c;接着111&#xff0c;最后读取到\0&#xff0c;1110&#xff0c;得到结果3…

使用Linux JumpServer堡垒机本地部署与远程访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装Jump server二. 本地访问jump server三. 安装 cpolar内网穿透软件四. 配…

宝塔 Linux 面板安装一个高大上的论坛程序 —— Flarum

这个是很早搭建的版本,基于宝塔面板,比较复杂,如果想要简单的搭建方法,可以参看咕咕新写的这篇: 【好玩的 Docker 项目】10 分钟搭建一个高大上的论坛程序 购买腾讯云轻量应用服务器 待补充 登录服务器 待补充 BBR 加速脚本 BBR 加速脚本: BASH cd /usr/src &…

京东数据采集接口推荐(京东大数据分析工具)

随着京东电商平台的不断发展&#xff0c;平台中店铺数量也越来越多&#xff0c;对于电商卖家而言&#xff0c;在电商运营过程中如何做好数据分析也越来越重要。而电商运营数据往往多而杂&#xff0c;想要高效的完成电商数据分析&#xff0c;品牌需要借助一些电商数据分析软件。…

毅速:复杂零件制造首选3D打印

确金属3D打印技术在制造行业的应用日益广泛&#xff0c;为制造业带来了巨大的变革和机遇。这种增材制造技术相较于传统制造工艺具有许多优势&#xff0c;尤其在制造复杂形状零件方面表现出色。 传统制造工艺在制造复杂形状零件时往往面临诸多挑战&#xff0c;如加工难度大、周期…

高性能Mysql第三版学习(一)

学习目标&#xff1a; 高性能Mysql第3版 学习内容&#xff1a; MySQL架构与历史Mysql基座测试服务器性能Schema与数据类型优化创建高性能的索引查询性能优化Mysql高级特性Explain 学习时间&#xff1a; 周一至周五晚上 9点—晚上10点周六晚上9点-10点周日晚上9 点-10点 学习…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-5:队列)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

Linux【安全 01】云服务器主机安全加固(修改SSHD端口、禁用登陆失败的IP地址、使用密钥登录)

云服务器主机安全加固 1.SSH登录尝试的系统日志信息2.安全加固方法2.1 修改SSHD端口2.2 禁用登陆失败的IP地址2.3 使用密钥登录 3.总结 1.SSH登录尝试的系统日志信息 Last failed login: Sat Oct 7 14:10:39 CST 2023 from xxx.xx.xx.xxx on ssh:notty There were 10 failed …

ORA-14452: 试图创建, 变更或删除正在使用的临时表中的索引

在编写一个test存储过程中出现一个错误报告:ORA-14452: 试图创建, 变更或删除正在使用的临时表中的索引,代码如下 create or replace PROCEDURE TMP_TRANSCRIPT AS str_sql varchar2(500);v_flag number:0; --标识 begin--判断临时表是否存在SELECT COUNT(*) into v_flag FROM…

信息收集小练习

信息收集小练习 本文章无任何恶意攻击行为&#xff0c;演示内容都合规无攻击性 演示如何绕过cdn获取真实ip 使用多地ping该网站 发现有很多ip地址&#xff0c;证明有cdn 此处使用搜索引擎搜索&#xff0c;得到ip 演示nmap工具的常用参数 此处以testfire.net为例 使用多地p…

Vue3的计算属性(computed)和监听器(watch)案例语法

一&#xff1a;前言 Vue3 是 Vue2 的一个升级版&#xff0c;随着 2023年12月31日起 Vue2 停止维护。这意味着 Vue3 将会为未来国内一段时间里&#xff0c;前端的开发主流。因此熟练的掌握好 Vue3 是前端开发程序员所不可避免的一门技术栈。而 Vue3 是 Vue2 的一个升级版&#x…