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://xiahunao.cn/news/3226364.html

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

相关文章

白酒营销策划全攻略:从市场调研到执行落地的实战指南!

为白酒品牌做营销策划,那可得像给自家的孩子挑衣服一样,得量身定制,得考虑孩子的身材、喜好,还得看看衣服的款式和布料。 这里可以分享一点自己多年的实战干货给你,希望对你有所帮助。 首先,得做好“侦查…

【常见开源库的二次开发】一文学懂CJSON

简介: JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集,但是JSON是独立于语言的,这意味着尽管JSON是由JavaScript语法衍生出来的,它可以被任何编程语言读取和生成…

CentOS7系统上安装MySQL8.0(rpm-bundle.tar)详细过程

一、MySQL官网下载安装包 1.进入官网MySQL :: Download MySQL Community Server 2.查看自己的版本和架构 uname -mcat /etc/redhat-release 3.选择对应版本并下载 4.查看linux自带的mariadb数据库,有就卸载掉。 rpm -qa | grep mariadbrpm -e mariadb-libs…

【卡尔曼滤波】高斯白噪声

生成高斯白噪声并将其应用于信号处理 生成高斯白噪声并将其应用于信号处理 #以下是一个生成高斯白噪声并将其应用于信号处理的示例代码:import numpy as np import matplotlib.pyplot as plt import matplotlib.font_manager ## not work#notice matplotlibrc is a file, not…

学生选课管理系统(Java+MySQL)

技术栈 Java: 用于实现系统的核心业务逻辑。MySQL: 作为关系型数据库,用于存储系统中的数据。JDBC: 用于Java程序与MySQL数据库之间的连接和交互。Swing GUI: 用于创建图形用户界面,提升用户体验。 系统功能 我们的学生选课管理系统主要针对学生和管理…

突破传统:实现智慧校园实习单位变更

在智慧校园的实习管理系统设计中,充分考虑到了实习阶段学生可能遇到的实际需求,特别是实习单位变更这一灵活性要求,系统特设了一套完善的在线处理机制,旨在促进学生、学校与企业间的顺畅沟通与协调,确保实习过程的平稳…

Gmail邮件提醒通知如何设置?有哪些方法?

Gmail邮件提醒通知功能怎么样?通知邮件怎么有效发送? Gmail作为全球广泛使用的电子邮件服务,提供了多种邮件提醒通知功能,帮助用户不错过重要信息。AokSend将详细介绍如何设置Gmail邮件提醒通知,确保您不会错过任何重…

IT审计必看!对比旧版,CISA考试改版升级亮点和重点内容是什么?

官方通知,今年8月1日,CISA新版考纲正式上线,旧版在7月23日后就无法约考了。 艾威培训邀请了国内知名的IT审计CISA授课老师吴老师来为大家详细讲解CISA新版考纲的变化 目前第28th版教材只有英文版,中文版尚未发布。我们艾威经验丰…

【NOI-题解】1108 - 正整数N转换成一个二进制数1290 - 二进制转换十进制1386 - 小丽找半个回文数1405 - 小丽找潜在的素数?

文章目录 一、前言二、问题问题:1108 - 正整数N转换成一个二进制数问题:1290 - 二进制转换十进制问题:1386 - 小丽找半个回文数问题:1405 - 小丽找潜在的素数? 三、感谢 一、前言 本章节主要对进制转换的题目进行讲解…

【UNI-APP】阿里NLS一句话听写typescript模块

阿里提供的demo代码都是javascript,自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式 startClient:开始听写,注意下一步要尽快开启识别和传数据,否则6秒后会关闭 startRecognition…

javascript高级部分笔记

javascript高级部分 Function方法 与 函数式编程 call 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象。 说明:call 方法可以用来代替另一个对象调用一个方法。cal…

侯捷C++面向对象高级编程(下)-2-non-explicit one argument constructor

1.构造函数 构造函数: Fraction(int num, int den 1) 初始化分子和分母,允许指定分子 num 和可选的分母 den。默认情况下,分母为 1。 加法运算符重载: Fraction operator(const Fraction& f) 重载了加法运算符 。这使得两个 Fraction 对象可以通过 …

NodeJS校园快递智能互助平台-计算机毕业设计源码58554

摘 要 随着校园人口的增加和生活节奏的加快,校园快递成为一个重要的服务需求。然而,传统的校园快递方式存在一些问题,例如无法满足快速和高效的需求,易发生丢失或损坏的情况,同时也给快递人员和用户带来不便。因此&am…

成功登上主要中心化交易所 (CEX) 的终极指南:从准备到上市的全面策略

对于区块链项目的创始人而言,成功的代币发行是项目发展的关键一步。尤其是在主要中心化交易所 (CEX) 上上市代币,可以极大地提高项目的曝光度和流动性。然而,CEX 上市过程复杂且充满挑战,需要创始人提前做好充分准备。本文将详细介…

JavaSE语法 | 初识Java!!!

初识Java 一、Java开发环境二、初步认识Java的main方法2.1 main方法的实现2.2 运行Java程序 三、注释四、标识符五、关键字 一、Java开发环境 IDEA版本:IntelliJ IDEA Community Edition 2022.3.3 JDK17 Windows 11 二、初步认识Java的main方法 2.1 main方法的实…

comsol multiphysics在岩土工程中的应用

comsol教程推荐: comsol multiphysics在岩土工程中的应用 [comsol multiphysics在岩土工程中的应用](https://download.csdn.net/download/qq_36980284/89529402) 出版发行项: 北京:中国建筑工业出版社,2014 ISBN及定价: 978-7-112-16188-1 CNY42.00 载体形态项:…

【Python】一文向您详细介绍 argparse中 action=‘store_false’ 的作用

【Python】一文向您详细介绍 argparse中 action‘store_false’ 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介&#xff1a…

邮件推送服务的自动化流程设置与优化技巧?

邮件推送服务如何定制化?邮件推送的安全性如何保障? 无论是大型企业还是小型企业,通过精准的邮件推送服务,可以实现客户关系管理的有效增强,提升品牌认知度和销售转化率。AokSend将探讨如何通过自动化流程设置与优化技…

天翼云高级运维工程师202407回忆题库 最新出炉

备考天翼云高级运维工程师 必须备考天翼云 之前觉得外企牛批 然后民企,拔地而起,民企也不错,工资高,有钱途 现在看来看去,还是国企好,体制内的,有保障,树大根深 有必要备考下天…

LLM+本地知识库?简单又没那么简单

最近在研究如何将大语言模型结合本地知识库进行问答,虽然网上已经有很多教程,但大部分都是基于LangChain进行文本分割,然后调用模型向量化的API。这种方式的确很简单,但有这么几个前提: 大模型不使用ChatGPT的话&…