I/O流基础

1.输入/输出流

流是一组有序的数据序列,根据操作的类型,可以分为输入流和输出流两种。
Java定义的输入输出类被放在java.io包中
所有的输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类
而所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类

1.1输入流

InputStream类是字节输入流的抽象类,它是所有字节输入流的父类。
InputStream类的具体层次结构如图

该类中所有方法遇到错误时都会引发IOException异常,下面是该类方法中的简要说明:
·read():从输入流中读取数据的下一个字节。返回0~255的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值为1
·read(byte[] b):从输入流中读入一定长度的字节,并以证书的形式返回字节数
·mark(int readlimit):在输入流的当前位置放置一个标记,readlimit参数告知此输入流在标记位置失效前允许读取的字节数
·reset():将输入指针返回到当前所做的标记处
·skip(long n):跳过输入流上的n个字节并返回实际跳过的字节数
·markSupported():如果当前流支持mark()/reset()操作就返回true
·close():关闭此输入流并释放与该留关联所有的系统资源
并不是所有的InputStream类的子类都支持InputStream类中定义的所有方法,如skip(),mark(),reset()等方法只对某些子类有用

InputStream类是用来处理字节的,并不适合处理字符文本。Reader类是可以专门处理字符文本的类,但是Reader类并不是InputStream类的替换者,只是在处理字符串的时候简化了编程。Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。
Reader类的层次结构

1.2输出流

OutputStream类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类。
层次结构如图

OutputStream类中的所有方法均返回void,在遇到错误时会引发IOException异常。下面是对OutputStream类中的一些方法的简要说明:
write(int b):将指定的字节写入此输出流。
write(byte[] b)方法:将b个字节从指定的byte数组写入此输出流。
write(byte[] b,int off,int len)方法:将指定byte数组中从偏移量off开始的len个字节写入此输出流。
flush()方法:彻底完成输出并清空缓存区。 
close()方法:关闭输出流。

Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类
在这里插入图片描述

2.File类

File类是java.io包中唯一代表磁盘文件本身的类。File类定义了一些与平台无关的方法开操作文件,可以通过调用File类的方法,实现创建、删除、重命名文件等操作。
File类的对象主要用来获取文件本身的一些信息,如文件所在目录,文件的长度、文件读写权限等。数据流可以将数据写入文件中。

2.1文件的创建与删除

通常使用以下三种方法来创建文件对象
1.File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建一个新File实例:
	new File(String pathname),
其中 pathname代表包含文件名的路径名。例如:
   File file = new File("D:/test.txt");
2.File(String parent,String child):该构造方法根据定义的父路径和子路径字符串(包含文件名)创建一个新的File对象,语法如下:
    new File(String parent,String child)
      ·parent:父路径字符串,如D:/或D:/doc
      ·child:子路径字符串,如letter.txt
3.File(File f,String child):该构造方法根据f抽象路径名和child路径名字符串创建一个新File实例。语法如下:
    new File(File f,String child)
	  ·f:父路径对象,如D:/doc/
	  ·child:子路径字符串,如letter.txt
注意:如果使用File类创建文件对象后,如果该目录中没有此文件,会自动调用creatNewFile()方法创建一个文件,如果存在,可通过文件对象的delete()方法将其删除

2.2获取文件信息

file类提供了很多方法获取文件本身的信息

在这里插入图片描述

import java.io.File;
public class FileDemo{
	public static void main(String[] args){
		File file = new File("D:\\word.txt"); //创建文件对象
		if(file.exists()){			//如果文件存在
			String name = file.getName();//获取文件名称
			long length = file.length(); //获取文件长度
			boolean hidden = file.isHidder();//判断文件是否是隐藏文件
			System.out.println("文件名称是:"+name);
			System.out.println("文件长度:"+length);
			System.out.println("该文件是隐藏文件吗:"+hidden);
		}
		else{
			System.out.println("文件不存在");
		}	
	}
}

3.文件输入/输出流

程序运行期间,大部分数据都在内存中进行操作,当程序结束或者关闭时,这些数据将消失。如果需要将数据永久保存,可使用文件输入/输出流与指定的文件建立连接,将需要的数据永久保存到文件中。

3.1FileInputStream与FileOutputStream类

FileInputStream类与FileOutputStream类都用来操作磁盘文件。
如果用户的文件读取需求比较简单,则可以使用FileInputStream类,该类继承自InputStream类。
FileOutStream类与FileInputStream类对应,提供了基本的文件写入能力。

FileInputStream类常用的构造方法如下:
	FileInputStream(String name):用给定的文件名name创建一个FileInputStream对象
	FileInputStream(File file):用File对象创建FileInputStream对象。允许在把文件连接输入流之前对文件做进一步分析。
FileOutputStream类有与FileInputStream类相同的参数构造方法,创建一个FileOutputStream对象时,可以指定不存在的文件名,但此文件不能是一个已被其他程序打开的文件,下面实例就是使用FileInputStream类与FileOutputStream类实现文件的读取与写入功能。
/*向文本文件中写入内容,再读取出来。
使用FileOutputStream类和FileInputStream类,向D盘根目录的word.txt文件中写入一句话,然后再读取出来输出在控制台上*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStreaml
import java.io.IOException;

public class FileStreamDemo{
	public static void main(String[] args){
		File file = new File("D:\\word.txt");
		try{
			FileOutputStream out = new FileOutputStream(file);  //创建输出流
			byte buy[] = "我有一个文件".getBytes();  //写入内容的字节数组
			out.wirte(buy);
			out.close();
		}catch(IOException e){
			e.printStackTrace();
		}
		try{
			FileInputStream in = new FileInputStream(file);   //创建输入流
			byte byt[] = new byte[1024];  //缓存字节数组
			int len = in.read(byt);   //将文件信息读入缓存数组中
			System.out.println("文件中的信息是:"+new String(byt,0,len));  //将字节转为字符串输出
			in.close();   //关闭流
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
/*程序运行后会在D盘创建一个word.txt文件并且写入一行文字,并且会在控制台输出“我有一个文件”的信息*/

3.2FileReader和FileWriter类

因为汉字在文件中占两个字节,使用上面的两个字节流类可能会造成乱码,所以使用FileReader和FileWriter。
FileReader类顺序读取文件,只要不关闭流,每次调用read()方法就顺序的读取源中其余的内容,知道源的末尾或流关闭。
/*使用字符流读写文本文件:使用FileWriter类和FileReader类,向D盘根目录的word.txt文件中写一句话,再输出到控制台上*/
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public calss FileReaderDemo{
	public static void main(String[] args){
		File file = new File("D:\\\word.txt");//创建文件对象
		try{
			FileWriter fw = new FileWriter(file);   //创建字符输出流
			String word = "这是另外一个文件";  //写入的字符串
			fw.write(word);		 //将字符串写入文件中
			fw.close();
		}catch(IOException e){
			e.printStackTrace();
		}
		try{
			FileReader fr = new FileReader(file);
			char ch[] = new char[1024];  //缓存字符数组
			int len = fr.read(ch);    //将文件中的字符读入缓存数组中
			System.out.println("文件中的信息是:"+new String(ch,0,len));    //将字符转为字符串输出
			fr.close();			 
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

4.带缓存的输入/输出流

缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区,使得在流上执行skip(),mark(),reset()方法都成为可能

4.1BufferedInputStream与BufferedOutputStream类

这两个类可以对所有的InputStrea类进行带缓存区的包装以达到性能的优化,其有两个构造方法:
	BufferedInputStream(InputStream in)
	BufferedInputStream(InputStream in,int size)
	第一种形式的构造方法创建了一个有32个字节的缓存区;
	第二个构造方法按照指定的大小来创建缓存区。
一个最优的缓存区的大小,取决于它所在的操作系统、可用的内存空间以及机器配置。从构造方法可以看出,BufferedInputStream对象位于InputStream类对象之后

BufferedInputStream读取文件过程

使用BufferedOutputStream类输出信息和仅用OutputStream类输出信息完全一样,只不过BufferedPutputStream有一个flush()方法来将缓存区的数据强制输出完。它有两个构造方法:
	BufferedOutputStream(OutputStream in):创建一个有32个字节的缓存区
	BufferedPutputStream(OutputStream in,int size):以指定大小来创建缓存区
注意:flush()方法就是用于即使在缓存区没有慢的情况下,也将缓存区的内容强制写入外设,习惯上成这个过程为刷新。flush()方法只对使用缓存区的OutputStream类的子类有效,当调用close()方法时,系统在关闭流之前,也会将缓存区的信息刷新到磁盘文件中。

4.2BufferedReader和BufferedWriter类

BufferedReader类与BufferedWriter类分别继承Reader类与Writer类。这两个类同样具有内部缓存机制,并能够以行为单位进行输出/输入、

BufferedReader类读取文件的过程

BufferedReader类常用的方法如下:
	read():读取单个字符
	readLine():读取一个文本行,并将其返回为字符串。若无数据刻度,则返回null
BufferedWriter类中的方法都返回void,常用的如下:
	flush():刷新该流的缓存
	newLine():写入一个行分隔符
在使用BufferedWriter类的Writer()方法时,数据并没有立即被写入输出流,而是首先进入缓存区中,如果想立刻将缓存区中的数据写入输出流,一定要调用flush()方法。
/*使用缓冲流读写文本文件、使用BufferedReader和BufferedWriter类,向D盘根目录的word.txt文件中写入多行内容,然后再读取出来输出在控制台上*/
public class BufferedDemo{
	public static void main(String[] args){
		String content[] = {"你好","佛i啊很多事","时时发啊哈东"};
		File file = new File("D:\\word.txt");
		try{
			FileWriter fw = new FileWriter(file); //文件字符输出流
			BufferedWriter bw = new BufferedWriter(fw);    //缓冲输出流
			for(int k=0;k<content.length;k++){
				bw.wirter(content[k]);   //写入字符串
				bw.newLine(); //写入一个换行符
			}
			bw.close();
			fw.close();
		}catch(IOException e){
			e.printStackTrace();
		}
		try{
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);
			String tmp = null;//作为缓冲的临时字符串
			int i =1;	//行数
			while((tmp = br.readLine()!=null)){
				System.out.println("第"+i+"行:"+tmp);
				i++;
			}
			br.close();
			fr.close();
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

5.数据输入/输出流

DataInputStream类与DataOutputStream类允许程序以与机器无关的方式从底层输入流中读取基本的Java数据类型。
也就是说,当读取一个数据时,不必再关心这个数值是哪种字节。DataInputStream类与DataOutputStream类的构造方法如下:
	DataInputStream(InputStream in):使用指定的基础InputStream对象创建DataInputStream对象。
	DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流。

DataOutputStream类提供了将字符串,double数据、int数据、boolean数据写入文件的方法。其中将字符串写入文件的方法有3中,分别是:
	writeBytes(String s)、writeChars(String s)、writeUTF(String s)
因为Java中的字符是Unicode编码,是双字节的,wirteBytes()方法之色将字符串中的每一个字符的低字节内容写入目标设备中。
	writerChars()方法将字符串中的每一个字符的两个字节的内容都写到目标设备中;
	writeUTF()方法将字符串按照UFT编码后的字节长度写入目标设备,然后才是每一个字节的UTF编码。
DataInputStream类只提供了一个readUTF()方法返回字符串。因为要在一个连续的字节流读取一个字符串,如果没有特殊的标记作为一个字符串的结尾,并且不知道字符串的长度,就无法知道读取到什么位置才是这个字符串的结束。DataOutputStream类中只有writeUTF()方法向目标设备中写入字符串的长度,所以也能准确的读回写入字符串
/*使用数据流读写文本文件:分别通过DataOutputStream类的writeUTF()、writeDouble()、writeInt()、writeBoolean()方法向指定的word.txt文件中写入不同类型的数据,并且通过DataInputStream类的相应方法将写入的数据输出到控制台上。*/
import java.io.*;
public class FataSteamDemo{
	File file = new File("D:\\word.txt");
	try{
		//创建FileOutputStream对象,指定要向其中写入数据的文件
		FileOutputStream fos = new FileOutputStream();
		//创建DataOutputStream对象,用来向文件
		DataOutputStream dos = new DataOutputStream(fos);
		dos.writeUTF("使用writeUTF方法写入数据");//将字符串写入文件
		dos.writeDouble(19.8);
		dos.writeInt(192);
		dos.writeBoolean(ture);
		dos.close();
		fos.close();
	
		//创建FileInputStream对象,指定要从中读取数据的文件
		FileInputStream fis = new FileInputStream(file);
		DataInputStream dis = new DataInputStream(fis);
		System.out.println("readUTF方法读取数据:"+dis.readUTF());     //读取字符串
		System.out.println("readDouble方法读取数据:"+dis.readDouble());
		System.out.println("readInt方法读取数据:"+dis.readInt());    
		System.out.println("readBoolean方法读取数据:"+dis.readBoolean());    
		dis.close();
		fis.close(); 
	}catch(IOException e){
		e.printStackTrace();
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统性能优化:七个实战经验

Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题&#xff0c;例如在Linux上搭建了一个web服务&#xff0c;经常出现网页无法打开、打开速度慢等现象&#xff0c;而遇到这些问题&#xff0c;就有人…

Unity中Shader的_Time精度问题

文章目录 前言一、U方向上优化二、V方向上优化在这里插入图片描述 三、最终代码1、效果2、Shader 前言 在Unity的Shader中&#xff0c;使用了_Time来达到UV的流动效果&#xff0c;普遍会出现一个问题。我们的UV值会随着时间一直增加&#xff08;uv值增加了&#xff0c;但是因为…

web学习笔记(十一)

目录 1.数据类型 1.1数据类型分类 &#xff08;1&#xff09;简单&#xff08;基本&#xff09;数据类型 &#xff08;2&#xff09;复杂&#xff08;特殊&#xff09;数据类型 1.2判断数据类型的方法 &#xff08;1&#xff09;常规判断方法&#xff1a; &#xff08;2…

用判断对齐大语言模型

1、写作动机&#xff1a; 目前的从反馈中学习方法仅仅使用判断来促使LLMs产生更好的响应&#xff0c;然后将其作为新的示范用于监督训练。这种对判断的间接利用受到无法从错误中学习的限制&#xff0c;这是从反馈中学习的核心精神&#xff0c;并受到LLMs的改进能力的制约。 2…

html5实现好看的个人博客模板源码

文章目录 1.设计来源1.1 主界面1.2 认识我界面1.3 我的文章界面1.4 我的模板界面1.5 文章内容界面 2.结构和源码2.1 目录结构2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/135368653 html5实现好看…

rust sqlx包(数据库相关)使用方法+问题解决

可以操作pgsql、mysql、mssql、sqlite 异步的&#xff0c;性能应该不错&#xff0c;具体使用有几个坑 除了sqlx库&#xff0c;还有对于具体数据库的库&#xff0c;比如postgres库 演示以pgsql为例&#xff0c;更新时间2024.1.6 官方github: sqlx github rust官方文档&#xff1…

c语言结构体学习

文章目录 前言一、结构体的声明1&#xff0c;什么叫结构体?2&#xff0c;结构体的类型3,结构体变量的创建和初始化4&#xff0c;结构体的类型5&#xff0c;结构体的初始化 二、结构体的访问1&#xff0c;结构体成员的点操作符访问2&#xff0c;结构体体成员的指针访问 三、结构…

网络连接 UDP2,UDP Connect, bind, send, recieve认知, -入门8

LWIP编程接口有RAW, NETCONN, SOCKET 2.UDP函数的理解 #define UDP_SERVER_PORT 8000 //PC side #define UDP_CLIENT_PORT 1234 // ctrl board side //PC IP address #define DEST_IP_ADDR0 192 #define DEST_IP_ADDR1 168 #define DEST_IP_ADDR2 3 #define DEST_IP_ADDR3 11…

如何安装和使用夜神模拟器连接Android Studio

目录 简介 一、安装 二、使用 三、更多资源 简介 夜神模拟器是一款在Windows平台上运行的Android模拟器软件。它能够模拟Android操作系统环境&#xff0c;让用户在电脑上轻松体验Android应用程序。夜神模拟器的功能强大&#xff0c;可以满足各种需求&#xff0c;无论是娱乐…

实现pytorch版的mobileNetV1

mobileNet具体细节&#xff0c;在前面已做了分析记录&#xff1a;轻量化网络-MobileNet系列-CSDN博客 这里是根据网络结构&#xff0c;搭建模型&#xff0c;用于图像分类任务。 1. 网络结构和基本组件 2. 搭建组件 &#xff08;1&#xff09;普通的卷积组件&#xff1a;CBL …

大模型学习第一课

学习目标&#xff1a; 大模型开源体系 学习内容&#xff1a; 大模型简述大模型性能开源体系 学习时间&#xff1a; 周四上午 10点 学习记录&#xff1a; 大模型简述 大模型是发展通用人工智能的重要途经专用模型到通用大模型实验室开源历程&#xff0c;大模型系列7B-20B-12…

k8s实践(14)--scheduler调度器和pod调度策略

一、scheduler调度器 1、kube-scheduler简介 k8s实践(10) -- Kubernetes集群运行原理详解 介绍过kube-scheduler。 kube-scheduler是运行在master节点上&#xff0c;其主要作用是负责资源的调度&#xff08;Pod调度&#xff09;&#xff0c;通过API Server的Watch接口监听新建…

C++中的new和delete

相关文章 C智能指针 文章目录 相关文章前言一、new 运算符1. operator new 函数的范围2. 在类中重载new运算符3. 分配失败 二、delete 运算符1. 内存泄露统计示例2. 在类中重载delete运算符 总结 前言 在C中&#xff0c;new和delete是用于动态内存管理的运算符&#xff0c;它们…

Halcon计算一个区域的最大内接圆 inner_circle

Halcon计算一个区域的最大内接圆 该算子用于计算一个区域的最大内接圆&#xff0c;其原型如下&#xff1a; inner_circle(Regions : :: Row, Column, Radius)参数1&#xff1a;Regions 表示输入的区域。 参数2和3&#xff1a;Row、Column为输出参数&#xff0c;表示最大内接圆…

面试经典题---6.Z字形变换

6.Z字形变换 我的解法&#xff1a; 首先定义了3个变量&#xff1a;index、add和step。 index&#xff1a;当前处理字符在原字符串中的下标&#xff1b;add&#xff1a;Z字形中相邻两个字符在原字符串中的下标之差&#xff08;非固定值&#xff0c;值随着行的改变会发生变化&am…

Linux 上 Nginx 配置访问 web 服务器及配置 https 访问配置过程记录

目录 一、前言说明二、配置思路三、开始修改配置四、结尾 一、前言说明 最近自己搭建了个 Blog 网站&#xff0c;想把网站部署到服务器上面&#xff0c;本文记录一下搭建过程中 Nginx 配置请求转发的过程。 二、配置思路 web项目已经在服务器上面运行起来了&#xff0c;运行的端…

EtherCAT主站SOEM -- 13 --Qt-Soem通过界面按键控制 EtherCAT IO模块的io输出

EtherCAT主站SOEM -- 13 --Qt-Soem通过界面按键控制 EtherCAT IO模块的io输出 一 mainwindow.c 文件函数:1.1 自定义PDO配置2.2 主站初始化2.3 去motrorcontrol界面二 motrorcontrol.c 文件三 allvalue.h 文件该文档修改记录:总结一 mainwindow.c 文件函数: mainwindow主界…

性能分析与调优: Linux 性能分析60秒

目录 一、实验 1.环境 2.Linux性能分析60秒 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192.168…

数据分析基础之《numpy(6)—IO操作与数据处理》

了解即可&#xff0c;用panads 一、numpy读取 1、问题 大多数数据并不是我们自己构造的&#xff0c;而是存在文件当中&#xff0c;需要我们用工具获取 但是numpy其实并不适合用来读取和处理数据&#xff0c;因此我们这里了解相关API&#xff0c;以及numpy不方便的地方即可 2…

java解析json复杂数据的两种思路

文章目录 一、原始需求二、简单分析三、具体实现一1. api接口2. 接口返回3. json 数据解析1.&#xff09;引入Jackson库2.&#xff09;定义实体3.&#xff09;解析json字符串4.&#xff09;运行结果 4. 过程分析 四、具体实现二1. 核心代码2.运行结果 五、方案比较六、源码传送…
最新文章