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

IO流中的字节流

字节流(InputStream、OutputStream)
- 字节流是以字节码的形式读取或写出文件数据
- 字节流是所有流基础
- 字节流是以字节码为操作单位所以更适用于操作二进制文件(如:图片文件、音频、视频、压缩包等非文本文件)
- Java中进行字节流操作的两个基础类(InputStream<字节流>、OutputStream<字节输出流>)
- 在实际使用时我们一般使用两个子类实现字节流操作
(1) FileInputStream:基于文件的字节输入流
(2) FileOutputStream:基于文件的字节输出流
(3) BufferedInputStream:带有缓冲区的字节输入流
(4) BufferedOutputStream:带有缓冲区的字节输出流

1)文件读取(压缩包不可读取,它是二进制的,无法转为char类型,会输出乱码) 

若在创建字节输入流对象FileInputStream后面创建inputStreamReader对象并指定所使用编码,inputStreamReader对象就会按照指定的编码方式将读取到的字节转换对应的字符(如果不指定编码,则默认按照UTF-8编码将读取到的字节转换字符)

InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"GBK");
import java.io.FileInputStream;
import java.io.IOException;public class InputStreamDemo {public static void main(String[] args) throws IOException {//创建字节输入流对象FileInputStream inputStream = new FileInputStream("D:\\IO流常用方法.txt");//定义缓冲区byte[] buf = new byte[1024];//读取的实际长度int len = -1;while ((len = inputStream.read(buf)) != -1) {//将字节码转换为字符串String str = new String(buf, 0, len); //buf:读取的字节码 0:起始位置 len:终止位置System.out.println(str);}//关闭输入流对象,释放所占用的资源inputStream.close();}
}

2)文件写入

同样,在创建字节输出流对象FileOutputStream后创建outputStreamWriter对象并指定所使用编码,outputStreamWriter对象就会按照指定的编码方式将写入到的字节转换对应的字符

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"GBK");
import java.io.FileOutputStream;
import java.io.IOException;public class OutputStreamDemo  {public static void main(String[] args) throws IOException {/*** 创建字节输出流对象* 如果输出的目标文件存在则向文件中直接写入内容,如果目标文件不存在则新建文件* 字节输出流默认以替换的方式写出数据* 如果需要使用追加的方式向文件中写入内容,则需要再构造方法中加入true参数*/FileOutputStream outputStream = new FileOutputStream("D:/redme.txt", true);String str = "\r\n你好,吃了吗?";// \r\n表示换行//String str = "不饿"; //可继续输入其他内容outputStream.write(str.getBytes());outputStream.close();}
}

3)文件复制方法

  1.不使用带有缓冲区的字节输入流输出流

import java.io.*;public class FileCopy {public static void main(String[] args) throws IOException {File srcFile = new File("D:\\钉钉\\3.字节流.rar");File descFile = new File("D:\\QQ\\3.字节流.rar");fileCopy(srcFile,descFile);}public static void fileCopy(File srcFile,File descFile) throws IOException {//创建字节输入和输出流InputStream inputStream = new FileInputStream(srcFile);OutputStream outputStream = new FileOutputStream(descFile);//创建一个字节数组做为读取数据的缓冲区byte[] buf = new byte[1024 * 10];//文件较大时可以 *10int len = -1;//获得当前时间的毫秒数long start = System.currentTimeMillis();//循环读取数据while ((len = inputStream.read(buf,0,buf.length)) != -1){//循环写入到文件中outputStream.write(buf,0,len);//刷新输出流,清空输出流管道中的数据outputStream.flush();}//获得当前时间的毫秒数long end = System.currentTimeMillis();System.out.println("复制完毕,耗时:"+(end-start)+"毫秒");//关闭输入和输出流inputStream.close();outputStream.close();}
}

  2.使用带有缓冲区的字节输入流输出流 (效率提高)

import java.io.*;public class FileCopyForBuffer {public static void main(String[] args) throws IOException {File srcFile = new File("C:\\字节流.rar");File descFile = new File("D:\\字节流.rar");fileCopy(srcFile,descFile);}/*文件复制方法参数1:复制的源文件参数2:复制的目录文件*/public static void fileCopy(File srcFile,File descFile) throws IOException {//创建字节输入和输出流InputStream inputStream = new FileInputStream(srcFile);/*** 带有缓冲区的字节流* 该类为一个包装类* BufferedInputStream:带有缓冲区的字节输入流* BufferedOutputStream:带有缓冲区的字节输出流*/BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);//包装类OutputStream outputStream = new FileOutputStream(descFile);BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);//包装类//创建一个字节数组做为读取数据的缓冲区byte[] buf = new byte[1024];int len = -1;//获得当前时间的毫秒数long start = System.currentTimeMillis();//循环读取数据while ((len = bufferedInputStream.read(buf,0,buf.length)) != -1){//循环写入到文件中bufferedOutputStream.write(buf, 0, len);//刷新输出流,清空输出流管道中的数据bufferedOutputStream.flush();}//获得当前时间的毫秒数long end = System.currentTimeMillis();System.out.println("复制完毕,耗时:"+(end-start)+"毫秒");//关闭输入和输出流bufferedInputStream.close();bufferedOutputStream.close();}
}

4)从输入流中每次读取一行数据

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class BufferedReaderDemo {public static void main(String[] args) throws IOException {//创建带有缓冲区的字符输入流BufferedReader reader = new BufferedReader(new FileReader("D:\\IO流常用方法.txt"));String str = null;//从输入流中读取一行数据while ((str = reader.readLine()) != null){System.out.println(str);}}
}

5)BufferedWriter

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;/*** BufferedWriter:带有缓冲区的字符输出流* 支持换行和字符串写入,无需手动拼接换行符。*/
public class BufferedWriterDemo {public static void main(String[] args) throws IOException {BufferedWriter writer = new BufferedWriter(new FileWriter("D:/redme.txt"));writer.write("暗恋小美");writer.close();}
}

6)更加便捷的输入输出流操作

  1.输入流

import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;/*** 字符流不能设置编码,它只能使用默认编码(UTF-8)* 字符流时一般使用为UTF-8编码*/
public class FileReaderDemo {public static void main(String[] args) throws IOException {//创建字符输入流FileReader reader = new FileReader("D:\\IO流常用方法.txt", Charset.forName("GBK"));char[] buf = new char[1024];int len=-1;while ((len = reader.read(buf)) !=-1){String str = String.valueOf(buf, 0, len);System.out.println(str);}reader.close();}
}

  2.输出流

import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;public class FileWriterDemo {public static void main(String[] args) throws IOException {FileWriter writer = new FileWriter("D:/redme.txt", Charset.forName("GBK"));writer.write("小美你好");writer.close();}
}
http://www.dtcms.com/a/311877.html

相关文章:

  • Java中的sort()排序详解
  • STM32CubeIDE新建项目过程记录备忘(五)中断方式的USART串口通信
  • 浏览器的全局焦点事件
  • 内循环全部满足条件后,为true
  • 大型地面光伏电站开发建设流程
  • IO流-字节流
  • c++--模板--实例化
  • ARM处理器概述及对比
  • 2025熵密杯 -- 初始谜题 -- Reproducibility
  • 基于落霞归雁思维框架的应用与实践研究
  • 计数组合学7.11(RSK算法)
  • Android动画实现控件形状、大小逐渐过渡
  • 智能制造——解读CMMM评估手册【附全文阅读】
  • DyWA:用于可推广的非抓握操作的动态自适应世界动作模型
  • 硅基计划3.0 学习总结 伍 优先级队列排序初识
  • 【Vue3】Class绑定:从基础到高级的完整指南
  • Web前端实现银河粒子流动特效的3种技术方案对比与实践
  • 【完结篇】华为OpenStack架构学习9篇 连载—— 09 OpenStack编排管理【附全文阅读】
  • 深入 Go 底层原理(三):Goroutine 的调度策略
  • OSPF综合
  • VS Code高效开发指南:快捷键与配置优化详解
  • 深入 Go 底层原理(十二):map 的实现与哈希冲突
  • Mybatis学习之获取参数值(四)
  • 字符串(java不死)
  • c++之基础B(进制转换)(第三课)
  • 详解Python标准库之并发执行
  • AI Agent开发学习系列 - LangGraph(3): 有多个输入的Graph
  • C#多数据库批量执行脚本工具
  • OneCode3.0 核心表达式技术深度剖析:从架构设计到动态扩展
  • 波士顿咨询校招面试轮次及应对策略解析