当前位置: 首页 > news >正文

Java—— IO流 第一期

什么是IO流

存储和读取数据的解决方案
I:input
O:output
流:像水流一样传输数据

IO流的作用

用于读写数据(本地文件,网络)

IO流的分类

按照流向分类

输出流:程序 --> 文件
输入流:文件 --> 程序

按照操作文件的类型分类
字节流:可以操作所有类型的文件
字符流:只能操作纯文本文件(用windows系统自带的记事本打开并且能读懂的文件,例如txt文件,md文件,xml文件,lrc文件等)

字节流的实现类

操作本地文件的字节输出流FileOutputStream

可以把程序中的数据写到本地文件中

 书写步骤及细节

1.创建字节输出流对象

        参数是字符串表示的路径或者File对象都是可以的
        如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
        如果文件已经存在,则会清空文件重新写
2.写数据

        使用write方法,参数为整数,但实际上写到本地文件中的是整数在ASCII上对应的字符
3.释放资源 

        每次使用完流之后都要释放资源 

代码演示

import java.io.FileOutputStream;
import java.io.IOException;public class Test1 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("day04\\a.txt");fos.write(97);fos.close();}
}

如何一次写入多个数据
方法名称说明
void write(int b)一次写一个字节数据
void write(byte[] b)一次写一个字节数组数据
void write(byte[] b, int off, int len)一次写一个字节数组的部分数据

代码演示

import java.io.FileOutputStream;
import java.io.IOException;public class Test2 {public static void main(String[] args) throws IOException {//一次写一个字节数组数据//有两种定义数据的形式//直接定义byte数组,将想写入的数据的ASCII码存入数组FileOutputStream fos1 = new FileOutputStream("day04\\a.txt");byte[] b1 = {97,98,99,100};fos1.write(b1);fos1.close();//以字符串的形式定义想写入的数据,再将字符串转换为byte数组FileOutputStream fos2 = new FileOutputStream("day04\\a.txt");String str = "asdfg";byte[] b2 = str.getBytes();fos2.write(b2);fos2.close();//一次写一个字节数组的部分数据//第二个参数是字节数组的起始索引//第三个参数是要写入数据的个数FileOutputStream fos3 = new FileOutputStream("day04\\a.txt");byte[] b3 = {97,98,99,100,101,102};fos3.write(b3,1,3);fos3.close();}
}

如何换行写

换行写:使用换行符
windows:\r\n
Linux:\n
Mac:\r
细节:
在windows操作系统当中,java对回车换行进行了优化。
虽然完整的是\r\n,但是我们写其中一个\r或者\n,也可以实现换行,java在底层会补全
建议:不要省略,还是写全了

代码演示

import java.io.FileOutputStream;
import java.io.IOException;public class Test3 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("day04\\a.txt");String str1 = "abcd";byte[] b1 = str1.getBytes();fos.write(b1);String wrap = "\r\n";byte[] b2 = wrap.getBytes();fos.write(b2);String str3 = "efgh";byte[] b3 = str3.getBytes();fos.write(b3);fos.close();}
}

 

如何续写

如果想要续写,打开续写开关即可
开关位置:创建字节输出流对象的第二个参数
不写默认false:表示关闭续写,此时创建字节输出流对象会清空文件
手动传递true:表示打开续写,此时创建字节输出流对象不会清空文件

代码演示

import java.io.FileOutputStream;
import java.io.IOException;public class Test4 {public static void main(String[] args) throws IOException {FileOutputStream fos1 = new FileOutputStream("day04\\a.txt");String str1 = "abcd";byte[] b1 = str1.getBytes();fos1.write(b1);fos1.close();FileOutputStream fos2 = new FileOutputStream("day04\\a.txt",true);String str2 = "efgh";byte[] b2 = str2.getBytes();fos2.write(b2);fos2.close();}
}

 

操作本地文件的字节输入流FilelnputStream

可以把本地文件中的数据读取到程序中来

书写步骤及细节

1.创建字节输入流对象

        如果文件不存在,就直接报错
2.读数据

        利用read方法读数据,读出来的是数据在ASCII上对应的数字
        读到文件末尾读不到数据时,read方法返回-1
3.释放资源

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

代码演示

import java.io.FileInputStream;
import java.io.IOException;public class Test5 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("day04\\a.txt");int b;//空参read一次只能读取一个数据,利用循环进行读取//直到读到末尾读不到数据时返回-1,结束循环while ((b = fis.read()) != -1) {//读到的数据是ASCII字符对应的整数//通过char转化为字符类型System.out.print((char) b);}//abcdefgfis.close();}
}
如何一次读取多个数据
方法名称说明
public int read()一次读一个字节数据
public int read(byte[] buffer)

一次读一个字节数组数据

每次读取会尽可能把数组装满

返回读取到的数据个数,读不到返回-1

读取的数据字符在byte数组中

代码演示

import java.io.FileInputStream;
import java.io.IOException;public class Test6 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("day04\\a.txt");//定义字节数组接收数据byte[] b = new byte[3];int len;//返回读取到的数据个数,读不到返回-1,用len记录while ((len = fis.read(b)) != -1) {//读取的数据会存放在byte数组中//新一轮读取的数据会覆盖在byte数组中的旧数据//最后一次读取时,会出现数据读不满byte数组的情况//此时,byte数组中后面的部分数据不会被覆盖//所以需要len(读取到的数据个数),读取几个输出几个String str = new String(b, 0, len);System.out.println(str);}//abc//def//gfis.close();}
}
http://www.xdnf.cn/news/533359.html

相关文章:

  • FART 自动化脱壳框架简介与脱壳点的选择
  • Effective C++阅读笔记(item 1-4)
  • C++(2)关键字+数据类型 +数据类型输入
  • linux服务器参数调优
  • 【Pandas】pandas DataFrame mode
  • 家庭数字生态构建实战:基于飞牛fnOS的智能家居数据中台搭建全流程解析
  • Visual Studio构建三剑客:生成/重新生成/清理解决方案深度解析
  • 【爬虫】DrissionPage-8.1
  • Ubuntu20.04系统下使用交叉编译工具链(aarch、x86)交叉编译opencv4.5.0
  • DApp开发全流程解析:模式设计、功能参考与合约管理实践
  • Fabric初体验(踩坑笔记)
  • 详细介绍一下Python连接MySQL数据库的完整步骤
  • 命令2-IBM Spectrum Scale(以前称为 GPFS)-mmhealth cluster show NATIVE_RAID
  • SAP系统的委外业务是什么?委外采购(标准委外)与工序外协的区别有哪些?
  • 图像中紫边出现原因
  • 结构体对齐方式。
  • 《打造第二大脑》
  • python自学笔记3 控制结构
  • es快速上手(从MySQL角度)
  • HarmonyOS Navigation组件深度解析与应用实践
  • Baklib Headless CMS 全面介绍
  • VAPO:视觉-语言对齐预训练(对象级语义)详解
  • Amazon Q 从入门到精通 – 测试与重构
  • 什么是一次性支付?什么是网关支付?什么是认证支付?
  • 科普:极简的AI乱战江湖
  • MyBatis:动态SQL
  • 机器学习EM算法原理及推导
  • 基于大模型预测癫痫的技术方案
  • deep search框架deerflow
  • 腾讯云怎么在游戏云中助力