JavaIO流
- 文件概念:保存数据的地方
- 创建文件的三种方法(文件路径可写为: “d:\\”或者 “d:/”):
- 常用的文件方法:
- 获取文件信息:
2.目录操作:mkdir创建一级目录,mkdirs创建多级目录,delete删除空目录或文件
- IO原理及分类
- IO:Input,Output,用于处理数据传输,如读写文件,网络通讯;Java程序中对于数据的输入输出操作以流(stream)的方式进行
- 分类:按操作数据单位不同分为:字节流(8bit),字符流(字符,对应字节与编码相关,更适合操作文本文件)(字符流效率更高,字节流在操作二进制文件时保证文件的无损操作,更适合操作二进制文件); 按数据流的流向不同分为:输入流,输出流; 按流的角色不同分为:节点流,处理流/包装流
- 由四个抽象基类派(都无法直接实例化)生出IO流的40多个类,其子类名称都是以父类名作为子类名后缀
- 如何在IDEA中打开源码,打开类图
- FileInputStream&FileOutputStream:用对象来操作文件
- FileInputStream:文件输入流
。三种构造方法的参数:File对象; String 文件系统中的路径名; 文件描述符(?)
。read方法(到达结尾时都返回-1):()-从输入流中读取一个数据字节,(byte【】b)将最多b.length个字节的数据读入一个byte数组中(优化效率,返回实际读取的字节数),(byte【】b, int off, int len)
。显示:(char),汉字(三个字节)必然出现乱码(解决方案(?));String(b, 0, read(byte[])
- 调试
2.FileOutputStream
。write方法: write(),write(byte[]) , write(byte[], int off, int len)
public void writeFile(){ //创建对象,定义在try外扩大作用域 String filePath = "d:\\Java\\a.txt"; FileOutputStream file = null; //若文件不存在将自动新建文件夹 try{ //1.new FileOutputStream(filePath);写入内容时,将覆盖原有内容 //2.new FileOutputStream(filePath, true);写入内容时,将追加到文件末尾 file = new FileOutputStream(filePath);
//三种write方法 //写入单个字节 write() file.write('H'); //写入字符串 write(byte[] b) String str1 = "hello"; file.write(str1.getBytes()); //getBytes:字符串——>字节数组 //写入字符串 String str2 = "Hello"; file.write(str2.getBytes(), 0, str2.length()); }catch(IOException e){ e.printStackTrace(); //jdk手册 }finally{ try { file.close(); } catch (IOException e) { e.printStackTrace(); } } }
- FileReader&FileWriter:字符流
- 构造方法:File对象或String指定路径
- FileReader:
read方法,末尾返回-1:read()每次读取一个字符; read(char【】),读取字符数组,效率更高,返回读取到的字符数;相关API: new String(char[]),将char[]转换成String,new String(char[], off , len ), 将char[]的指定部分转换成String - FileWriter常用方法:
构造方法:new FileWriter(File/String) *new FileWriter(File/String, true)追加模式
write方法,write(),写入单个字符,write(char[]),写入字符数组,writer(char[], off, len), write(String), write(String, off, len);相关API:String.toCharArray:将String转换成char[]
*注意:一定要关闭(close)或者刷新(flush)(这时候还在内存中),否则无法写入文件
4.
public void fileReader(){ String filePath = "d:\\Java\\a.txt"; FileReader fileReader = null; //1.创建FileReader对象 try{ fileReader = new FileReader(filePath); //单个字符读取 //循环读取,使用read int read1 = 0; while((read1 = fileReader.read())!=-1){ System.out.print((char)read1); } //字符数组读取文件 // 循环读取,使用read(buf),返回实际读取的字符数 int readLen = 0; char [] buf = new char[8]; while((readLen = fileReader.read(buf))!=-1){ System.out.println(new String(buf, 0, readLen)); //readLen保证在只有1个字符时仍可以输出 } }catch(IOException e){ System.out.println(e); }finally{ try { if(fileReader != null){ fileReader.close(); } } catch (IOException e) { e.printStackTrace(); } } }
- 节点流和处理流
- 节点流:从一个特定的数据源(存放数据的地方)读写程序,如FileReader
- 处理流(包装流):连接在已有的流(节点流或处理流)之上,为程序提供更强大的的读写功能,也更加灵活,如BufferedReader
- BufferedReader封装任意一个节点流(Reader的子类),不局限于具体的数据源(修饰器模式:一种设计模式)
- BufferedReader:操作文本文件,尽量不要操作二进制文件(图片声音视频),否则可能会出现文件的损失;关闭处理流时只需要关闭外层流
//这里直接抛出异常 public void BufferedReader_() throws IOException{ String filePath = "d:\\Java\\a.txt"; //创建对象 BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath)); //读取 String line; //BufferedReader是按行读取文件,效率高 //读取完毕时返回null while((line = bufferedReader.readLine())!=null){ System.out.println(line); } //关闭流,只需要关闭BufferedReader,底层会自动关闭节点流 bufferedReader.close(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)