首页 > 编程语言 >JAVA基础:IO流,转换流,数据流,数组流

JAVA基础:IO流,转换流,数据流,数组流

时间:2024-09-25 08:52:22浏览次数:9  
标签:字符 JAVA 字节 fos 文件 IO 数据流 new txt

1 IO分类

  • IO流就是一组流动的数据,可以实现数据从一个地方移动到另一个地方

  • IO 表示的InputStream 和 OutputStream , 称为 输入,输出流。 可以实现文件的读写。

  • IO随着关注的特点不同,有不同的分类

    1. 按照数据流向分类,分为输入流 和 输出流

      输入和输出都是以Java程序为基准

    2. 按照传递的数据类型分类,分为字节流 和 字符流

      字符流可以很好的解决中文数据传递的问题

    3. 按照流的功能分类,分为 节点流 和 过程流

      节点流:可以直接与数据源对接。

      过程流:从另一个流中获得数据,并对数据进行一些加工和处理

2 文件字节输入输出流

  • 所有的字节流都继承自 InputSteram 和 OutputStream 抽象类

  • 最常用的节点流就是 FileInputStream 和 FileOutputStream 。可以与文件直接实现读写操作

2.1 FileInputStream的使用

创建流对象

FileInputStream fis = new FileInputStream("c:/z/1.txt");

File target = new File("c:/z/1.txt") ;
FileInputStream fis = new FileInputStream(File target);
  • 注意:要确保读取的文件存在,否则会抛出FileNotFoundException异常

使用流对象读取文件内容

int count = fis.available();  //获得流管道中字节的数量
				  //随着节点流创建,文件中的内容就会自动的进入流管道,该数量最开始就是文件的大小
				  //随着从管道中读取数据,这个字节数量会逐渐变小,直到变成0


int b = fis.read(); //从管道中读取一个字节
				    //如果管道中没有内容了,读取到的结果是-1


int length = fis.read(byte[]); //每次从管道中读取一组字节,存入指定的byte数组中
							   //返回此次读取字节的数量
							   //如果管道中没有任何内容了,length 等于 -1
new String(byte[],start,length) ; //将字节数组中的内容从指定位置开始,将指定长度的内容组成字符串

fis.close(); //关闭流管道
			 //管道是否关闭,对于业务没有影响
		     //关闭流可以释放io资源,也可以释放文件资源

2.2 FileOutputStream的使用

创建流对象

FileOutputStream fos = new FileOutpoutStream("c:/z/1.txt");
FileOutputStream fos = new FileOutpoutStream(File target);

FileOutputStream fos = new FileOutpoutStream("c:/z/1.txt",boolean append);
FileOutputStream fos = new FileOutpoutStream(File target,boolean append);
  • 注意1:输出流指定的文件如果不存在,会自动创建。但之创建文件不包含文件夹

  • 注意2:默认情况下,创建输出流后,会清空文件中的内容,相当于新内容会覆盖旧内容

使用流对象输出数据

fos.write(byte); //向文件中写入一个字节
fos.write(byte[]) ;//向文件中写入一组字节
fos.write(byte[],start,length) ;//将数组中指定范围的内容写入文件
string.getBytes(); //将字符串的内容转换成对应的字节数组形式


fos.close();

扩展

  • 作为节点流,随着将数据写入流管道,就会自动的写入文件。

3 字节字符转换流

  • 在使用字节流读取文件内容时,如果存在中文,有可能会出现乱码。 使用字符流可以解决乱码问题

    • 一个中文字符有可能使用2~4个字节来表示。

      如果一个字节一个字节读取,一定会出现乱码

      如果使用数组,一组一组的读取字节,有可能出现乱码

    • 编码字符集 。 一个中文对应一个字符也就是2个字节,在unicode编码规则下,有一个对应的数字

      不同的编码字符集,对同一个unicode数字表示不同,常用的与中文相关的字符集 GBK,UTF-8

      GBK就用2个字节表示一个中文

      UTF-8用2~4个字节表示中文

  • 使用字节字符转换流,将字节流管道中的字节按照对应的 编码规则转换成对应的字符

  • 字节字符转换流是一个过程流

  • 字节字符转换流,属于字符流,所有的字符流都继承Reader和Writer抽象父类

字符输入流

FileInputStream is = new FileInputStream("c:/z/1.txt");
InputStreamReader isr = new InputStreamReader(InputStream is); //默认处理UTF-8字符集
InputStreamReader isr = new InputStreamReader(InputStream is,"GBK");

int c = isr.read(); //读取一个字符,存入int变量中
int length = isr.read(char[]) ;//读取一组字符内容,存入指定的字符数组中,并返回读取的长度

字符输出流

//是否创建文件,是否追加内容由节点流控制
FileOutputStream fos = new FileOutputStream("c:'/z/1.txt");
OutputStreamWriter writer = new OutputStreamWriter(fos); //只能控制字符集
OutputStreamWriter writer = new OutputStreamWriter(fos,"GBK"); //只能控制字符集

writer.write(char);
writer.write(String) ;

writer.flush();//将当前过程流管道中处理后的数据推入节点流,完成最终的写入操作
  • 注意1:一般只有在需要更改编码字符集时,才需要使用字符输出流

    如果只是输出中文本身的化,不需要是字符流,直接用字节流就可以了

  • 注意2:过程流中的数据不会自动存入文件

    需要使用flush或close方法,将过程流中处理后的内容,推入节点流,从而写入文件。

4 文件字符流

  • 包括FileReader 和 FileWriter

  • 表面上,似乎与FileInputStream类似,直接以字符的形式读写文件

  • 本质上,与文件读写操作的就是文件字节流,文件字符流的本质是字符转换流

FileReader r = new FileReader("c:/z/1.txt") ;
FileWriter w = new FileWriter("c:/z/1.txt") ;

5 缓冲流

  • 包括 BufferedInputStream , BufferedOutputStream , BufferedReader , BufferedWriter

  • 读取数据时,会将文件中的输入读入缓冲区,再冲缓冲区读取数据,理论上性能更好

  • 写数据时,先将数据写入缓冲区,再将缓冲区中的数据一次性写如文件,理论上速度更快

FileReader r = new FileReader("c:/z/1.txt") ;
BufferedReader br = new BufferedReader(r);
BufferedReader br = new BufferedReader(r,size); //设置缓冲区大小

FileWriter w = new FileWriter("c:/z/1.txt");
BufferedWriter bw = new BufferedWriter(w);
BufferedWriter bw = new BufferedWriter(w,size);//设置缓冲区大小
  • 注意1:字符缓冲输入流,有一个特殊方法,br.readLine() 一次性读取一行字符串内容

    底层默认以\r\n为拆分标准

  • 注意2:缓冲流底层使用数组来实现数据的缓冲。在创建缓冲流对象时,可以指定数组长度

    默认缓冲大小8kb

  • 注意3:对于缓冲输出流而言,当缓冲的数据超过缓冲区时,会自动推入节点流

    缓冲区满了,会自动推出

    写入的数据超出缓冲区的范围,不会缓冲,直接写入节点流

6 打印流

  • 本质就是输出流,没有对应的输入流

  • PrintStream , PrintWriter

  • 相比于普通的输出流,就是多了一些带换行打印println,带格式化打印printf,针对于不同数据类型的重载方法

FileOutputStream fos = new FileOutputStream("c:/z/1.txt") ;
PrintStream p = new PrintStream( fos );


FileWriter writer = new FileWriter("c:/z/1.txt");
PrintWriter pw = new PrintWriter(writer);


p.print();
p.println();
p.printf();

System.out 也是一个打印流,默认负责向控制台打印

  • 我们可以更换这个打印流,使其向文件中打印

    System.setOut(PrintStream)

7 数据流

  • 是过程流,是字节流,包括 DataInputStream , DataOutputStream

  • 主要作用是读写基本类型的数据

    • 使用普通的字节流输出97,最终输出的是1个字节

    • 使用Data数据流输出97,最终输出的是4个字节

  • 提供了一组读写不同基本数据类型的方法

FileOutputStream fos = new FileOutputStream("c:/z/1.txt");
DataOutputStream dos =new DataOutputStream(fos);
dos.writeInt(i);
dos.writeDouble(i);
dos.writeFloat(i);
dos.flush();

FileInputStream fis = new FileInputStream("c:/z/1.txt");
DataInputStream dis = new DataInputStream(fis);
dis.readInt();
dis.readDouble();
dis.readFloat();

8 数组流

  • 是一个节点流,直接从数组中读写数据。

  • 包括 ByteArrayInputStream , ByteArrayOutputStream , CharArrayReader , CharArrayWriter

byte[] dataSource = "buka is good!!!".getBytes();
ByteArrayInputStream bis = new ByteArrayInputStream(dataSource) ;

ByteArrayOutputStream bos = new ByteArrayOutputStream(0x10);
bos.write(97);
bos.write(98);
bos.write(99);

byte[] bytes = bos.toByteArray();

标签:字符,JAVA,字节,fos,文件,IO,数据流,new,txt
From: https://blog.csdn.net/weixin_53755148/article/details/142513510

相关文章

  • 2.Javaweb-JSP实现数据传递和保存
    Javaweb-JSP实现数据传递和保存文章目录Javaweb-JSP实现数据传递和保存一、get与post区别二、equest对象常用方法三、内置对象--out对象JSP已经准备好的,可以直接使用的对象四、中文乱码JSP中默认使用的字符编码方式:iso-8859-1,不支持中文解决中文乱码参数传递在请求中保......
  • 1.Javaweb-搭建Web环境、初识JSP
    Javaweb-搭建Web环境、初识JSP文章目录Javaweb-搭建Web环境、初识JSP一、pc端程序架构分类:二、web服务器Tomcat三、JSP页面四、脚本语言五、Web程序常见错误六、错误替换JSP九大内置对象(包括JSP四大作用域)JSP四大作用域一、pc端程序架构分类:B/S:浏览器—服务......
  • WPF Image show picture in high resolution periodically via System.Timers.Timer
    <Windowx:Class="WpfApp411.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • Android studio 新建项目gradle依赖下载超时
    版本信息:android-studio-2024.1.2.12gradle-8.7&使用groovy配置项目配置:修改settings.gradle文件,将阿里云镜像仓库添加到google{}和mavenCentral()上方,不要随意改变仓库位置,仓库列出顺序决定 Gradle在这些仓库中搜索各个项目依赖项的顺序。pluginManagement{......
  • java中关于继承题目2
    2.请使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息。设定1)出租车类:属性包括:车型,车牌,所属出租公司;方法包括:启动,停止2)家用轿车类:属性包括:车型,车牌,车主姓名;方法包括:启动,停止要求1)分析出租车和家用轿车的公共成员,提取出父类—汽车类2)利用继承机制,实现出租......
  • C++ IO 类
    IO库:istream(输入流)类型,提供输入操作。ostream(输出流)类型,提供输出操作。cin,一个istream对象,从标准输入读取数据。cout,一个ostream对象,向标准输出写入数据。cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误。>>运算符,用来从一个istream对象读取输入数据。<......
  • 关于我学习java的小结09
    一、知识点线程。二、目标理解进程和线程。掌握创建多线程的方式。理解线程的生命周期。掌握死锁。三、内容分析重点多线程的创建方式。线程的生命周期。死锁的形成条件。难点多线程的的理解。死锁。四、内容1、线程1.1什么是进程进程(Proce......
  • java中关于继承的题目1
    编写一个圆类Circle,该类拥有:1)一个成员变量,radius(私有,浮点型);//存放圆的半径;2)两个构造方法Circle() //将半径设为0Circle(double r) //创建Circle对象时将半径初始化为r3)三个成员方法doublegetArea() //获取圆的面积doublegetPerimeter() //获取圆的周长voidshow() //将......
  • javaweb学习2 -2024/9/24
    今天学习了数据库中约束的概念数据库-约束约束的概念约束是作用于表中列上的规则,用于限制加入表的数据约束的存在保证了数据库中数据的正确性,有效性和完整性约束的分类#约束createtableemp2(#自动增长auto_increment当列时数据类型并且唯一约束id......
  • java_day7_继承、final关键字、代码块、多态
    一、继承1、继承我想养一只......