当前位置: 首页 > news >正文

java io byte_JavaIO之字节流学习笔记

一、文件输入/输出流

文件输入流FileInputStream具体实现了在文件上读取数据,文件输出流FileOutputStream实现了向文件中写出byte数据。

1.1 FileInputStream

in.read() 按单字节读取数据

in.read(byte[] buf,int start,int size) 从字节数组buf中start处开始读取数据,长度为size

1、单字节读取数据,并将结果输出到控制台上,每10个byte进行换行

实现步骤:

(1)将文件作为字节流进行读操作

(2)使用单字节进行循环读取,每10个字节进行换行操作

public static void printHex(String fileName) throws IOException{

FileInputStream in = new FileInputStream(fileName);

int b; //用于判断文件是否读到结尾处

int i = 1;//用于计数,每10个字节换行

while((b=in.read()) != -1){

if(b<0xf){ //单字节前面补0

System.out.print("0");

}

System.out.print(Integer.toHexString(b)+" ");

if(i++%10 == 0){

System.out.println();

}

}

in.close();

}

2、对上例进行批量读取,此方法适合大文件,效率高

public static void printHexByByte(String fileName)throws IOException{

FileInputStream in = new FileInputStream(fileName);

byte[] buf = new byte[20*1024];

//由于可能数组不够,也可能数组过大,下面的语句返回的是读到的字节个数,不会多读余下的空也不会超出

int bytes = in.read(buf,0,buf.length);//一次性读完

int j = 1;

for(int i=0;i

if(buf[i]<=0xf){

System.out.print("0");

}

System.out.print(Integer.toHexString(buf[i])+" ");

if(j++%10 == 0){

System.out.println();

}

}

in.close();

}

1.2 FileOutputStream

out.write(int b) 写出数据

out.write(byte[] buf,int start,int size) 从start处开始写出buf中的字节,长度为size

写出数据的示例代码如下所示:

public static void main(String[] args)throws IOException {

//如果文件不存在则直接创建,否则删除后创建

FileOutputStream out = new FileOutputStream("demo/out.dat");

//如果文件不存在则直接创建,否则在原文件后追加内容

//FileOutputStream out1 = new FileOutputStream("demo/out.dat",true);

int a = 10;

out.write(a>>>24);

out.write(a>>>16);

out.write(a>>>8);

out.write(a);

byte[] s = "中国".getBytes();

out.write(s);

out.close();

}

1.3 代码:文件复制功能的实现

实现步骤:

1、先对参数进行判断,源文件是否存在且是否是文件;

2、构造文件输入输出流

3、使用批量读取的形式对源文件进行读取,然后写入到目标文件中

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[8*1024];

int b;

while((b = in.read(buf,0,buf.length))!=-1){

out.write(buf, 0, b);

}

in.close();

out.close();

}

二、数据输入/输出流

数据输入/输出流(DataInputStream/DataOutputStream)是对“流”功能的扩展,可以更加方便的进行基础数据类型的读写操作。其主要方法及使用如下代码所示。

String file = "demo/dos.dat";

DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));

dos.writeInt(-27);

dos.writeDouble(89.06);

dos.writeLong(2000l);

dos.writeUTF("中国");//以UTF-8编码格式写进文件

dos.writeChars("中国");//以utf-16be格式写进文件

dos.close();

DataInputStream dis = new DataInputStream(new FileInputStream(file));

int i = dis.readInt();

System.out.println(i);

double d = dis.readDouble();

System.out.println(d);

long l = dis.readLong();

System.out.println(l);

System.out.println(dis.readUTF());

System.out.println(dis.read());

dis.close();

三、字节缓冲流

字节缓冲流(BufferedInputStream/BufferedOutputStream)为IO提供了带缓冲区的操作,提高了IO性能。下面使用字节缓冲流进行文件拷贝操作,代码如下。此方法的效率没有批量读取的高,但比单字节读取更快。

public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{

if(!srcFile.exists()){

throw new IllegalArgumentException("文件"+srcFile+"不存在!");

}

if(!srcFile.isFile()){

throw new IllegalArgumentException(srcFile+"不是文件!");

}

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

int c;

while((c=bis.read())!=-1){

bos.write(c);

bos.flush();//刷新缓冲区

}

bis.close();

bos.close();

}

注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!

相关文章:

  • 八大排序方法java_八大排序java
  • java一个类怎么调用另一个类的变量_如何在一个类里调用到另一个类的变量的值...
  • java return后执行_java 问题 如果前一个return执行了 那么后面的一系列System.out.println 还会执行吗...
  • java持久层_java访问持久层技术的进化
  • java set encoding file_系统变量file.encoding对Java的运行影响有多大?(转)good
  • java运行一段时间变慢_tomcat 运行程序很慢 运行一段时间就报错: java.lang.OutOfMemoryError: PermGen space...
  • java的开发人员数量_Java开发人员最容易出现的几类错误
  • 字符串加减转数字java_剑指Offer解题报告(Java版)——字符串转换为数字 49
  • Java txt 下拉刷新_「小程序JAVA实战」小程序页面的上拉下拉刷新(50)
  • Java语言西安交大高起专_2018年西安交大网络学院高起专/本英语入学考试复习题...
  • php 生成不了zip文件怎么打开吗,PHP生成压缩包,不带根目录 | 学步园
  • php变量持有对象的引用,我对PHP变量引用、对象引用的理解
  • php 自动填写表单,PHP自动生成表单代码分享
  • 记事本底部的java切换,如何使用java操作记事本(转)
  • php类调用类外变量吗,如何调用类外的变量
  • 《深入 React 技术栈》
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CSS3 变换
  •  D - 粉碎叛乱F - 其他起义
  • echarts花样作死的坑
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • mysql常用命令汇总
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • SQLServer之创建显式事务
  • 关于Flux,Vuex,Redux的思考
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 面试总结JavaScript篇
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 学习笔记:对象,原型和继承(1)
  • 运行时添加log4j2的appender
  • Java总结 - String - 这篇请使劲喷我
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #HarmonyOS:基础语法
  • (1)(1.13) SiK无线电高级配置(六)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (八)Flask之app.route装饰器函数的参数
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转) ns2/nam与nam实现相关的文件
  • (转)VC++中ondraw在什么时候调用的
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET和.COM和.CN域名区别
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET中使用Protobuffer 实现序列化和反序列化
  • ??myeclipse+tomcat
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [ACM] hdu 1201 18岁生日
  • [android] 练习PopupWindow实现对话框
  • [BZOJ] 2044: 三维导弹拦截
  • [C#]扩展方法
  • [Django ]Django 的数据库操作