Java中IO流 字节流实例详解
发布时间 - 2026-01-11 01:07:04 点击率:次Java中IO流 字节流实例详解

IO流(输入流、输出流),又分为字节流、字符流。
流是磁盘或其它外围设备中存储的数据的源点或终点。
输入流:程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道。
输出流:程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。
字节流
1.InputStream、OutputStream
InputStream抽象了应用程序读取数据的方式
OutputStream抽象了应用程序写出数据的方式
2.读到文件结尾,称为EOF = end,读到-1就读到结尾
3.输入流基本方法
int b = in.read();读取一个字节,无符号填充到int的低八位.-1是EOF
int.read(byte[] buf)读取数据填充到字节数组buf
int.read(byte[] buf, int start, int size)读取数据填充到字节数组buf,从buf的start位置开始存储size长度的数据
4.输出流基本方法
out.write(int b);写出一个byte到流,b的低八位
out.write(byte[] buf);将buf字节数组都写入到流
out.write(byte[] buf, int start, int size);字节数组buf从start位置开始写size长度的字节到流
5.FileInputStream是InputStream的子类,具体实现了在文件上读取数据
6.FileOutputStream是OutputStream的子类,实现了向文件中写出字节数据的方法
FileInputStream的demo:
package com.test.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOUtils {
/**
* 读取指定文件内容,按照十六进制输出到控制台
* 并且每输出10个byte换行
* @param fileName
* @throws IOException
*/
public static void printHex(String fileName) throws IOException {
//把文件作为字节流进行读操作
FileInputStream in = new FileInputStream(fileName);
int b;
int i = 1;
while ((b = in.read()) != -1) {
if (b <= 0xf) {
System.out.print("0");
}
System.out.print(Integer.toHexString(b) + " ");
if (i % 10 == 0) {
System.out.println("");
}
i++;
}
in.close();
}
public static void printHexByByteArray(String fileName) throws IOException {
FileInputStream in = new FileInputStream(fileName);
byte[] buf = new byte[20*1024];
//如果字节数组够大,可以一次性读完
//从in中批量读取字节,放入到buf这个字节数组中,从第0个位置开始放,最多放buf.length个,返回的是读到的字节的个数
/* int bytes = in.read(buf, 0, buf.length);
int j = 1;
for(int i = 0;i < bytes; i++) {
if (buf[i] <= 0xf) {
System.out.print("0");
}
System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
if (j % 10 == 0) {
System.out.println("");
}
j++;
} */
//如果字节数组不够大,不能一次性读完
int bytes = 0;
int j = 1;
while ((bytes = in.read(buf, 0, buf.length)) != -1) {
for (int i = 0; i <bytes; i++) {
if (buf[i] <= 0xf) {
System.out.print("0");
}
System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
if (j % 10 == 0) {
System.out.println("");
}
j++;
}
}
}
}
FileOutputStream的demo:
package com.test.io;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputDemo {
public static void main(String[] args) throws IOException {
//如果该文件不存在,则直接创建,如果存在,删除后创建。(如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。)
FileOutputStream out = new FileOutputStream("F:\\javaio\\out.dat");
out.write('A');//写入了‘A'的低八位(一次只写入一个字节)
int a = 10;
out.write(a >>> 24);
out.write(a >>> 16);
out.write(a >>> 8);
out.write(a);
byte[] b = "10".getBytes();
out.write(b);
out.close();
IOUtils.printHex("F:\\javaio\\out.dat");
}
}
7.DataOutputStream和DataInputStream,对流功能的扩展,可以更加方便的读取int,long,字符等类型数据。
package com.test.io;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataOutputDemo {
public static void main(String[] args) throws IOException {
String file = "F:\\javaio\\b.txt";
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
dos.writeInt(10);
dos.writeInt(-10);
dos.writeLong(10l);
dos.writeDouble(10.5);
dos.writeUTF("你好");
dos.writeChars("中国");
dos.close();
IOUtils.printHex(file);
}
}
运行结果:
00 00 00 0a ff ff ff f6 00 00 00 00 00 00 00 0a 40 25 00 00 00 00 00 00 00 06 e4 bd a0 e5 a5 bd 4e 2d 56 fd
其中,00 06两个字节是“你好”这两个中文的字节个数。
package com.test.io;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class DataInputDemo {
public static void main(String[] args) throws IOException {
String file = "F:\\javaio\\b.txt";
DataInputStream dis = new DataInputStream(new FileInputStream(file));
int i = dis.readInt();
System.out.println(i);
i = dis.readInt();
System.out.println(i);
long l = dis.readLong();
System.out.println(l);
double d = dis.readDouble();
System.out.println(d);
String s = dis.readUTF();
System.out.println(s);
dis.close();
}
}
运行结果:
10 -10 10 10.5 你好
8.BufferedInputStream&BufferedOutputStream,这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种流模式提高了IO的性能。
文件的拷贝:
package com.test.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOUtils {/**
* 拷贝文件,字节批量读取
* @param srcFile 源文件
* @param destFile 目标文件
* @throws IOException
*/
public static void copyFile(File srcFile, File destFile) throws IOException {
if (!srcFile.exists()) {
throw new IllegalArgumentException("文件" + srcFile + "不存在");
}
if (!srcFile.isFile()) {
throw new IllegalArgumentException(srcFile + "不是文件");
}
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(destFile);
byte[] buf = new byte[10*1024];
int b;
while ((b = in.read(buf, 0, buf.length)) != -1) {
out.write(buf,0,b);
out.flush();//最好加上,刷新此输出流并强制写出所有缓冲的输出字节。
}
in.close();
out.close();
}
/**
* 拷贝文件,利用带缓冲的字节流
* @param srcFile
* @param destFile
* @throws IOException
*/
public static void copyFileByBuffer(File srcFile, File destFile) throws IOException {
if (!srcFile.exists()) {
throw new IllegalArgumentException("文件" + srcFile + "不存在");
}
if (!srcFile.isFile()) {
throw new IllegalArgumentException(srcFile + "不是文件");
}
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(destFile);
BufferedInputStream bis = new BufferedInputStream(in);
BufferedOutputStream bos = new BufferedOutputStream(out);
int c;
while ((c = bis.read()) != -1) {
bos.write(c);
bos.flush();
}
bis.close();
bos.close();
}
/**
* 拷贝文件,通过单字节读取
* @param srcFile
* @param destFile
* @throws IOException
*/
public static void copyFileByByte(File srcFile, File destFile) throws IOException {
if (!srcFile.exists()) {
throw new IllegalArgumentException("文件" + srcFile + "不存在");
}
if (!srcFile.isFile()) {
throw new IllegalArgumentException(srcFile + "不是文件");
}
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(destFile);
int c;
while ((c = in.read()) != -1) {
out.write(c);
out.flush();
}
in.close();
out.close();
}
}
测试文件拷贝:
package com.test.io;
import java.io.File;
import java.io.IOException;
public class IOUtilsTest {
public static void main(String[] args) {
//IOUtils.printHex("D:\\javaProgram\\Hello.java");
try {
long start = System.currentTimeMillis();
//IOUtils.copyFile(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\2.mp3"));//211ms
//IOUtils.copyFileByBuffer(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\3.mp3"));//18583ms
IOUtils.copyFileByByte(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\4.mp3"));//37822ms
long end = System.currentTimeMillis();
System.out.println(end - start);
} catch (IOException e) {
e.printStackTrace();
}
}
}
根据以上测试看出,文件拷贝,最快的方式是通过字节的批量读取。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java—IO流
# 字节流
# java
# IO
# Java编程中字节流与字符流IO操作示例
# java IO 字节流详解及实例代码
# Java文件(io)编程_文件字节流的使用方法
# 【Java IO流】字节流和字符流的实例讲解
# 详解Java中IO字节流基本操作(复制文件)并测试性能
# Java字节流和字符流总结IO流!
# Java 超详细讲解IO操作字节流与字符流
# Java I/O (Input/Output)文件字节流举例详解
# 不存在
# 读到
# 子类
# 这两个
# 你好
# 流进
# 应用程序
# 够大
# 的是
# 源点
# 实现了
# 最多
# 希望能
# 第二个
# 即是
# 谢谢大家
# 或其它
# 该文件
# 中国
# 则将
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
如何在阿里云部署织梦网站?
如何在新浪SAE免费搭建个人博客?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
php 三元运算符实例详细介绍
如何构建满足综合性能需求的优质建站方案?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何在IIS中新建站点并解决端口绑定冲突?
Laravel集合Collection怎么用_Laravel集合常用函数详解
如何快速搭建二级域名独立网站?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
公司门户网站制作流程,华为官网怎么做?
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
网站制作企业,网站的banner和导航栏是指什么?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
如何在香港服务器上快速搭建免备案网站?
EditPlus中的正则表达式 实战(1)
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
如何在阿里云ECS服务器部署织梦CMS网站?
如何选择可靠的免备案建站服务器?
Laravel如何使用Blade模板引擎?(完整语法和示例)
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Bootstrap整体框架之CSS12栅格系统
如何在Windows虚拟主机上快速搭建网站?
详解CentOS6.5 安装 MySQL5.1.71的方法
如何在云主机快速搭建网站站点?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Python结构化数据采集_字段抽取解析【教程】
网站建设要注意的标准 促进网站用户好感度!
如何用PHP工具快速搭建高效网站?
如何在云指建站中生成FTP站点?
如何在阿里云域名上完成建站全流程?
UC浏览器如何设置启动页 UC浏览器启动页设置方法
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
潮流网站制作头像软件下载,适合母子的网名有哪些?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
如何获取PHP WAP自助建站系统源码?

