第十五章 I/O(输入/输出)流

news2024/11/13 8:41:24

15.1 输入/输出流

流是一组有序的数据序列,可分为输入流和输出流两种。

程序从指向源的输入流中读取源中数据,源可以是文件、网络、压缩包或者其他数据源

输出流的指向是数据要到达的目的地,输出流的目标可以是文件、网络、压缩包、控制台和其他数据输出目标

15.1.1 输入流

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

read()方法:从输入流中读取数据的下一字节。返回0~255的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值为-1.
read(byte[]b):从输入流中读入一定长度的字节,并以整数的形式返回字节数。
mark(int readlimit)方法: 在输入流的当前位置放置一个标记,readlimit参数告知此输入流再标记位置失效之前允许读取的字节数。
reset()方法:将输入指针返回到当前所做的标记处。
skip(long n)方法:跳过输入流上的n个字节并返回实际跳过的字节数。
markSupported()方法:如果当前流支持mark()/reset()操作就返回turn。
close方法:关闭此输入流并释放与该流关联的所有系统资源。
 

并不是所有的 InputStream类的子类都支持 InputStream 类中定义的所有方法、如skip0、mark0、Tset0等方法只对某些子类有用。

Java 中的字符是Unicode 编码,是双字节的。InputStream 类是用来处理字节的,并不适合处理字符文本。Java为字符文本的输入专门提供了一套单独的类,即Reader 类,但Reader 类并不是InputStear类的替换者,只是在处理字符串时简化了编程。Reader 类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。Reader 类的具体层次结构如图所示。

15.1.2 输出流 

OutputStream类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类

OutputStream类中的所有方法均返回void,在遇到错误时会引发IOException异常,

1.write(intb)方法:将指定的字节写入此输出流。

2. writebyte[]b)方法:将b个字节从指定的byte 数组写入此输出流。

3.write(byte[ b,int off,int len)方法:将指定 byte 数组中从偏移量of开始的len个字节写入此输

出流。

4.fush0方法:彻底完成输出并清空缓存区。

5.close0方法:关闭输出流。

Writer 类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。Writer 类的层次结构如:

15.2 File类


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

15.2.1 文件的创建与删除


可以使用File类创建一个文件对象。通常使用以下3种构造方法来创建文件对象。

1. File(String pathname)

该构造方法通过将给定的路径名字符串转换为抽象路径名来创建一个新File实例。语法如下:
 

new File(String pathname)

其中,pathname代表路径名称(包含文件名)。例如

File file = new File("d:/1.txt");

2. File(String parent,String child)

该构造方法根据定义的父路径和子路径字符串(包含文件名)创建一个新的File对象。语法如

new File(String parent, String child)

3. File(File f, String child)

该构造方法根据f抽象路径名和child路径名字符串创建一个新File实例。语法如下

new File(File f,String child)

f:父路径对象,如D:/doc/。

child:子路径字符串,如letter.txt。

当使用 File类创建一个文件对象后,例如:

Re lie =new FileCword.txt");

知果当前目录中不存在名称为word的文件,File 类对象可通过调用createNewFile0方法创建一个名称

wndtxt 的文件;如果存在word.txt文件,可以通过文件对象的deleteO方法将其删除,如例15.1所示。

例题

import java.io.File;
import java.io.IOException;
public class FileText {
	private static File[] files;
 
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	/*	File file=new File("c:\\happy\\word.txt"); //创建文件对象
		if(file.exists()) {//如果文件存在
			file.delete(); //如果文件删除
			System.out.println("文件已删除");       printAllFiles(f);
		}
		else {                                 //如果文件不存在
				try {                     //try语句块捕捉可能出现的异常
					file.createNewFile(); //创建新文件
					System.out.println("文件已创建");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}*/
		File file=new File("C:\\happy");
		printAllFiles(file);
	}
 
 
		private static void printAllFiles(File file) {
		File[] files = file.listFiles();
		for(File f : files){
		if(f.isDirectory()) {
		System.out.println("------- " + f.getName() + " -------");
		printAllFiles(f);
		}else {
			System.out.println(f.getName());
		}
	}
}
		}

运行结果如下:

15.2.2 获取文件信息

例题15.2

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

 运行结果如下:

15.3 文件输入/输出流


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

15.3.1  FilelnputStream 与 Fileouisieam 类


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

FileinputStream 类常用的构造方法如下:

 FileinputStream(String name)

 FilelnputStream(File file)

第一个构造方法使用给定的文件名 name 创建一个FilelnputStream对象,第二个构造方法使用File对象创建FilelnputStream 对象。第一个构造方法比较简单,但第二个构造方法允许在把文件连接输入流之前对文件做进一步分析。

FileOutputStream 类有与FilelnputStream类相同的参数构造方法,创建一个FileOutputStream 对象时,可以指定不存在的文件名,但此文件不能是一个已被其他程序打开的文件。下面的实例就是使用FileinputStream 类与FileOutputStream类实现文件的读取与写入功能的。

例题15.3

import java.io.File;                   //缓冲流                //字节流  FileOutputStream输出流   FileInputStream输入流
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class FileStreamDemo {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		File file = new File("C:\\happy\\word.txt");
		FileOutputStream out = new FileOutputStream(file); //输出字节流
		byte[]by = "hello world".getBytes(); 
		out.write(by);  //往文件中写入数据
		out.close();
		
		FileInputStream in = new FileInputStream(file);
		byte[] by1 = new byte[1024];
		int len = in.read(by1);
		System.out.println(new String(by1,0,len));//从零号位开始打印,只打印len长度
	}
 
}

运行结果如下:

15.3.2 FileReader 和 FileWriter类
使用FileOutputStream 类向文件中写入数据与使用FilelnputStream类从文件中将内容读出来,都存在一点不足,即这两个类都只提供了对字节或字节数组的读取方法。由于汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象,此时采用字符流 FileReader 类或 FileWriter 类即可是兔这种现象。

FileReader 类和 FileWriter 类对应了FileInputStrcam 类和FileOutputStrcam 类。FileReader 类顺序地读取文件,只要不关闭流,每次调用 read0方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭.

 例题15.4
 

import java.io.BufferedReader;                //文件流
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;                        //字符流   FileWriter输出流  FileReader输入流
import java.io.FileWriter;
import java.io.IOException;
 
public class FileReaderDemo {
             
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		File file = new File("C:\\happy\\word.txt");
		FileWriter writer = new FileWriter(file);  //输出字符流
		//char[]by = new char[] {'h','e','l','l','o'}; //输入数据
		//带缓存的输出流
		BufferedWriter bw = new BufferedWriter(writer); //BufferedWriter缓存流
		//String str="门前大桥下,游过一群鸭";
		bw.write("门前大桥下,游过一群鸭");
		bw.newLine();                       //换行
		bw.write("快来快来数一数,二四六七八");
		bw.newLine();
		bw.write("咕嘎咕嘎,真呀真多");
		bw.newLine();
		bw.write("数不清到底多少鸭");
		bw.close();
		//writer.write(str);  //往文件中写入数据
		writer.close();
		
		 FileReader reader = new  FileReader(file);
	 
		 /*char[] ch1 = new char[1024];
		int len = reader.read(ch1);
		System.out.println(new String(ch1,0,len));*/
		 
		 BufferedReader br =new  BufferedReader(reader);
		 String s1 = br.readLine();
		 System.out.println("第一行:"+ s1);
		System.out.println("第二行:"+ br .readLine());
		 System.out.println("第三行:"+ br .readLine());
		System.out.println("第四行:"+ br .readLine());
		reader.close();
	}
 
}

 运行结果如下:

15.4 带缓存的输入/输出流


缓存是VO的一种性能优化。缓存流为VO流增加了内存缓存区,使得在流上执行skip0、markO和reset0方法都成为可能

15.4.1  BufferedInputStream 与BufferedOutputStream类


BufferedInputStream 类可以对所有 InputStream 类进行带缓存区的包装以达到性能的优化。BufferedInputStream 类有两个构造方法:

1. BufferedInputStream(InputStream in)

2.BufferedInputStream(InputStream in,int size)

第一种形式的构造万法创建了一个有32个字节的缓存区;第二种形式的构造方法按指定的大小来创建缓存区。一个最优的缓存区的大小,取决于它所在的操作系统、可用的内存空间以及机器配置。从构造方法可以看出,BufferedInputStream对象位于InputStream类对象之后。图15.7描述了带缓存的字节流读取文件的过程。
使用BufferedOutputStrcam 类输出信息和仅用0utputStream 类输出信息完全一样,只不过BufferedOutputStream 有一个fushO方法用来将缓存区的数据强制输出完。BufferedOutputStream类也有两个构造方法:

1. BufferedOutputStream(OutputStream in)

2. BufferedOutputStream(OutputStream in,int size)

第一种构造方法创建一个有32个字节的缓存区,第二种构造方法以指定的大小来创建缓存区。
 

15.4.2 BufferedReader 与 BufferedWriter类


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

BufferedReader 类常用的方法如下:

区readO方法:读取单个字符。

区readLine0方法:读取一个文本行,并将其返回为字符串。若无数据可读,则返回null.

BufferedWriter 类中的方法都返回void。常用的方法如下:

write(String s,int off, int len)方法:写入字符串的某一部分。

flushO方法:刷新该流的缓存。

newLineO方法:写入一个行分隔符。

在使用 BufferedWriter 类的WriteO方法时,数据并没有立刻被写入输出流,而是首先进入缓存区中。如果想立刻将缓存区中的数据写入输出流,一定要调用flushO方法。

 
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class BufferedDemo {
	public static void main(String args[]) {
		String content[] = { "好久不见", "最近好吗", "常联系" };// 写入的内容
		File file = new File("C:\\happy\\word.txt"); // 创建文件对象
		try {
			FileWriter fw = new FileWriter(file); // 文件字符输出流
			BufferedWriter bw = new BufferedWriter(fw); // 换成输出流
			for (int k = 0; k < content.length; k++) { // 遍历要输入的内容
				bw.write(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; // 行数
			// 从文件中读出一行,如果读出的内容不为null,则进入循环
			while ((tmp = br.readLine()) != null) {
				System.out.println("第" + i + "行:" + tmp); // 输出读取的内容
				i++; // 行数递增
			}
			br.close(); // 关闭缓冲输入流
			fr.close(); // 关闭文件字符输入流
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}//例题15.5

 运行结果如下:

15.5 数据输入/输出流
数据输入/输出流(DataInputStream 类与DataOutputStream类)允许应用程序以与机器无关的方式从底层输入流中读取基不)ava数据类型。也就是说,当读取一不数据时,不必再关心这个数值应当是哪种字节。DatalnputStream 类与DataOutputStream类的构造方法如下。
 

1. DatalnputStream(InputStream in):使用指定的基础 InputStream 对象创建一个DataInputStream

对象

2. DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流

DataOutputStream 类提供了将字符串、double 数据、int 数据、boolean数据写入文件的方法。其中,将字符串写入文件的方法有 3种,分别是writeBytes(String s)、writeChars(String s)、writeUTF(String s)。由于Java 中的字符是Unicode 编码,是双字节的,writeBytesO方法只是将字符串中的每一个字符的低字节内容写入目标设备中;而writeCharsO方法将字符串中的每一个字符的两个字节的内容都写到目标设备中;writeUTFO方法将字符串按照UTF 编码后的字节长度写入目标设备,然后才是每一个字节的UTF 编码。

DatalnputStream 类只提供了一个readUTFO方法返回字符串。这是因为要在一个连续的字节流读取一个字符串,如果没有特殊的标记作为一个字符串的结尾,并且不知道这个字符串的长度,就无法知道读取到什么位置才是这个字符串的结束。DataOutputStream 类中只有writeUTFO方法向目标设备中写入字符串的长度,所以也能准确地读回写入字符串。

 例题15.6
 

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class DataStreamDemo {
 
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		File file = new File("C:\\happy\\word.txt"); // 创建文件对象
		FileOutputStream fos = new FileOutputStream(file);
		DataOutputStream dos = new DataOutputStream(fos);
		dos.writeBoolean(false);
		dos.writeUTF("你好世界");
		dos.writeDouble(13.25);
		dos.close();
		fos.close();
		
		
		FileInputStream fis = new FileInputStream(file);
		DataInputStream dis = new DataInputStream (fis);
		System.out.println(dis.readBoolean());
		System.out.println(dis.readUTF());//输出字符串
		System.out.println(dis.readDouble());
		dis.close();
		fis.close();
		
	}
 
}

 运行结果如下:

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

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

相关文章

宁波市:做大做强跨境电商 赋能外贸创新发展

近日&#xff0c;全国政协第十四届常委会第二次会议专题研究“构建新发展格局&#xff0c;推进中国式现代化”议题&#xff0c;市政协主席徐宇宁参加“推动高水平对外开放”专题小组讨论&#xff0c;全国政协副主席蒋作君到会听取发言&#xff0c;国家发改委、商务部相关司局负…

AI的Prompt是什么

一.AI的Prompt的作用 在人工智能&#xff08;AI&#xff09;中&#xff0c;"Prompt"通常指的是向AI系统提供的输入或指令&#xff0c;用于引导AI进行特定的操作或生成特定的输出。例如&#xff0c;在一个对话型AI系统中&#xff0c;用户输入的问题就是一个prompt&…

设计模式:观察者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

简介&#xff1a; 观察者模式&#xff0c;它是一种行为型设计模式&#xff0c;它允许一个对象自动通知其依赖者&#xff08;观察者&#xff09;状态的变化。当被观察者的状态发生改变时&#xff0c;它会通知所有的观察者对象&#xff0c;使他们能够及时做出响应。在观察者模式…

c++ json 库的调用报错 “value, object or array expected“

表示输入的json 文件&#xff0c;写的格式有点不正确例如 双引号 逗号 字符串 列表等 aa.json 出现了一些问题&#xff0c;不是代码问题

Kubernetes概述及其组件/核心组件

Kubernetes 概述&#xff1a; 1、K8S 是什么&#xff1f; K8S 的全称为 Kubernetes (K12345678S)&#xff0c;PS&#xff1a;“嘛&#xff0c;写全称也太累了吧&#xff0c;不如整个缩写”。 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#xff08;containerized&…

文章发表丨求臻医学发布病理AI模型,实现肿瘤精准分型

近日&#xff0c;求臻医学科研团队研发一款基于数字病理图像的肿瘤分型深度学习模型—TMG(The Transformer-based Multiple instance learning with Global average pooling)。该模型可有效消除对病理图像细粒度标记的依赖&#xff0c;实现高准确率的分型&#xff0c;将用于原发…

武汉凯迪正大—线圈匝间耐压测试仪

产品概述 KDYD2830绕组匝间冲击耐压试验仪适用于试验电压30kV及以下高压电机、中小型电机、直流电机的绕组匝间绝缘检测&#xff1b;也可用于变压器绕组、电器线圈绕组的匝间绝缘检测。因电机、变压器绕组由于绝缘结构和绝缘材料的不一致&#xff0c;特别是操作者工艺水平的不…

全志R128适配 ST7789v LCD

适配 ST7789v LCD R128 平台提供了 SPI DBI 的 SPI TFT 接口&#xff0c;具有如下特点&#xff1a; Supports DBI Type C 3 Line/4 Line Interface ModeSupports 2 Data Lane Interface ModeSupports data source from CPU or DMASupports RGB111/444/565/666/888 video form…

华为bug汇报:华为NPU竟成“遥遥领先”?

华为bug汇报&#xff1a;华为NPU竟成“遥遥领先”&#xff1f; 本文为我汇报在Ascend / pytorch 社区的一个bug&#xff0c;其中对NPU的实际算力进行了测试&#xff0c;并发现了华为NPU实际显存与销售宣传时存在着较大差差距的问题&#xff08;算力问题见问题一、显存问题见问…

数据分析和机器学习的11个高级可视化图表介绍

可视化是一种强大的工具&#xff0c;用于以直观和可理解的方式传达复杂的数据模式和关系。它们在数据分析中发挥着至关重要的作用&#xff0c;提供了通常难以从原始数据或传统数字表示中辨别出来的见解。 可视化对于理解复杂的数据模式和关系至关重要&#xff0c;我们将介绍11…

【软考】12.3 质量管理/风险管理

《质量管理》 影响质量&#xff1a;范围、进度、成本质量规划 ——> 质量保证&#xff08;阶段性评审&#xff09; ——> 质量控制&#xff08;实时监控&#xff09; 质量特性 功能性、可靠性、可用性、效率、可维护性、可移植性 McCall质量模型 产品修正、产品转移、…

CPU和GPU有什么区别?

CPU&#xff1a;叫做中央处理器&#xff08;central processing unit&#xff09;作为计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元。 GPU&#xff1a;叫做图形处理器。图形处理器&#xff08;英语&#xff1a;Graphics Processing Unit&#x…

快来get策略模式,告别编程困惑,轻松变身编程高手✨

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…

【网络】网络编程套接字(二)

网络编程套接字 二 简单的TCP网络程序1、服务端创建套接字并绑定2、服务端监听2、服务端获取连接3、服务端处理请求4、客户端进行连接5、客户端发起通信6、通信测试 简单的TCP网络程序 TCP服务器创建套接字的做法与UDP服务器是基本一样的&#xff0c;但是TCP服务器会更加繁琐一…

独立产品灵感周刊 DecoHack #053 - 有意思的地图网站

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 周刊继续发布 ❤️ &#x1f4bb; 产品推…

电脑屏幕模糊?这5个方法教你恢复清晰屏幕!

“我的电脑最近看着看着莫名就觉得好模糊&#xff0c;这到底是为什么呢&#xff1f;有什么方法可以解决电脑屏幕模糊的问题吗&#xff1f;” 使用电脑时&#xff0c;电脑屏幕是否清晰会很影响我们的使用体验感。如果电脑屏幕模糊&#xff0c;可能会给我们带来一种视觉上的不好体…

C#中的日期时间比较和格式化的方法

摘要&#xff1a;在C#中&#xff0c;日期和时间的比较以及格式化是常见的操作。了解如何正确比较和格式化日期和时间可以帮助我们更好地处理这些数据。本文将介绍C#中常用的日期时间比较方法&#xff08;CompareTo、Equals和比较运算符&#xff09;以及日期时间格式化方法&…

vue重修之路由【下】

文章目录 版权声明路由重定向、404&#xff0c;路由模式重定向404路由模式 声明式导航vue-routerrouter-link-active 和 router-link-exact-active定制router-link-active 和 router-link-exact-active跳转传参两种跳转传参总结 编程式导航两种语法路由传参path路径跳转传参nam…

Kafka3.x安装以及使用

一、Kafka下载 下载地址&#xff1a;https://kafka.apache.org/downloads 二、Kafka安装 因为选择下载的是 .zip 文件&#xff0c;直接跳过安装&#xff0c;一步到位。 选择在任一磁盘创建空文件夹&#xff08;不要使用中文路径&#xff09;&#xff0c;解压之后把文件夹内容剪…

10个最流行的开源机器视觉标注工具

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 我们知道寻找良好的图像标记和注释工具对于创建准确且有用的数据集的重要性。 随着图像注释空间的增长&#xff0c;我们看到开源工具的可用性激增&#xff0c;这些工具使任何人都可以免费标记他们的图像并从强大的功能中受…