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

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例程测试效果图,重定向输出产生的文件:
在这里插入图片描述

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

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

相关文章

西南交通大学计算机软件专业上岸难度分析

C哥专业提供——计软考研院校选择分析专业课备考指南规划 西南交通大学计算机科学与技术2024届考研难度整体呈现"稳中有升"的态势。学硕实际录取33人,复试分数线362分,复试录取率71.74%;专硕(计算机技术)实际…

Mac M3安装VMWare Fusion

最近学习Spark需要下载VM Ware,但是我的电脑是MAC M3系列,百度说不能下载Workstation Pro,Workstation Pro 适用于Windows、Linux系统。而MAC M系列电脑需要下载Fusion Pro 。 Fusion Pro的下载页面很难找到。根据以下指引可正确下载&#x…

OpenCV物体跟踪:使用CSRT算法实现实时跟踪

目录 简介 CSRT算法简介 实现步骤 1. 初始化摄像头和跟踪器 2. 读取视频帧和初始化跟踪 3. 实时跟踪和显示结果 4. 显示和退出 5、结果展示 总结 简介 在计算机视觉和视频处理领域,物体跟踪是一项核心技术,它在监控、人机交互、运动分析等方面…

纯前端实现语音合成并输出提示

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>语音合成</title><style>body {max-…

解决mac ssh端终端只有黑白颜色的问题

主要是因为没有开启颜色配置。修改下文件即可 cd ~ vi .zshrc 内容如下 export LS_OPTIONS--colorauto export CLICOLORYes export LSCOLORSExgxcxdxcxegedabagGxGx 关闭终端后重登录&#xff0c;这下有颜色了好看了 配色&#xff1a;目录蓝 可执行绿 软链青 颜色配置 详…

使用网络爬虫爬取豆瓣电影网站的数据

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

MySQL数据库操作——(4)

目录 8 视图 8.1 常见的数据库对象 8.2 视图概述 8.2.1 为什么使用视图&#xff1f; 8.2.2 视图的理解 8.3 创建视图 8.3.1 创建单表视图 8.3.2 创建多表联合视图 8.3.3 基于视图创建视图 8.4 查看视图 8.5 更新视图的数据 8.5.1 一般情况 8.6 修改、删除视图 8.…

Linux kernel 堆溢出利用方法

前言 本文还是用一道例题来讲解几种内核堆利用方法&#xff0c;内核堆利用手段比较多&#xff0c;可能会分三期左右写。进行内核堆利用前&#xff0c;可以先了解一下内核堆的基本概念&#xff0c;当然更好去找一些详细的内核堆的基础知识。 概述 Linux kernel 将内存分为 页…

数据结构_day3

目录 4.栈 stack 4.2.1 特性 练习&#xff1a; 4.3 链式栈 4.3.1 特性 总结&#xff1a; 4.栈 stack 4.2.1 特性 逻辑结构&#xff1a;线性结构 存储结构&#xff1a;顺序结构 操作&#xff1a;创建、入栈、出栈、判空和判满 创空&#xff1a; 入栈&#xff1a; 出栈&#xff1…

【自然语言处理】多头注意力机制 Multi-Head Attention

多头注意力&#xff08;Multi-Head Attention&#xff09;机制是Transformer模型中的一个关键组件&#xff0c;广泛用于自然语言处理任务&#xff08;如机器翻译、文本生成等&#xff09;以及图像处理任务。它的核心思想是通过多个不同的注意力头来捕获输入的不同特征&#xff…

虚拟现实与Facebook的结合:未来社交的全新体验

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正在逐步改变人们的社交方式。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;积极探索如何将虚拟现实融入其社交生态系统&#xff0c;创造全新的用户体验。这一结合不仅影响了用户之间…

深度解析机器学习的四大核心功能:分类、回归、聚类与降维

深度解析机器学习的四大核心功能&#xff1a;分类、回归、聚类与降维 前言分类&#xff08;Classification&#xff09;&#xff1a;预测离散标签的艺术关键算法与代码示例逻辑回归支持向量机&#xff08;SVM&#xff09; 回归&#xff08;Regression&#xff09;&#xff1a;预…

探索秘境:如何使用智能体插件打造专属的小众旅游助手『小众旅游探险家』

文章目录 摘要引言智能体介绍和亮点展示介绍亮点展示 已发布智能体运行效果智能体创意想法创意想法创意实现路径拆解 如何制作智能体可能会遇到的几个问题快速调优指南总结未来展望 摘要 本文将详细介绍如何使用智能体平台开发一款名为“小众旅游探险家”的旅游智能体。通过这…

获取非加密邮件协议中的用户名和密码——安全风险演示

引言 在当今的数字时代,网络安全变得越来越重要。本文将演示如何通过抓包工具获取非加密邮件协议中的用户名和密码,以此说明使用非加密协议的潜在安全风险。通过这个演示,我们希望能提高读者的安全意识,促使大家采取更安全的通信方式。 注意: 本文仅用于教育目的,旨在提高安全…

【MyBatis】初识MyBatis 构建简单框架

目录 MyBatis前言搭建一个简单的MyBatis创建Maven项目引入必要依赖创建数据表结构创建User实体类创建Mapper接口Mapper层Dao层 创建MyBatis的Mapper映射文件编写测试类传统测试类JUnit测试 MyBatis 介绍&#xff1a;MyBatis是一款半自动的ORM持久层框架&#xff0c;具有较高的…

Linux下ClamAV源代码安装与使用说明

Linux下ClamAV源代码安装与使用说明 ClamAV(Clam AntiVirus)是一款开源的防病毒工具,广泛应用于Linux平台上的网络安全领域。它以其高效的性能和灵活的配置选项,成为网络安全从业人员的重要工具。ClamAV支持多线程扫描,可以自动升级病毒库,并且支持多个操作系统,包括Li…

NGINX 保护 Web 应用安全之基于 IP 地址的访问

根据客户端的 IP 地址控制访问 使用 HTTP 或 stream 访问模块控制对受保护资源的访问&#xff1a; location /admin/ { deny 10.0.0.1; allow 10.0.0.0/20; allow 2001:0db8::/32; deny all; } } 给定的 location 代码块允许来自 10.0.0.0/20 中的任何 IPv4 地址访问&#xf…

可视化大屏中运用3D模型,能够带来什么好处。

现在你看到的可视化大屏&#xff0c;大都会在中间放置一些3D模型&#xff0c;比如厂房、园区、设备等等&#xff0c;那么这些3D模型的放置的确给可视化大屏带来了不一样的视觉冲击&#xff0c;本文将从以下四个方面来分析这个现象。 一、可视化大屏中越来越多使用3D模型说明了…

Linux工具的使用-【git的理解和使用】【调试器gdb的使用】

目录 Linux工具的使用-031.git1.1git是什么1.2git在linux下的操作1.2.1创建git仓库1.2.2 .gitignore1.2.3 .git&#xff08;本地仓库&#xff09;1.2.4 add (添加)1.2.5 commit(提交)1.2.6push(推送)对两个特殊情况的处理配置免密码push 1.2.7 log(获取提交记录)1.2.8 status(获…