字节流、字节流、转换流、打印流

2023-11-19

字节流、字节流、转换流、打印流

一. 字符流
  • 概述:
字符流只能操作有文字的文件【纯文本文件】,
  • 字符流的操作原理:
字符输入流: 先把字节从文件中读取出来(使用的字节流读的),根据文件的编码集把字节数变为对应的字符,把字符 读到内存中[解码的过程] 
字符输出流: 先把输出的内容以字符形式写出,把字符根据流中的编码集变成字节数,(使用字节输出流)在把字节写 到目标文件【编码的过程】
  • 注意 :

以后如果我们只是想单纯完成数据搬运的时候,直接使用字节流即可,因为效率高.

如果咱们在搬运数据的时候,需要认为查看,就是用字符流.

1.Reader[字符输入流]
  • 概述:
在读取文本文件时对数据操作使用单位是字符的输入流就是字符输入流 他是字符输入流的顶层父类 他是一个抽象类定义字符输入流的共性功能 想要使用找他的子类设备不一样子类 就不一样 
使用典型子类FileReader
  • 共性功能:
int read():一次读取一个字符 返回值是读到的字符, 读取到文件末尾返回值-1.
int read(char[] ch): 一次读取多个字符,存储到char数组中, 返回值是读到的有效的字符个数,返回值 是-1也表示读取到文件末尾了. 
close():关闭流
1.1 FileReader
  • 概述:

是Reader的子类【孙子辈】,负责内存和磁盘之间字符的读取交互的流,它没有自己的功能,他的功能就是 Reader的功能。

  • 构造方法
FileReader(File file):创建一个以file对象对应的文件为目标文件的字符输入流对象 
FileReader(String path):创建一个以path路径对应的文件为目标文件的字符输入流对象
2.Write[字符输出流]
他是字符输出流的顶层父类,他是抽象类,定义了字符输出流的共性方法,不能使用自己方法【不能创建对 象】只有找子类对象来使用功能,子类根据不同的设备有不同子类。
常用子类:FileWriter 
注意:字符输出流自带缓冲区。
  • 常用方法
write(int c):写出单个字符到磁盘文件 
write(String str):写出字符串到磁盘文件 
write(char[] arr):写出字符数组的全部字符到磁盘文件 
write(char[] arr, int offset, int len):写出字符数组的部分字符到磁盘文件 
offset:写出的开始字符的索引值 
len:写出的字符的长度【个数】 
不能大于数组长度-开始索引【offset】 
close():关闭流资源
flush():刷新缓冲区
2.1 FileWrite
  • 概述

他是Writer的间接子类[孙子辈],负责完成内存和磁盘之间字符数据输出交互的流,他没有自己的功能,都是 Writer的功能

  • 构造方法
FileWriter(File file): 创建以File对象对应的文件为目标文件的字符输出流对象 
FileWriter(String path): 创建以path路径对应的文件为目标文件的字符输出流对象
  • 注意事项
1、字符输出流创建对象的时候检查目标文件在磁盘中是否存在: 
存在:不会自动的创建空白文件,但是会对文件做格式化处理 
不存在:系统自动创建一个空白文件出来【文件所在目录必须存在】
  • 追加功能
FileWriter(File file,boolean b)FileWriter(String path,boolean b): 
注意:参数b必须传入true为续写
二. 字符缓冲流[高效字符输入输出流]
  • 概述:
就是用来给字符流提升效率的一个流,他可以理解为就是一个对普通字符流进行包装的工具流。本身没有操作 数据的功能,但是结构衍生了可以操作流的功能,属于他特有功能.

分类:
字符输入缓冲流【BufferedReader】 增强普通字符输入流 FileReader 
字符输出缓冲流【BufferedWriter】 增强普通字符输出流 FileWriter
    
构造方法:
BufferedReader(Reader r) :创建一个提升指定字符输入流r的效率的字符输入缓冲流对象 BufferedWriter(Writer w) : 创建一个提升指定字符输出流w的效率的字符输出缓冲流对象
    
特有方法:
字符输入缓冲流【BufferedReader】: 
    String readLine():一次读取一行的数据【行不是屏幕上看到的行】 读取文件末尾的标志,返 回null 

字符输出缓冲流【BufferedWriter】: 
    newLine():换行    效果和写出字符串 "\r"或"\n
    
  • 字符缓冲流高效的原理
字符输入缓冲流BufferedReader: 
当使用字符输入缓冲流读取字符的时候,首先缓冲流对象在内存中创建一个8192大的字符数组,然后一次性的到目标 文件读取8192个字符回来存到字符数组中,然后内部的字符输入流每次根据调用的读取方法到字符数组中读取对应的 个数到内存中,减少了内存和目标文件(硬盘)的交互次数,提高效率。 

字符输出缓冲流BufferedWriter 当使用字符输出缓冲流往外写字节的时候,首先缓冲流对象在内存中创建一个8192大的字符数组,字符输出流每次根 据调用write方法把要写出的字符数写到字符数组中,如果字符数组被写满了自动的一次性写到目标文件中【清空字 节数组再次的写】,减少了内存和目标文件(硬盘)的交互次数,提高效率。

三. 转换流[重点]

  • 概述:

他是字符流子类,转换流本质是字符流,只能操作纯文本文件,他可以对字符流的编码集进行指定转换。

  • 作用:
  1. 指定io流的操作的使用编码集
  2. 完成字节流和字符流的相互转换
  • 分类
输入转换流【InputStreamReader】 字节流通向字符流的桥梁
输出转换流【OutputStreamWriter】字符流转为字节流的桥梁
    
    
    创建时候使用它提供的构造方法: 
	InputStreamReader(InputStream is, String charsetName),传入一个字节输入流,把字节输入流 读取到的字节信息使用指定字符集名称转为字符.就可以避免读取操作的乱码.
        
    OutputStreamWrtier(OutputStream os, String charsetName),传入字节输出流,把要写出的字符 信息,使用指定字符集转为字节数据,再使用字节流把字节数据写到目标文件.避免写出数据是乱码的出现.
3.1 InputStreamReader【输入转换流】
//举例
// 创建字节输入流
FileInputStream fis = new FileInputStream("day20/c/2.txt"); 
String charsetName = "gbk"; // 读取的文件字符集是GBK, 是以GBK的方式读取字节,读取到java程序中.
InputStreamReader isr = new InputStreamReader(fis, charsetName); 
	int i = 0; 
	while ((i = isr.read()) != -1) { 
   	 System.out.println((char)i); 
	}
	isr.close();
	fis.close();
3.2 OutputStreamWriter[输出转换流]
//举例
FileOutputStream fos = new FileOutputStream("day20/c/3.txt", true); 
String charsetName = "GBK"; // 使用指定字符集把要写的数据转为字节信息,此时写出时使用字符集是GBK,
OutputStreamWriter osw = new OutputStreamWriter(fos, charsetName); 
osw.write('哈哈'); 
osw.write("是真爱"); 
osw.close();
fos.close(); 
}
  • 总结:
1.如果操作IO操作文件字符集和java程序字符集一致的时候,就没有必要使用这两个流. 

2.当IO操作字符集和Java程序不一致时,就要使用InputStreamReader读取文件,只要保证读取时指定
字符集和目标文件字符集一致即可. 写出时候就要使用OutputStreamWriter,,只要保证写出时指定字
符集和目标文件字符集一致即可

无论是转换输入流,还是转换输出流, 指定字符集的时候,都是参考要操作的文件字符集来设置, 文件
是什么字符集,就指定什么字符集.
3.3 标准输入输出流
  • 标准输入流
System.in:
	该流的类型为InputStream,属于是字节流,默认关联的设备为键盘,即数据源为键盘 
		如何提供标准输入的输入能力: 
		使用转换流InpuStreamReader可以包装成字符流,使用BufferedReader可以包装成缓 冲流 通过

    //举例
// 修改标准输入流关联的位置 
// 先修改关联的位置 
System.setIn(new FileInputStream("day20/a/1.txt"));
	// 再获取标准输入流 
	InputStream in = System.in; 
	int i = 0; 
	while ((i = in.read()) != -1) {
   	 	System.out.println((char)i);
	}

System.setIn(InputStream in),可以更改标准输入流关联的设备 
该流对象不需要关闭 
修改关联设备注意事项:
1.先修改关联设备 
2.再获取标准输入流
    
    
    //举例
// 增强标准输入流读取能力 
// BufferedReader readLine
// BufferedReader只能增强字符流,不能直接增强System.in(标准输入流,字节流) 
// InputStreamReader 字节流通向字符流的桥梁,它就可以把字节流包装为字符流 
// 使用它的构造方法: InputStreamReader(InputStream is) 
    InputStreamReader isr = new InputStreamReader(System.in); 
	BufferedReader br = new BufferedReader(isr); 
	System.out.print("请录入一个字符串:"); 
	String msg = br.readLine(); 
	System.out.println(msg); 
	br.close(); 
	isr.close();
  • 标准输出流
System.out:
该流的类型为PrintStream,属于字节流,是字节打印流。是OutputStream的孙子辈类 
默认关联的设置是控制台,即可以将数据直接写到控制台显示 
通过System.setOut(OutputStream out),可以更改标准输出流关联的设备 
修改关联设备注意事项: 
1.先修改关联设备 
2.再获取标准输出流
//举例
// 修改标准输出流关联的位置 
// 只能传入打印流PrintStream对象, 可以使用修改位置的方式,自己制作日志功能. 
	System.setOut(new PrintStream("day20/a/10.txt")); 
	System.out.println("你好"); 
	System.out.println(new Date()+"程序出现了bug");

更改标准输出流关联的设备
修改关联设备注意事项:
1.先修改关联设备
2.再获取标准输出流

//举例
// 修改标准输出流关联的位置 
// 只能传入打印流PrintStream对象, 可以使用修改位置的方式,自己制作日志功能. 
	System.setOut(new PrintStream("day20/a/10.txt")); 
	System.out.println("你好"); 
	System.out.println(new Date()+"程序出现了bug");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字节流、字节流、转换流、打印流 的相关文章

  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐

  • 初识C++

    目录 前言 什么是C 1 第一个关键字 namespace 1 namespace的用处 2 如果使用命名空间中的变量和函数 2 C 的输入和输出函数 3 缺省参数 4 函数重载 5 引用 1 初识引用 2 引用的类型 3 引用的特性 4
  • 微信小程序领取查看优惠券,会员卡总结

    又见面了 新项目新需求 这次谈谈小程序微信卡券领卡到查看卡券的功能 在做之前 脑子一头雾水 网上查了资料 基本都是领取卡券的介绍 以为很难实现呢 其实主要工作还是在后台配置以及接口处理 前端的工作量不多 主要就是调取小程序提供的卡券接口 a
  • Gephi入学教程基础记录

    Gephi入学教程基础记录 Gephi版本0 8 1 1 CSV数据输入 1 1 中文显示问题 1 2 标签设置 2 自动生成数据 3 编辑工具介绍 1 节点的移动 2 节点的放大和缩小 3 调整节点颜色 4 边的粗细的调整 6 节点的编辑
  • (可能是)完美解决WSL2重启变IP问题

    WSL2的升级对比WSL1 IO升级是巨大的 以及完整的Linux内核 等等都是完美的Linux发行版 Windows10 解决方法有几步一步一步解决 编辑bat脚本 此方法在 microsoft WSL issues 418 获得 开机启
  • Anlios装grouplist 组件之后报错,安装tiger-vncserver

    因为之前升级了一个epel release源 然后containerd也装进去了 但是版本太低 然后以为是runc挡住了 发现没有runc 删完了containerd就可以装了 rpm ivh http mirrors wlnmp com
  • 用数组实现队列和循环队列

    1 先用数组实现一个队列 package com lv queue import java util Scanner public class ArrayQueueDemo public static void main String ar
  • Unity重要知识点

    脚本生命周期 每当脚本被加载时调用一次 1 在Awake中做一些初始化操作 void Awake 初始化public成员 2 在每次激活脚步时调用 void OnEnable 在第一次调用Update之前调用一次Start 即使取消激活 再
  • 通过注册表永久更改cmd控制台的编码为65001

    1 Win R快捷键打开注册表输入regedit 2 路径填入 计算机 HKEY LOCAL MACHINE SOFTWARE Microsoft Command Processor 3 在右边窗口新建字符串值autorun 4 双击打开a
  • Pytest自动化测试框架

    fixture 特点 命令灵活 对于setup teardown可以省略 数据共享 在conftest py配置里写方法可以实现数据共享 不需要import导入 可以跨文件共享 scope的层次及神奇的yield组合相当于各种setup和t
  • win10 ping不通 Docker ip(解决截图)

    背景 win10下载了docker desktop就是这个图 然后计划做一个springboot连接docker docker部署springboot docker 部署springboot 成功 截图 總鑽風的博客 CSDN博客 问题 s
  • 区块链技术及应用概述

    一 基本概念 什么是区块链 区块链是一种以密码学方式保证的不可篡改和不可伪造的分布式账本 关键特点 去中心化 不可篡改性 匿名性 安全可信 区块链架构 1 数据层 主要描述区块链系统的物理形式 它是从Genesis区块开始的区块链链结构 包
  • Java学习笔记11

    API与String 什么是API String String的构造方法 String对象的特点 字符串的比较 获取字符串的字符 什么是API api是application programming interface 应用程序编程接口 S
  • AD20 如何更改标题栏?Altium Designer20 实用技巧系列教程(二)

    AD20 如何更改标题栏 Altium Designer20 实用技巧系列教程 二 视频地址 https www bilibili com video BV1kf4y117TH
  • C语言程序环境剖析——探究从.c到.exe之路

    程序环境 1 程序的翻译环境和执行环境 2 详解编译 链接 2 1 翻译环境 2 2 编译的三部分 预编译 编译 汇编 2 3链接 3 运行环境 1 程序的翻译环境和执行环境 在ANSI C的任何一种实现中 都存在两个不同的环境 翻译环境
  • JavaWeb —— AJAX

    目录 AJAX 基本介绍 A synchronous JavaScript And XML 多用在 1浏览器搜索联想 2用户注册中离开光标 校验数据的正确性 同步和异步的区别 AJAX快速入门 AJAX 基本介绍 A synchronous
  • Manjaro deepin 睡眠后无法唤醒

    最近尝试换了新的桌面 之前是xfce 使用deepin感觉很棒 也很好看 但是遇到下面一个问题 问题 因为我是双系统 因此经常会来回切win linux 但是发现换了deepin桌面后睡眠无法使用了 经常一睡就凉咯 无法唤醒 经过查找问题
  • Activity的四种启动模式和应用场景

    Activity的四种启动模式和应用场景 简介 通过设置ActivityManifestActivity launchMode可以设置Activity的启动模式 默认情况下 使用启动模式 standard 同时 launchMode可以通过
  • 算法编程6:连续子数组的最大和

    问题描述 输入一个整型数组 数组中的一个或连续多个整数组成一个子数组 求所有子数组的和的最大值 要求时间复杂度为O n 示例 输入 nums 2 1 3 4 1 2 1 5 4 输出 6 解释 连续子数组 4 1 2 1 的和最大 为 6
  • CentOS的Linux系统安装docker

    docker的官方网站教程 https docs docker com engine install centos prerequisites 参照官方教程 安装了 yum install y yum utils 搜索其他教程都安装了 yu
  • 字节流、字节流、转换流、打印流

    字节流 字节流 转换流 打印流 一 字符流 概述 字符流只能操作有文字的文件 纯文本文件 字符流的操作原理 字符输入流 先把字节从文件中读取出来 使用的字节流读的 根据文件的编码集把字节数变为对应的字符 把字符 读到内存中 解码的过程 字符