Java IO学习笔记(字节流)

字节流是最基本的流,文件的操作、网络数据的传输等等都依赖于字节流。而字符流常常用于读取文本类型的数据或字符串流的操作等等。

关于字节流的API,没什么好说的,看看就知道了。这里挑几个关键点:

一、InputStream的API

1、public int read()
从输入流读取下一个数据字节。返回 0 到 255 范围内的 int 字节值。如果因已到达流末尾而没有可用的字节,则返回值 -1。

2、public int read(byte[] b)
从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少可以读取一个字节并将其存储在 b 中。此方法等同于read(b, 0, b.length)

3、public int read(byte[] b, int off, int len)
将输入流中最多 len 个数据字节读入字节数组。尝试读取多达 len 字节,但可能读取较少数量。以整数形式返回实际读取的字节数。如果由于已到达流末尾而不再有数据,则返回 -1。
参数:
b - 读入数据的缓冲区。
off - 在其处写入数据的数组 b 的初始偏移量。
len - 要读取的最大字节数。

二、OutputStream的API

1、public void write(int b)
将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。

2、public void write(byte[] b)
将 b.length 个字节从指定的字节数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。

3、public void write(byte[] b,
int off,
int len)
将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。write(b, off, len) 的常规协定是:将数组 b 中的某些字节按顺序写入输出流;元素 b[off] 是此操作写入的第一个字节,b[off+len-1] 是此操作写入的最后一个字节。
参数:
b - 数据。
off - 数据中的初始偏移量。
len - 要写入的字节数。

4、public void flush()
刷新此输出流并强制写出所有缓冲的输出字节。flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。

三、几点原则

1、不管是输入还是输出流,使用完毕后要close(),如果是带有缓冲区的输出流,应在关闭前调用flush()。

2、应该尽可能使用缓冲区,来减少IO次数,以提高性能。

3、能用字符流处理的不用字节流。

四、例子

下面是一个操作字节流的例子:

要操作的文本文件x.txt


1 白日依山尽,黄河入海流。
2 欲穷千里目,更上一层楼。
3
4 —— 王之涣《登鹳雀楼》登



1 import java.io.*;
2
3 /**
4 * Created by IntelliJ IDEA.
5 *
6 * @author leizhimin 2008-8-27 22:16:44
7 */
8 public class TestIOStream {
9 public static void main(String[] args) {
10 testStream();
11 testBufferedStream();
12 testSelectStream();
13 }
14
15 /**
16 * 字节流测试
17 */
18 public static void testStream() {
19 InputStream fis = null;
20 OutputStream fos = null;
21 try {
22 fis = new FileInputStream("C:\\x.txt");
23 fos = new FileOutputStream("C:\\xcopy.txt");
24 long num = 0; //读取字节计数
25 int bt = 0; //每次读入字节内容
26 //当读入文件末尾时,读入数据的值为-1
27 //每次读入一个字节,存放到变量bt中,直到读完整个文件
28 while ((bt = fis.read()) != -1) {
29 // System.out.print(bt); //以数字的形式逐个输出文件的每个字节
30 System.out.print((char) bt); //以字母的形式逐个输出文件的每个字节
31 fos.write(bt); //将字节写入输出流中,实现文件的copy功能
32 num++;
33 }
34 System.out.println("读取的字节数为" + num);
35 fis.close();
36 fos.close();
37 } catch (FileNotFoundException e) {
38 System.out.println("找不到指定的文件!");
39 e.printStackTrace();
40 } catch (IOException e) {
41 System.out.println("文件读取时发生IO异常!");
42 e.printStackTrace();
43 }
44 }
45
46 /**
47 * 缓冲的字节流测试
48 */
49 public static void testBufferedStream() {
50 int buffer = 10; //缓冲大小
51 try {
52 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\x.txt"));
53 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\bf2.txt"));
54 int bench = 0;
55 byte bts[] = new byte[buffer]; //创建字节流缓存
56 while ((bis.read(bts)) != -1) {
57 bos.write(bts); //将字节写入输出流中,实现文件的copy功能
58 bench++;
59 }
60 System.out.println("bench=" + bench);
61 //将输入流缓冲区中的数据全部写出(千万记住)
62 bos.flush();
63 bis.close();
64 bos.close();
65 } catch (FileNotFoundException e) {
66 System.out.println("找不到指定的文件!");
67 e.printStackTrace();
68 } catch (IOException e) {
69 System.out.println("文件读取时发生IO异常!");
70 e.printStackTrace();
71 }
72 }
73
74 /**
75 * 字节流的选择读取测试
76 */
77 public static void testSelectStream() {
78 OutputStream fos = null;
79 int buffer = 25;
80 try {
81 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\x.txt"));
82 fos = new FileOutputStream("C:\\testSelectStream.txt");
83
84 byte bts[] = new byte[buffer]; //创建缓存
85 //从输入流的第5个字节开始,往后读取10个字节,存放到缓存bts中
86 //这个方法有个陷阱,缓存buffer的大小最小为“偏移量+要读取字节数”,在次最小应该为15,否则抛IndexOutOfBoundsException异常
87 bis.read(bts, 5, 10);
88 //将字节写入输出流中,实现文件的copy功能
89 fos.write(bts);
90
91 bis.close();
92 fos.close();
93 } catch (FileNotFoundException e) {
94 System.out.println("找不到指定的文件!");
95 e.printStackTrace();
96 } catch (IOException e) {
97 System.out.println("文件读取时发生IO异常!");
98 e.printStackTrace();
99 }
100 }
101 }



注意了:
1、缓冲的功能应该通过相应的缓冲流来包装原始流来实现,而不是自己连续多次数据,最后写到一个数组中,这是很愚昧的做法(但是还有很多人在用)。
2、read(byte[] b, int off, int len)这个方法要好好体会了,往往和你想象的不一样。
3、将读取的一个字节强制转换为char是不合适的,除非你想看看能输出什么。
XCP_Basic 移植步骤 阅读详情

相关推荐

西门子S7-1200模拟量的使用

模块类型核心参数输入信号处理输出信号配置转换原理数值范围TIA Portal配置编程要点 转换公式: 输出模拟量: 五、校准与线性化 硬件校准非线性补偿抗干扰措施数字滤波温度控制压力监控流量调节信号异常精度不足实践操作参考文档项目案例借鉴博客

weixin_51020122的博客 4774

InputStream类中的三种read方法-学习中有发现了一个重要知识惊喜

转载:https://baijiahao.baidu.com/s?id=1607485209716859447&wfr=spider&for=pc InputStream类以及子类中的Read方法 Read方法 Read() public abstract int read() throws IOException 从(来源)输入流中(读取的内容)读取数据的下一个字节到(...

JavaNotes的博客 2612

【影像组学入门百问】1#---#3

理论上讲三大主流平台Windows, Linux和MacOS均可进行影像组学研究。根据笔者实际经验,如果内存不足可能导致软件罢工,其余显示、GPU等均非必要。显示:最小分辨率为1024×768(推荐为1280×1024或更好)。Slicer中的许多计算都是多线程的,并且将受益于多核,多CPU配置。计算机需要足够的内存和图形功能将原始数据和处理结果保存在其内存中。如涉及深度学习等方法的研究需根据实际需求配置电脑,无法一概而论。接口设备:推荐使用带滚轮的三键鼠标。内存:超过4GB(推荐8G以上)。

weixin_38594676的博客 1485

【Bootstrap】bootstrap快速入门

下载: 安装后:有3个文件夹: css,字体,js jQuery需要自己下载 ******** 新建一个文件: 成功。 第一个bootstrap文件: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF...

南北极之间 977

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

SAP ABAP干货:用REUSE_ALV_GRID_DISPLAY_LVC实现ALV多屏幕独立布局(含handle参数详解)

本文详细解析了SAP ABAP中如何使用REUSE_ALV_GRID_DISPLAY_LVC函数实现ALV多屏幕独立布局,重点介绍了handle参数的技术原理和实际应用。通过变式标识符和LTDX表存储机制,开发者可以确保不同ALV报表屏幕的布局设置互不干扰,提升复杂报表场景下的用户体验。

weixin_29268267的博客 311

写出登鹳雀楼html代码,古诗《登鹳雀楼》练习题

古诗《登鹳雀楼》练习题引言:《登鹳雀楼》是盛唐诗人王之涣的一首五言绝句。要考试的同学很头痛吧?下面是小编整理的`《登鹳雀楼》的考试检测题,大家快复习起来吧!登鹳雀楼作者:王之涣 【唐代】白日依山尽,黄河入海流。欲穷千里目,更上一层楼。一、 比一比,再组词。人( ) 尽( ) 衣( ) 欢( )入( ) 近( ) 依( ) 欲( )二、在括号里填上合适的词。一( )楼 一( )河 一( )红日 一(...

weixin_30368981的博客 1249

华为的LTC(Lead to Cash,从线索到现金)流程是其销售管理体系的核心,覆盖了从发现销售线索到最终收回现金的全过程,强调端到端的业务贯通和以客户为中心的运营理念

华为LTC流程是覆盖销售全周期的管理体系,包含四大阶段:线索转机会(LTO)、机会转订单(OTO)、订单转交付(OTD)、交付转现金(DTC)。其核心采用"铁三角"团队模式(AR/SR/FR协作),通过多部门联合评审把控关键节点,实现端到端业务贯通。该流程与IPD、MTL、ITR等体系高效协同,结合iSales平台实现数字化管理,有效提升销售效率、客户满意度和资金回笼速度。

金牌架构师 1726

java byte char io流_Java基础进阶 IO流之字节流

1、IO流1.1、概述之前学习的File类它只能操作文件或文件夹,并不能去操作文件中的数据。真正保存数据的是文件,数据是在文件中。而File类它只是去对文件本身做操作,不能对文件中的数据进行操作。如果要操作文件中的数据,这时必须使用Java中提供的IO流技术完成。IO可以实现数据的传输,把数据比作是像水一样在流动。IO:input/outputIO流:它的功能就是专门操作文件中的数据。2.2、IO...

weixin_29535345的博客 340

使用Verilog实现QR分解——嵌入式 [设计与代码]

通过Verilog的硬件描述语言,我们可以将QR分解算法实现为硬件电路,并在嵌入式系统中高效地运行。本文将介绍如何使用Verilog设计并实现QR分解算法,该算法用于将一个矩阵分解为正交矩阵Q和上三角矩阵R。具体而言,QR分解通过对矩阵的列进行正交化处理,得到正交矩阵Q,并将对应的正交化结果存储在上三角矩阵R中。该算法通过将矩阵分解为两个部分,正交矩阵Q和上三角矩阵R,实现了对矩阵的分解和变换。模块,该模块接收待分解矩阵A,并输出正交矩阵Q和上三角矩阵R。下面给出了使用Verilog实现QR分解的源代码。

CodeMaven的博客 621

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 795

Java学习笔记之 IO包 字节流

IO包最重要的五个类和一个接口 File/OutputStream/InputStream(字节流)/Writer/Reader(字符流) 一个接口:Serializable   File类: 字节流: OutputStream与InputStream是抽象类 OutputStream是整个IO包中,字节输出流的最大类 FileOutputStream是一个子类,通

数据挖掘工人 1205

全球APN信息汇总

全球APN信息,电信APN,移动APN,联通APN,台湾APN,马来西亚APN,俄罗斯APN,日本APN,泰国APN,美国APN,英国APN,法国APN,德国APN,意大利APN,葡萄牙APN,土耳其APN,荷兰APN,丹麦APN,比利时APN,爱尔兰APN,新加坡APN,越南APN,老挝APN,菲律宾APN,印尼APN,泰国APN,柬埔寨APN,巴基斯坦APN,印度APN,奥地利APN,保加利亚APN,捷克APN,立陶宛APN,罗马尼亚APN,挪威APN,希腊APN,匈牙利APN,瑞士APN,乌克兰APN

renkai721的专栏 2796

[学习笔记]Java IO之字节流

IO流 1. 概述 Java中使用流技术来实现设备间数据的传输,其操作对象是数据,采用的方式是流(类似水流)。 2. 特点 按流的方向可分为输入流和输出流。按流的内容可分为字节流和字符流。按流的目标可分为键盘/屏幕,内存,文件和网络。字节流的基类为InputStream/OutputStream,字符流的基类为Reader/Writer,且子类均以基类为后缀

Jacob专栏 1029

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Java学习笔记】IO流之字节流

1.IO流的概述 IO流用来处理设备之间的数据传输,例如:上传文件和下载文件 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 2.IO流分类 2.1 按照数据流向 输入流:读取数据 输出流:写入数据 2.2 按照数据类型 字节流 字符流 什么情况下选择字节流?又在哪种情况下选择字符流呢? 如果数据所在的文件通过windows自带的记事本打开并能读懂里面的...

我们仨 243

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java学习笔记——IO(字节流)

IO概述

JUN__TAO的博客 250

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java学习笔记28(IO字节流)

IO定义:   写:Output操作:将内存上的数据持久化 到设备上,这个动作称为输出;   读:Input操作:把硬盘上的东西读取到内存,这个动作称为输入; 这两种操作称为IO流 IO流可以分为两类:字节流 字符流 字节流   输入和输出:参照物,都是java程序来参照    字节时输入流类:InputStream 字节输出流类:OutputStre...

weixin_30478923的博客 79

java学习笔记 IO学习笔记2 IO流-字节流

IO流从功能上可以分为:输入流和输出流。 从结构上可以分为:1)字节流:使用接口InputStream和OutputStream                                     2)字符流:使用接口Reader和Writer 。 字符流,底层也是字节流来是实现。 读数据流的逻辑:open a stream ->while more information ->

Little__ZM 我愿意付出所有来换一个时光机 1172

[Java学习笔记]IO流——字节流和字符流

字节流 抽象超类: InputStream是所有字节输入流的父类,其定义了基础的读取方法,常用的方法如下: — int read() 读取一个字节,以int形式返回(取一个byte也即“低8位”), 若返回值为-1,则表示EOF(End Of File) — int read(byte[] d) 尝试读取给指定数组的length个字节并存入该数组, 返回值为实际读取到的字节量 Output...

DoneBug的博客 241

Java IO学习笔记:字节流

Java IO学习笔记:字节流<br />字节流是最基本的流,文件的操作、网络数据的传输等等都依赖于字节流。而字符流常常用于读取文本类型的数据或字符串流的操作等等。 关于字节流的API,没什么好说的,看看就知道了。这里挑几个关键点: 一、InputStream的API 1、public int read()从输入流读取下一个数据字节。返回 0 到 255 范围内的 int 字节值。如果因已到达流末尾而没有可用的字节,则返回值 -1。 2、public int read(byte[] b)从输入流中读取一定数

Mr. David 专栏 739

Java学习笔记(二十):IO流之字节流

Java学习笔记(二十):IO流 ​ IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式。Java中用于操作流的对象都在IO包中。 ​ IO流按照流向,分为输入流和输出流。按照数据类型分为: 字节流:可以读写任何类型的文件。比如音频、视频 、文本文件; 字符流:只能读写文本文件。 如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。 输出流超类OutputStream 子类FileOutputStream 一、构造方法 FileOu

想教猫咪学Java 185

Java学习笔记②⑨(IO流、字节流、FileStream类、字节流练习)

一、IO流 1. 概述 生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了。当你电脑 上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬 盘、外接设备等等。 我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入input 和 输出 output ,即流向内存是输入流,流出内存的输出流。 Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做

weixin_45994391的博客 346

Java IO流学习笔记:从字节流到字符流

这是一篇系统的Java IO流学习笔记,详细解析了FileInputStream、FileOutputStream、FileReader和FileWriter的核心用法。

qq_17862337的博客 1137

Java基础-IO流详细学习笔记(字节流)

Java基础-IO流详细学习笔记(字节流) 继续学习IO流的字节流部分,有关上部分的内容请点击Java基础-IO流详细学习笔记(字符流),本部分与上部分为对称关系,字符流部分掌握,这部分就掌握了 字节输入输出流的主要类为 OutputStream与InputStream,这两个都是抽象类,需要被继承,我们一般用他们的实现类FileInputStream与FileOutputStream 创建流对象...

JunsIr的技术栈 744
上一篇: Java IO学习笔记:概念与原理
下一篇: java io 学习笔记 (字符流)
Busing
博客等级 码龄18年 8粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值