JavaSE 面向对象程序设计进阶 IO流 字节流详解 抛出异常

input output 像水流一样读取数据

存储和读取数据的解决方案

内存中数据不能永久化存储 程序停止运行 数据消失

File只能对文件本身进行操作 不能读写文件里存储的数据

读写数据必须要有IO流

可以把程序中的数据保存到文件当中

还可以把本地文件中的数据读取到数据当中

分类

流的方向

输入流 读取

输出流 写出

操作文件类型

字节流 操作所有类型的文件

字符流 只能操作纯文本文件

纯文本文件时用微软自带的记事本打开能读的懂的文件

基本用法

写一段文字到本地文件当中

需要把文件放到包下 先创建文件

import java.io.FileOutputStream;
import java.io.IOException;public class Main {public static void main(String[] args) throws IOException {//抛出异常//本地文件FileOutputStream fos=new FileOutputStream("untitled1\\a.txt");fos.write(97);//父类异常fos.close();//释放资源}
}

创建对象时 会根据路径让程序和文件产生通道

之后我们即可以进行数据的传输

当使用了close方法后 相当于切断了通道

写出数据的细节

创建字节输出流对象

1.参数是字符串表示的路径或者是File对象都是可以的

2.如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

3.如果文件已经存在,则会清空文件

写数据

1.write 方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

97 -> a

100 -> d

释放资源

是IO流中每一种流都要使用

每一次使用完流后,都要释放IO流

如果不释放流

会显示,操作无法完成,文件已经在Java Platform SE binary中打开

释放资源就是解决了资源的占用

总结

字节输出流FileOutputStream

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);FileOutputStream f=new FileOutputStream("untitled1\\a.txt");byte arr[]=new byte[]{97,98,99};f.write(arr,1,2);f.close();//文件中是bc}
}

写出数据的几个问题

1.把字符串写入文件

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);FileOutputStream f=new FileOutputStream("untitled1\\a.txt");String str="Dduo";String s=new String("Dduo");byte[] bytes = str.getBytes();//把字符串获取成字节数组f.write(bytes);f.close();}
}

window系统

\r 表示回车

\n 表示换行

Linux系统

\n换行

Mac系统

\r换行

在window操作系统中,java对换行进行了优化,虽然完整的是\r\n,但是我们写其中一个\r或者\n

java也可以实现换行,因为java在底层会进行补全

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);FileOutputStream f=new FileOutputStream("untitled1\\a.txt");String s1=new String("Dduo");byte[] bytes1 = s1.getBytes();f.write(bytes1);String s2=new String("\r\n");byte[] bytes2 = s2.getBytes();f.write(bytes2);String s3=new String("666");byte[] bytes3 = s3.getBytes();f.write(bytes3);f.close();}
}

创建对象时第二个参数就是续写开关

默认数值是false 表示关闭续写 此时创建对象会清空文件

手动传递true表示打开续写,此时创建对象的时候不会清空文件

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);while(true){FileOutputStream f=new FileOutputStream("untitled1\\a.txt",true);String s1=new String("Dduo666");byte[] bytes1 = s1.getBytes();f.write(bytes1);String s2=new String("\r\n");byte[] bytes2 = s2.getBytes();f.write(bytes2);f.close();}}
}

这样会输出44万行 直到文本文档的大小达到2.56MB

小结

字节输入流FileInputStream

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);//创建对象FileInputStream fis=new FileInputStream("untitled1\\a.txt");//读取数据int b1 = fis.read();System.out.println((char) b1);fis.close();}
}

read方法负责读取文件当中的数据

如果读不到了 返回-1

写入数据的细节

如果文件不存在就会直接报错

Java为什么会这么设计呢

输出流:不存在,创建

输入流:不存在,报错 因为创建出来的数据是没有数据的没有任何意义 这种逻辑没有意义

读取数据

一次读一个字节

读出来的数据是在ASCII上对应的数字

读到文件末尾了,read方法返回的是-1

如果是空格 则读取空格所对应的ASCII码30

如果是负数 则会先读取符号 不会当做一个整体

释放资源

每一次使用完流必须要释放资源

字节输入流循环读取

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);//创建对象FileInputStream fis=new FileInputStream("untitled1\\a.txt");int b;while((b=fis.read())!=-1) System.out.print((char) b);}
}

定义一个变量b

read方法表示读取数据。并且读取一次就移动一次指针

和迭代器相似

所以要用第三方变量接收

文件拷贝 (挨个字节拷贝)

拷贝文件夹到指定的文件当中

先开的流最后关闭

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);long start=System.currentTimeMillis();//写入FileOutputStream fos=new FileOutputStream("untitled1\\a.txt");//读取FileInputStream fis=new FileInputStream("untitled1\\b.txt");int b;while((b=fis.read())!=-1) fos.write(b);long end=System.currentTimeMillis();//获取当前系统的时间System.out.println("运行时间为:"+(end-start));//先开的流最后关fis.close();fos.close();}
}

FileInputStream读取的问题

拷贝一次只能读写一个字节

速度太慢了

可以用字节数组

一次读一个字节数组的数据,我们要尽可能将字节数组填满

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);long start=System.currentTimeMillis();//读取FileInputStream fis=new FileInputStream("untitled1\\b.txt");//创建字节数组byte []bytes=new byte[7];System.out.println(fis.read(bytes));System.out.println(new String(bytes));long end=System.currentTimeMillis();System.out.println("运行时间为:"+(end-start)+"毫秒");//先开的流最后关fis.close();}
}

输出结果是7个字节

其中换行回车一共是2个字节 一个英文字母是一个字节

如果越界了 读取不到东西 数组元素就不会改变

read方法如果读取不到数据就会返回-1

文件拷贝代码改写

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);long start=System.currentTimeMillis();//写入FileOutputStream fos=new FileOutputStream("untitled1\\a.txt");//读取FileInputStream fis=new FileInputStream("untitled1\\b.txt");int b;byte []bytes=new byte[1024*1024*5];while((b=fis.read(bytes))!=-1) fos.write(bytes,0, b);long end=System.currentTimeMillis();//获取当前系统的时间System.out.println("拷贝成功");System.out.println("运行时间为:"+(end-start));//先开的流最后关fis.close();fos.close();}
}

后两个参数是防止读取不到东西导致把上一次存入字节数组的数据又写入文件

try...catch异常处理

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner sc=new Scanner(System.in);long start=System.currentTimeMillis();//获取当前系统的时间FileOutputStream fos=null;FileInputStream fis=null;try {//写入fos=new FileOutputStream("untitled1\\a.txt");//读取fis=new FileInputStream("untitled1\\b.txt");int b;byte []bytes=new byte[1024*1024*5];while((b=fis.read(bytes))!=-1) fos.write(bytes,0, b);long end=System.currentTimeMillis();//获取当前系统的时间System.out.println("拷贝成功");System.out.println("运行时间为:"+(end-start)+"毫秒");} catch (IOException e) {throw new RuntimeException(e);} finally {if(fos!=null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}if(fis!=null)try {fis.close();} catch (IOException e) {e.printStackTrace();}}//先开的流最后关}}

代码复杂

我们需要学习一下设计思想

释放资源过于复杂

AutoCloseable接口

以后所有的异常我们都是抛出处理

个人号推广

博客主页

朱道阳-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

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

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

相关文章

闭眼投!IF逐年上涨,国人录用率超高,无预警风险,平均8周录用!

本周投稿推荐 SCI • 能源科学类,1.5-2.0(25天来稿即录) • CCF推荐,4.5-5.0(2天见刊) • 生物医学制药类(2天逢投必中) EI • 各领域沾边均可(2天录用&#xff09…

Linux--网络设置

目录 一、测试网络连接 1、查看网络接口信息 1.1 ifconfig 命令---查看网络接口信息 1.1.1 ifconfig 网卡 #单独查看某个网卡 1.1.2 ifconfig -a #显示所有活动及非活动的连接 二、修改网络配置文件 三、设置网络接口参数 3.1 启用、禁用网络接口配置 3.2 hostn…

设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)

写在前面:本文是个人在学习设计模式时的所思所想,汇总了其他博主及自己的感悟思考,可能存在出入,请大家理性食用~~ 工厂模式 在工厂模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类&#xf…

[终端安全]-7 后量子密码算法

本文参考资料来源:NSA Releases Future Quantum-Resistant (QR) Algorithm Requirements for National Security Systems > National Security Agency/Central Security Service > Article Commercial National Security Algorithm Suite 2.0” (CNSA 2.0) C…

领域驱动设计DDD

为什么要DDD 传统MVC 传统的MVC模型框架拆分成了三层:显示层、控制层、模型层。显示层负责显示用户界面,控制层负责处理业务逻辑、而模型则负责与数据库通信,对数据进行持久化的操作。从代码角度来看,这样的框架结构每个模块职责…

【漏洞复现】WordPress插件Recall CVE-2024-32709 SQL注入漏洞

0x01 产品简介 WordPress是一款免费开源的内容管理系统(CMS),最初是一个博客平台,但后来发展成为一个功能强大的网站建设工具,适用于各种类型的网站,包括个人博客、企业网站、电子商务网站等,并逐步演化成一款内容管理…

小白学c嘎嘎(第二天)入门基础下

温馨提醒:本篇文章起,文章内容排版将更新,层层深入 基础知识 回顾 引用的语法格式:类型& 引⽤别名 引⽤对象; 引用特性 1. 引⽤在定义时必须初始化 2. ⼀个变量可以有多个引⽤ 3. ⼀旦引⽤⼀个实体,再不…

STM32(二):STM32工作原理

0、参考1、寄存器和存储器基本概念(1)基本概念(2)主要区别(3)联系(4)实际应用中的案例(5)总结(6)一些名词解释 2、STM32指南者板子-存…

ArcGis将同一图层的多个面要素合并为一个面要素

这里写自定义目录标题 1.加载面要素的shp数据 2.点击菜单栏的地理处理–融合,如下所示: 3.将shp面要素输入,并设置输出,点击确定即可合并。合并后的属性表就只有一个数据了。

怎样卸载电脑上自带的游戏?

卸载电脑上自带的游戏通常是一个简单的过程,以下是几种常见的方法,您可以根据自己的操作系统版本选择相应的步骤进行操作: 方法一:通过“设置”应用卸载(适用于Windows 10和Windows 11) 1. 点击开始菜单&…

设计模式之外观模式(Facade)

Facade设计模式,也称为外观模式,是一种结构型设计模式,它主要用于为子系统中的一组接口提供一个统一的高层接口,从而使得子系统更加容易使用。以下是关于Facade设计模式的详细介绍: 一、定义 Facade模式为多个复杂的…

基于Android平台开发,购物商城

1. 项目功能思维导图 2. 项目涉及到的技术点 使用SQLite数据库实现数据存储使用CountDownTimer实现启动页倒计时使用SharedPreferences实现记住密码登录使用BottomNavigationView实现底部导航栏使用ActivityFragment实现底部导航栏页面之间切换使用RecyclerViewadapter实现商品…

无人机之穿越机注意事项篇

一、检查设备 每次飞行前都要仔细检查穿越机的每个部件,确保所有功能正常,特别是电池和电机。 二、遵守法律 了解并遵循你所在地区关于无人机的飞行规定,避免非法飞行。 三、评估环境 在飞行前检查周围环境,确保没有障碍物和…

在openSUSE-Leap-15.6-DVD-x86_64下停用USB无线网卡驱动rtw88_8822bu改用rtl88x2bu

在openSUSE-Leap-15.6-DVD-x86_64下停用USB无线网卡驱动rtw88_8822bu改用rtl88x2bu 一、openSUSE-Leap-15.6-DVD-x86_64自带USB无线网卡驱动rtw88_8822bu能够正常上网但不能让USB无线网卡内置小灯闪蓝光 当有数据流量通过USB无线网卡,其内置小灯会不断闪蓝光的&…

前端复刻百度网址精简版HTML+CSS

案列图&#xff1a; 自制效果图&#xff1a; 源代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

雷达视频采集卡 HPx-410

产品简介 雷达视频采集卡 HPx-410&#xff0c;应用于接入导航雷达数据&#xff0c;导航雷达视频&#xff0c;适用于JRC雷达、古野furuon雷达、Sperry雷达等多种型号的雷达。 HPx-410 可以接入导航雷达数据&#xff0c;引入导航雷达原始回波&#xff0c;然后将雷达视频采集到计…

如何用IP地址申请SSL证书实现网络安全

互联网是一个全球性的网络&#xff0c;它将世界各地的计算机系统和设备连接在一起。在这个庞大的网络中&#xff0c;每个设备都需要一个唯一的标识符&#xff0c;即IP&#xff08;Internet Protocol&#xff09;地址&#xff0c;以便其他设备能够找到并与其通信。然而&#xff…

C# + halcon 联合编程示例

C# halcon 联合编程示例 实现功能 1.加载图像 2.画直线&#xff0c;画圆&#xff0c;画矩形, 画椭圆 ROI&#xff0c;可以调整大小和位置 3.实现找边&#xff0c;找圆功能 效果 开发环境 Visual Studio 2022 .NET Framework 4.8 halcondotnet.dll 查看帮助文档 项目结构 DL…

探索东芝 TCD1304DG 线性图像传感器的功能

主要特性 高灵敏度和低暗电流 TCD1304DG 具有高灵敏度和低暗电流&#xff0c;非常适合需要精确和可靠图像捕捉的应用。传感器包含 3648 个光敏元件&#xff0c;每个元件尺寸为 8 m x 200 m&#xff0c;确保了出色的光灵敏度和分辨率。 电子快门功能 内置的电子快门功能是 T…

力扣爆刷第162天之TOP100五连刷76-80(最小路径和、最长公共前缀、最长连续序列)

力扣爆刷第162天之TOP100五连刷76-80&#xff08;最小路径和、最长公共前缀、最长连续序列&#xff09; 文章目录 力扣爆刷第162天之TOP100五连刷76-80&#xff08;最小路径和、最长公共前缀、最长连续序列&#xff09;一、64. 最小路径和二、221. 最大正方形三、162. 寻找峰值…