Java 输入与输出(I/O)流的装饰流【处理流】

news2024/11/26 16:30:59

Java I/O流的装饰流

按照Java 输入与输出(I/O)流的处理功能:I/O流可分为低级的节点流和高级的装饰流(又称处理流)。

  • 节点流是直接从数据源(数据源可以是文件、数组、内存或网络)读/写数据的输入输出流;
    节点流的示意图:
    在这里插入图片描述
  • 装饰流(又称处理流),是指用于对一个已存在的输入输出流进行装饰的流,装饰流在不改变数据信息的情况下添加额外的增强功能。因为装饰流不会直接连接到实际的数据源,不能够直接获取数据,所以构建一个装饰流时,需要在构造函数中传入一个节点流。装饰流可进行多层嵌套装饰。
    例如,BufferedInputStream是FileInputStream的装饰流,它为文件输入流提供缓冲功能,从而提高读取文件的效率。
    在这里插入图片描述

Java的装饰流可对节点流或处理流进行的装饰,以提高性能或增加功能。装饰流可以分为两类:

  • 字节处理流:BufferedInputStream,BufferedOutputStream,DataInputStream,DataOutputStream等。
  • 字符处理流:BufferedReader,BufferedWriter,InputStreamReader,OutputStreamWriter等。

常见的装饰流都属于过滤流,例如:
在这里插入图片描述

一、缓冲流

缓冲流是Java I/O中的一个重要概念,它可以提高文件读写的性能。

由于磁盘的IO处理速度远低于内存的读写速度。
为了提高文件读写性能,我们可以使用缓冲流。缓冲流使用内存缓冲区,可以一次性读取或写入大量数据,从而减少与磁盘的交互次数,提高整体性能。

缓冲流有两种类型:缓冲字节流和缓冲字符流。
缓冲字节流包括BufferedInputStream和BufferedOutputStream,而缓冲字符流包括BufferedReader和BufferedWriter。
在这里插入图片描述
缓冲流是装饰流(处理流),不能直接访问数据源,必须使用节点流作为参数,通过节点流的桥梁实现访问数据源的目的。
下面是一个字节缓冲流的演示例程【文件拷贝程序】:

package IOStream;
import java.io.*;
public class BufferedStreamDemo {
	public static void copyFileWithBuffered(String srcPath,String destPath) {
        File src = new File(srcPath);
        File dest = new File(destPath);
        byte[] buffer = new byte[1024];
        int len;
        try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
        	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))){
            while((len = bis.read(buffer)) != -1){
                bos.write(buffer,0,len);
            }
		} catch (IOException e) {
			e.printStackTrace();
		}    
	}
	
	public static void main(String[] args) {
        String sPath = "D:/src/mp4/九寨沟风景.mp4";
        String dPath = "D:/src/mp4/九寨沟风景B.mp4";
        copyFileWithBuffered(sPath, dPath);
        System.out.println("文件复制成功!");
	}
}

测试结果:
在这里插入图片描述

二、数据流

DataInputStream和DataOutputStream是 Java的数据流,数据流是一个装饰流(处理流)。数据流在读取和写入时的顺序要一致。否则,读取的数据必定是错误的,会造成乱码。

数据流DataInputStream和DataOutputStream扩展了基本输入输出流读取基本数据类型和String类型数据的功能。数据流能以一种与平台无关的方式,直接从字节输入读取或向字节输出流写出Java基本类型和String类型的数据,常用于网络传输。

数据输出流DataOutputStream
DataOutputStream继承自FilterOutputStream,而 FilterOutputStream 又继承了 OutputStream。数据输出流拥有基本数据类型的写入操作。其writeUTF(String text)方法可将字符串写入数据输出流。但它不能直接连接数据源,它只能用于装饰节点流。

DataOutputStream定义了各种数据类型的写入方法write()方法,用于写入 Java 基础数据类型的数据和String数据:
在这里插入图片描述

数据输入流DataInputStream
DataInputStream继承自FilterInputStream,而 FilterInputStream 又继承了 InputStream,该数据输入流拥有基本数据类型的数据读取操作。使用readUTF()方法可从数据输入流中读取字符串。
DataInputStream中定义了各种数据类型的读取方法read(),用于读取 Java 基础数据类型的数据和String型的数据:
在这里插入图片描述
下面是一个演示例程:

package file;
import java.io.*;
public class DataIOTest {
	public static void main(String[] args) {
		String path =  "D:/src/tmp/testFile.txt";
		try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File(path)));
			DataInputStream dis = new DataInputStream(new FileInputStream(new File(path)))) {
			dos.writeInt(128);
			dos.writeBoolean(true);
			dos.writeDouble(3.1416);
			dos.writeUTF("天佑中华!");
			dos.flush();
			
			int i = dis.readInt();
			boolean flag = dis.readBoolean();
			double d = dis.readDouble();
			String tempUTF = dis.readUTF();
			System.out.println(i+" : "+flag+" : "+d+" : "+tempUTF);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

三、打印流
Java中的打印流可分为打印流(PrintStream)和打印写入器(PrintWriter),是两个用于输出信息到文本的类。

字节打印流(PrintStream)

PrintStream可以以一个节点流(FileOutputStream,ByteArrayOutputStream,或其他输出流)作为参数构造,并且提供了一系列的print和println方法用于输出各种类型的数据。
在这里插入图片描述
在这里插入图片描述
先请看一个PrintStream打印流的演示例程PrintStreamDemo:

package IOStream;
/***
 * @author QiuGen
 * @description  打印流(PrintStream)演示例程PrintStreamDemo
 * 实现两个功能:
 * 1,方法printToSystemOut():使用PrintStream打印到控制台;
 * 2,方法printToFile():使用PrintStream打印到文件。
 * @date 2024/10/20
 * ***/
import java.io.FileOutputStream;
import java.io.PrintStream;
public class PrintStreamDemo {
	static String poem[] = { "《凉州词》王翰",
		"葡萄美酒夜光杯,","欲饮琵琶马上催。",
		"醉卧沙场君莫笑,","古来征战几人回。"};
	/***使用PrintStream打印到控制台***/
	public static void printToSystemOut() {
        PrintStream ps = System.out; // 获取标准输出流
        for (String line : poem) {
        	ps.println(line); // 打印字符串
		}
        
        ps.print("\n这首诗的行数:");
        ps.println(poem.length); // 打印数字
	}
	
	/***使用PrintStream打印到文件***/
	public static void printToFile() {
		String path = "D:/temp/凉州词.txt";
        try(FileOutputStream out = new FileOutputStream(path);
        	PrintStream ps = new PrintStream(out)) {
            
            for (String line : poem) {
            	ps.println(line); // 打印字符串
    		}
            
            ps.print("\n这首诗的行数:");
            ps.println(poem.length); // 打印数字
        } catch (Exception e) {
            e.printStackTrace();
        }
	}

	public static void main(String[] args) {
		printToSystemOut();//打印到控制台
		PrintStreamDemo.printToFile(); //打印到文件
	}
}

字节打印流(PrintStream)演示例程PrintStreamDemo测试效果图:
在这里插入图片描述
打印流PrintStream的应用——输出重定向

Java系统预定义了三个标准输入/输出流,两个对象System.in和System.out,分别代表来自键盘的标准输入和往屏幕的标准输出,另一个标准错误输出流System.err对象也向屏幕输出。
System.out和System.err是标准输出流和标准错误输出流,是OutputStream实现类PrintStream类的实例。

什么是输出重定向?

输出重定向指的是将原本应该输出到标准输出(System.out)设备(如控制台或屏幕)的信息,改为输出到指定的文件或其他输出流中。这种机制在日志记录、错误信息捕获、数据持久化等场景中非常有用。
如果要将标准输出重定向输出到一个文件,需要传递一个代表文件的PrintStream对象来调用setOut()方法。重定向例程IoRedirectDemo如下:

package file;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
public class IoRedirectDemo {
	public static void main(String[] args) throws IOException {
	    File outFile = new File("D:/temp/stdout.log");
	    PrintStream ps = new PrintStream(new FileOutputStream(outFile));
	    System.out.println(outFile.getAbsolutePath());
	    System.setOut(ps); //设置标准输出重定向至文件
//以下信息本来是输出到标准输出(屏幕)的,重定向后输出至文件中
	    System.out.println("安得广厦千万间,大庇天下寒士俱欢颜。");
	    System.out.println("Java I/O 重定向演示!");
        // 重定向结束后,记得关闭ps
        ps.close();
	}
}	//IoRedirectDemo例程结束。

重定向IoRedirectDemo例程测试效果图,重定向输出产生的文件:
在这里插入图片描述

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

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

相关文章

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为: ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…

三个必须了解的知乎知+广告账户知识!

作为国内领先的问答社区,知乎以其高质量的内容和深度讨论吸引了大量专业和兴趣导向的用户群体。对于希望精准触达目标用户的广告主来说,知乎的信息流广告无疑是一个不可多得的营销渠道,云衔科技助力企业知乎广告开户投放及代运营服务。 1. 知…

【rom分享】PSP体育游戏大众高尔夫玩法介绍,不要错过

各位新老观众大家好,今天我将介绍知名掌机PSP的所有游戏,PSP的游戏库非常庞大,随着PSP模拟器的普及,你可以在安卓和苹果两大平台的移动设备上游玩,也可以在PC上面游玩,当然你也可以收藏一个PSP掌机进行游玩…

python3的语法及入门(近7000字,耐心看包全,看完记得点赞)!

1. Python3 基础语法 缩进:Python 使用缩进来表示代码块,通常使用 4 个空格。 语句:一行代码就是一个语句。 变量:不需要声明类型,直接赋值即可。 2. Python3 基本数据类型 Python 中的基本数据类型包括整数、浮点…

Shell学习——shell中的变量

目录 一、父shell和子shell: 二、系统预定变量 定义方式: 脚本举例 ​编辑 四、只读变量 五、撤销变量 六、小结 七、特殊变量 $n $# $*、$ $? 一、父shell和子shell: 由于shell的原理可以理解为套娃,因此有父shell…

【实战案例】Django框架连接并操作数据库MySQL相关API

本文相关操作基于上次操作基本请求及响应基础之上【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 Django框架中默认会连接SQLite数据库,好处是方便无需远程连接,打包项目挪到其他环境安装一下依赖一会就跑起来,但是缺点…

你知道吗?这个岗位只招2人,但HR那边却收到了1w份简历

引言 在当前经济环境下,求职者面临的挑战越来越大。互联网行业尤其如此,许多人挤破头都想进入大厂,但竞争异常激烈。如今的就业市场确实变得异常艰难。然而,随着AI大模型技术的兴起,对于那些掌握了相关技能的专业人才…

学习笔记——交换——STP(生成树)基本概念

三、基本概念 1、桥ID/网桥ID (Bridege ID,BID) 每一台运行STP的交换机都拥有一个唯一的桥ID(BID),BID(Bridge ID/桥ID)。在STP里我们使用不同的桥ID标识不同的交换机。 (2)BID(桥ID)组成 BID(桥ID)组成(8个字节):由16位(2字节)的桥优先级…

Java基于SSM微信小程序物流仓库管理系统设计与实现(lw+数据库+讲解等)

选题背景 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

wordcloud分词生成

代码如下 _ from wordcloud import WordCloud import PIL.Image as image import numpy as np import jiebadef cut(text):word_list jieba.cut(text,cut_all True)# 分词后在单独个体之间加上空格result " ".join(word_list)return result#导入文本文件,进行分词…

免费ppt模板从哪找?全面又实用的PPT模板就在这找

就是说有多少刚上大学的朋友,为了交一份完美的PPT报告,手写列大纲、找报告文献/插图素材......最后手动整理排版,老老实实地熬了几个大夜? 24年都快结束啦,大家还没学会去免费的ppt模板网站下载精美的主题PPT一键替换吗…

政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行

目录 简介 什么是@gradio/lite? 入门 1.导入 JS 和 CSS 2. 创建标签 3. 在标签内编写你的 Gradio 应用程序 更多示例:添加其他文件和要求 多个文件 其他要求 SharedWorker 模式 代码和演示playground 1.无服务器部署 2.低延迟 3. 隐私和安全 限制 尝试一下!…

VScode远程开发之remote 远程开发(二)

VScode远程开发之remote 远程开发(二) 使用vscode进行远程开发很简单,在拓展里搜索 Remote Development,就可以搜索到微软提供的远程开发大礼包,里面包含了 通过 SSH 远程服务器 远程容器 远程 WSL(Win…

亚马逊测评自养号技术及采购下单成功率揭秘

在亚马逊测评中,自养号面临砍单、买家号关联等问题时,需要采取一系列策略和技术手段来提高采购下单的成功率。以下是一些具体的解决方案: 一、解决砍单问题 1.确保硬件参数独立 每个账号应使用具有独特硬件标识的设备,如IMEI、…

【大模型实战篇】大模型分词算法WordPiece分词及代码示例

继《大模型数据词元化处理BPE(Byte-Pair Encoding tokenization)》之后,我们针对大模型原始数据的分词处理,继续分享WordPiece分词技术【1】。 1. 原理分析 WordPiece 是 Google 开发的分词算法,用于预训练 BERT。此后,它被多个基…

uni-app中添加自定义相机(微信小程序+app)

一、微信小程序中 微信小程序中可以直接使用camera标签&#xff0c;这个标签不兼容app&#xff0c;官方文档 <cameradevice-position"back"flash"off":style"{ height: lheight px, width: lwidth px }"class"w-full"></c…

vue3【实战】 渲染 md 文件(markdown语法 .md后缀的文件)

1. 安装相关插件 npm i unplugin-vue-markdown markdown-it-prism prism unhead/vue2. 添加配置 src/main.ts // 给 md 文件创建头部 import { createHead } from unhead/vue // md 文件中代码高亮的样式 import prismjs/themes/prism.css // 自定义 md 文件的样式 import /as…

【JAVA面试题】什么是Springboot的自动配置以及注意事项

文章目录 强烈推荐核心概念&#xff1a;自动配置的关键特点&#xff1a;示例&#xff1a; 需要注意的点1.默认配置可能不适合所有场景2.Bean 冲突与覆盖3.应用启动慢的问题4.过度依赖自动配置5.安全性问题6.依赖冲突与版本兼容7.过多不必要的自动配置8.调试困难 专栏集锦 强烈推…

.net framework 3.5sp1安装错误卡住不动怎么解决

解决 .NET Framework 3.5 SP1 安装错误卡住的问题&#xff0c;可以尝试以下几种方法&#xff1a; 1.使用 DISM 工具&#xff1a; 将下载的 NetFx3.cab 文件放置在 C:\Windows 文件夹下。 以管理员身份打开命令提示符&#xff0c;输入以下命令&#xff1a; dism /online /En…

【web前端设计】jquery图标动画特效

学习目标 学习web前端设计技术&#xff08;HTML、css、JavaScript、jQuery等&#xff09;&#xff0c;综合运用技术&#xff0c;将其与HTML元素结合&#xff0c;设计样式、监听事件、添加动画等&#xff0c;给用户呈现出更好的视觉交互效果。本文主要学习分页按钮自动放大、元…