IO ——字节流
什么是流?
概念:内存与存储设备之间传输数据的通道。程序运行后保存在内存,文件一般在硬盘中,在程序中读写文件,需要在内存和存储设备中建立通道。数据借助流传输
流的分类:
按流向:
- 输入流:将存储设备中的内容读入到内存中
- 输出流:将内存中的内容写入到存储设备中
按单位:
- 字节流:以字节为单位,可以读写所有数据。因为所有数据都是以字节的方式来存储的
- 字符流:以字符为单位,只能读写文本数据。
按功能:
- 节点流:具有实际传输数据的读写功能
- 过滤流:在节点流的基础之上增强功能
字节流:
- 字节输入流: InputStream类
方法:
int availble() //返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字数
void close() //关闭此输入流并释放与该流关联的所有系统资源
void mark(int readlimit) //在此输入流中标记当前位置
abstract int read() //从输入流中读取数据的下一个字节
int read(byte[] b) //从输入流中读取一定数量的字节,并将其存储在缓存区数组b中
int read(byte[] b, int off, int len) //在指定位置将输入流中最多len个数据字节读入b数组
void reset() //将此流重新定位到最后一次对此输入流调用mark方法时的位置
long skip(long n) //跳过和丢弃此输入流中数据的n个字节
- 字节输出流:OutputStream类
方法:
void close() //关闭此输出流并释放与该流关联的所有系统资源
void flush() // 刷新此输出流并强制写出所有缓冲的输出字节
void write(byte[] b) //将b.length个字节从指定的byte数组写入此输出流
void write(byte[] b, int off, int len) //将指定byte数组中从偏移量off开始的len个字节写入此输出流
abstract void wite(int b) //将指定的字节写入此输出流
InputStream类和OutputStream类都是抽象类,不能实例化,应该用其子类,可用FileInputStream和FileOutputStream。
FileInputStream:
构造方法:FileInputStream(File file)
FileInputStream(String name) //name指文件路径
FileInputStream(FileDescriptor fdObj)
方法:
protected void finalize() //确保文件不再引用文件输入流时调用close方法
FileOutputStream:
构造方法:FileOutputStream(String name) //每次写入都会覆盖原有的数据
FileOutputStream(String name, boolean append) //不覆盖原有数据
FileOutputStream(File file)
FileOutputStream(File file, boolean append)
FileOutputStream(FileDescriptor fdObj)
FileOutputStream(FileDescriptor fdObj, boolean isFdOwner)
package com.java.leetcode.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; /* 演示FileInputStream(文件字节输入流) 演示FileOutputStream(文件字节输出流) */ public class Stream01 { public static void main(String[] args) throws IOException { //1.创建FileInputStream,文件可能没有,需要抛出异常 FileInputStream fis = new FileInputStream("D:\\stream01.txt"); //读取数据 单个字节fis.read() 效率低下 // int data; // while ((data = fis.read()) != -1){ //fis.read()返回下一个字节,如果读到结尾返回-1 // System.out.print((char)data); // } byte[] buffer = new byte[3]; //比较拉垮,不采用,直接用循环读 // int count = fis.read(buffer); //该方法返回实际返回的个数 // System.out.println(new String(buffer)+"读取的字节数"+count); //hel只读了3个 // int count1 = fis.read(buffer); //接着读 // System.out.println(new String(buffer)+"读取的字节数"+count1); //lo 读取了三个 // int count2 = fis.read(buffer); //接着读 // System.out.println(new String(buffer)+"读取的字节数"+count2);//io读取了2个 int count = 0; while ((count = fis.read(buffer)) != -1){ System.out.println(new String(buffer)+"读取的字节数"+count); } //2.创建FileOutputStream //FileOutputStream fos = new FileOutputStream("D:\\stream01.txt");//该构造方法为每次写入的数据都覆盖原来的 FileOutputStream fos = new FileOutputStream("D:\\stream01.txt",true); //为不覆盖 fos.write(97); fos.write('a'); fos.write('c'); System.out.println("执行完毕"); String str = "helloword"; fos.write(str.getBytes()); } }
运行结果:
文件内容:
注意:代码的顺序是先读取再写入进去。
字节流复制文件:
package com.java.leetcode.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /* 使用文件字节流实现文件的复制 */ public class Stream02 { public static void main(String[] args) throws IOException { //文件字节输入流 FileInputStream fis = new FileInputStream("E:\\face01.jpg"); //抛出异常,文件可能不存在 //文件字节输出流 FileOutputStream fos = new FileOutputStream("E:\\face001.jpg"); //未复制前并不存在该文件。将face01复制,复制后的图片放在E盘下,明明为face001。jpg //一边读,一边写 byte[] buffer = new byte[1024]; //每次读1k int count = 0; while ((count = fis.read(buffer))!=-1) { fos.write(buffer); } //关闭 fis.close(); fos.close(); System.out.println("复制完毕!"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端