Java基础(19)IO流
十九.IO流 |
持久化:将内存中的数据 输出到其他设备中(比如硬盘),用于长时间保持数据 流:数据传输的管道或通道 i是in的缩写表示输入,o是out的缩写表示输出,io则表示了两个不同方向流 一般的 我们以内存为参照物,往内存中写入的方向我们称之为输入,从内存往外输入的方向我们称之为输出 |
一.IO流的分类 |
注意:一般描述一个流时,需要通过方向,内容,功能等三个方面进行描述,所以说不同的分类键 需要三者组合 1.按照方向划分 a.输入流——往内存中写 b.输出流——从内存往外输出 2.按照传输的内容划分 a.字节流——传输所有以字节为单位的内容(任何内容) b.字符流——传输的是文本内容,如果一个文件使用Notepad++打开不是乱码一般都是文本内容 3.按照功能划分 a.节点流——只提供了最基本的输入输出功能——相当于,没有配件的基础枪械 b.过滤流——用来给节点流拓展功能的,本身不具备基础功能——相当于,枪械的配件 |
二.字节流 |
字节流与字符流的区分:一般以Stream结尾的是字节流 以er结尾的是字符流 输入输出流的区分input/Reader输入流 output/Writer输出流 1.字节输入输出节点流 InputStream/OutputStream 但是二者都是抽象类,无法实例化对象 常用的字节输入输出的节点流,分别是: FileInputStream——字节输入节点流 FileOutputStream——字节输出节点流 2.FileOutputStream字节输出节点流 a.创建对象的语法: FileOutputStream os=new FileOutoutStream(String name); 该构造方法,参数为数据输出到哪个文件的路径,默认表示覆盖源文件内容 FileOutoutStream os=new FileOutoutStream(String name,boolean append); 第一个参数,参数为数据输出到哪个文件的路径,第二个参数为布尔类型,表示是否覆盖源文件的内容 如果为false则覆盖,如果为true就不覆盖并在原来的内容中进行追加 注意: 字节输出流输出所写的文件不存在,那么就会主动创建一个文件 并写入内容 当前路径中的文件夹书写不正确时,才会出现java.io.FileNotFoundException b.常用方法: void write(int b);每次向外,写出一个字节的内容 void close();关闭流,释放资源 3.文件路径书写的注意事项 (1)因为\在java时一种特殊的字符,所以需要使用转义字符,用\\代表\ 例:D:\2002JAVA\day24\课上练习\a.txt 改为D:\\2002JAVA\\day24\\课上练习\\a.txt (2)或者把所有的\换成/ 例:D:\2002JAVA\day24\课上练习\a.txt 改成D:/2002JAVA/day24/课上练习/a.txt (3)绝对路径与相对路径 绝对路径:从盘符写起来寻找文件路径 例:D:/2002JAVA/day24/课上练习/a.txt 相对路径:相对于某个位置的路径信息 Eclipse以项目的根目录为参照目录 例:test/a.txt 会从项目的根目录去查找 b文件夹下的a.txt 4.FileInputStream字节输入节点流 a.创建对象语法: FileInputStream is=new FileInputStream(String name); 参数是指定 该输入流 是将哪个文件中的内容读取到内存中,所以参数是文件的路径 注意:此处只要是文件路径写错,无论是文件名还是文件夹名,只要无法找到该文件都会出现 java.io.FileNotFoundException且不会主动创建文件 b.常用方法: int read();每次从文件中读取一个字节的内容,当文件中没有新内容时,读到是特殊在-1 void close(); 关闭流,释放资源 c.如何把一个文件中的内容都读完? while(true){ int read=is.read();; if(read==-1){ //判断每次读进来的值是否是特殊值-1 break; } System.out.println((char)read); } 5.文件的拷贝 重要 a.文件拷贝的思想:读一次 写一次 读完了就写完了 从而就复制完了 b.文件拷贝的1.0版本: public static void main(String[] args)throws IOException{ //准备好一个输入流 一个输出流 //输入流 文件路径 写的是否需要被拷贝的目标文件 FileInputStream is=new FileInputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt"); //输出流 文件路径 写的是复制出的新文件的路径 FileOutputStream os=new FileOutoutStream(D:\\2002JAVA\\day24\\作业\\a.txt); //读一个字节 写一个字节 while(true){ int read=is.read();; if(read==-1){ //判断每次读进来的值是否是特殊值-1 break; } //没读完 就把读到的写进去 os.write(read); } //释放资源 is.close(); os.close(); } c.文件拷贝2.0 使用了缓冲流来增强读写效率 从而加快拷贝速度 public static void main(String[] args)throws IOException{ //准备好一个输入流 一个输出流 //输入流 文件路径 写的是否需要被拷贝的目标文件 FileInputStream is=new FileInputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt"); //给输入流 加装缓冲流 BufferedInputStream bis=new BufferedInputStream(is); //输出流 文件路径 写的是复制出的新文件的路径 FileOutputStream os=new FileOutoutStream(D:\\2002JAVA\\day24\\作业\\a.txt); //给输出流 加装缓冲流 BufferedOutputStream bos=new BufferedOutputStream(os); //读一个字节 写一个字节 while(true){ int read=is.read();; if(read==-1){ //判断每次读进来的值是否是特殊值-1 break; } //没读完 就把读到的写进去 os.write(read); } //释放资源 bis.close(); bos.close(); } 6.字节过滤流中的缓冲流BufferedInputStream/BufferedOutputStream 没有提供更丰富的方法功能 但是对于读写能力进行了加强 因为读写能力的加强依靠缓冲区的 所以这组过滤流又被称为缓冲流 a.使用过滤流的流程 必须掌握!!!!非常重要,考试必考 (1)先创建节点流——必须先有基础枪械 (2)给节点流包装过滤流——给枪械加配件,注意选择过滤流时方向需要一致 (3)使用过滤流对象进行读写——使用提高 了能力的枪械进行射击 (4)关闭流释放资源——变成盒子精 b.BufferedOutputStream为写操作提供了一个8192个字节的缓冲区 缓冲区在什么时候会和硬盘进行一次交互? (1)当该流被关闭时,缓冲区会和硬盘进行交互——强制 (2)当缓冲区被写满时,缓冲区会和硬盘进行交互——被动 (3)当缓冲流对象主动调用flush方法时,缓冲区会和硬盘进行交互——主动 c.缓冲区的好处: 减少内存与硬盘的交互次数,从而提高IO效率 7.过滤流PrintStream PrintStream提供了丰富的向外输出内容的方法 也具备缓冲能力 注意PrintStream向外输出的 是字符串的表示形式 不是参数的值 常用方法: print();向外输出参数数字符串内容 不换行 println();向外输出参数参数字符串内容 换行 代码实例: public static void main(String[] args)throws FileNotFoundException{ FileOutputStream os=new FileOutputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt"); PrintStream pos =new PrintStream(os); //pos.println("晖哥"); //pos.println("666); pos.println(new Student("ZZZ",15); pos.close(); } 8.过滤流ObjectInputStream/ObjectOutputStream 提供了八种数据类型的读写功能,提供了对象类型包括String的读写功能 还提供了缓冲功能 常用方法: ObjectOutputStream: writexxx 向外输出各种数据类型的数据 xxx代表数据类型 ObjectInputStream: readxxx 向内读入各种数据类型的数据 xxx代表数据类型 注意: 在使用ObjectInputStream的 readxxx方法时: 读到文件末尾不再是个特殊值 而是抛出一个java.io.EOFException异常 来表明文件读到末尾 代码案例: while(true){ try{ Long read = ois.readLong(); System.out.println(read); }catch(EOFException e){ System.out.println("读到末尾"); break; } } 9.对象的序列化问题 很常见 面试必问 后续内容重要的知识点 对象序列化:将对象放置在流中 从内存传输到其他设备中的过程被称为对象序列化 需要使用ObjectOutputStream writeObject(Object obj); 对象的反序列化:将对象放置在流中 从其他设备传输到内存中的过程被称为对象反序列化 需要使用ObjectInputStream readObject(); 对象序列化的注意事项: (1)注意序列化一个对象时,要保证他所对应的类实现了Serializable接口 (2)如果不想让对象的某个属性参与序列化,那么可以让该属性被transient修饰 (3)如果一个对象的属性是引用类型,那么必须保证该属性所对应的类型实现了Serializable接口 (4)在集合进行序列化的时候,要保证集合中所存元素,都可以被序列化 10.IO处理的标准处理 会写 语法:JDK1.7推出的自动关闭机制 try(声明并创建需要调用close方法的对象){ }catch(Exception e){ e.printStackTrace(); throw new RuntimeException; } 注意:try后的()中可以声明赋值多个对象 每个声明赋值语句 使用; 结尾 案例: try( FileInputStream is=new FileInputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt"); FileOutputStream os=new FileOutputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt");){ os.write(); int read=is.read(); }catch(Exception e){ e.printStackTrace(); throw new RuntimeException; } |
三.编码 |
为了计算机也能认知人类的符号 字体 出现了编码表(字符集) 编码表(字符集):储存了符号/字体 与数字的对应关系 常见的编码表(字符集): 美国的第一个编码表:ASC码 欧洲:ISO8859-1 记录了欧洲人习惯下的符号与字体 中国大陆: 简体中文 GB2312 收录了少量中文 不包含少数民族的文字与符号 陶吉吉 GB18030 收录了更多的中文 包含少数民族的文字与符号 藏文 蒙文 GBK 收录了上千中文的字符集 也是目前简体中文释义最多的字符集 中国台湾: 繁体中文 Big5 大5码 万国码 Unicode码 UTF-8 UTF-16 a.编码:将符号 通过字符集 转化为数据的过程 被称为编码 b.解码:将数据 通过字符集 转化为符号的过程 被称为解码 当编解码释义的字符集不一致时,会出现乱码的现象 所有字符集中都收入了ASC码表 所以英文什么时候都不会乱码 因为在所有 的编码表中英文对应的数据都是一样的 |
四.字符流 |
1.字符输入输出流的顶级父类 字符流的顶级父类时Writer与Reader 他们都是抽象类 不能创建对象 如果想使用字符流的 输出输入功能 需要使用其子类创建对象 2.字符节点流FileReader/FileWriter 字节流可以用来操作所有文本文件 字符流只能用来操作相关文本文件 a.FileWriter 提供字符最基本的输出功能 文件不存在则创建 路径错误则出错 也可以指定是否覆盖原内容的操作 常用方法: write(int i); 每次输出一个字符 write(String str); 每次输出一个字符串 close();关闭流 b.FileReader 提供字符最基本的输入功能 文件不存在则直接出错 read(); 每次读入一个字符 且如果读到末尾 返回的也是-1 close();关闭流 3.字符过滤流 BufferedReader/PrintWriter 字符过滤流使用流程与字节过滤流使用流程是一致的 a.BufferedReader:提供了更强大的 读取文本文件的功能 常用方法: readline(); 每次读取一行文本,读到末尾时,返回值为null close(); 释放资源,关闭流 b.PrintWriter:提供了更强的输出字符串的能力 常用方法: println系列 将参数转化为字符串输出 并换行 close();关闭流 4.桥转换流 重点!!! 可以将字节流转化为字符流,并指定字符流的编码或解码使用的字符集 InputStreamReader:将字节输入流转化为字符输入流 OutputStreamWriter:将字节输出流转化为字符输出流 桥转换流的使用流程: (1)创建字节流 (2)使用桥转换流将字节流转换为字符流 并设置字符集 如果是输出流,则设置的字符集,是编码字符集 Writer writer = new OutputStreamWriter(字节输出流, 编码字符集); 如果是输入流,则设置的字符集,是解码字符集 Reader reader = new InputStreamReader(字节输入流 , 解码字符集); (3)可以给字符流添加过滤流,方便操作 (4)释放资源 桥转换流案例: 某个文件的编码格式是UTF-8 内容为 专业的我们成就专业的你 将该文件进行复制,并把UTF-8的编码,改为GBK编码 读进来:使用解码字符集为UTF-8的字符流进行读取,保证读到的数据是无误的 写出去:使用编码集为GBK的字符流进行输出 设置一个文件的编码:用notepade++打开一个空文件,将编码设置为UTF-8无BOM格式 在文件中输入内容,此时这些内容会被UTF-8进行编码 桥转换流设置解码: FileInputStream is=new FileInputStream("text.txt"); Reader reader = new InputStreamReader(is,"UTF-8"); BufferedReader br=new BufferedReader(reader); 桥转换流设置编码: FileOutputStream os=new FileOutputStream("test_copy.txt"); Writer writer=new OutputStreamWriter(os,"GBK"); PrintWriter pw=new PrintWriter(wrier); 进行读一行,写一行 while(true){ String line=br.readLine(); if(line==null){ break; } pw.println(line); } pw.close(); br.close(); |
五.File类 |
IO流:用来操作文件内容 File类:用来对文件和文件夹本身进行操作 比如删除一个文件/文件夹 1.关于File对象的 new File(路径); (1)如果路径是一个文件路径,则该File对象指代的是一个文件对象 (2)如果路径是一个文件夹路径,则该File对象指代的是一个文件夹对象 (3)如果路径中的文件或文件夹不存在,则表示该文件和文件夹是内存中文件或文件夹,可对该文件和文件夹进行创建等操作 2.File类的常用方法 public boolean createNewFile(); 创建文件,创建成功返回true,如果文件存在返回值为false public boolean mkdir(); 创建文件夹,创建成功返回true,如果文件夹存在返回值为false pubic boolean delete(); 删除文件夹/文件,删除成功返回true,否则返回false 当删除文件夹时,只有当文件夹为空时,才可以删除 而删除文件时,不管文件内容是否为空,都会被删除 public String getName(); 获取文件名(含拓展名),文件夹名 public boolean exists(); 判断一个文件或是目录是否存在,存在返回true,否则为false public String getAbsolutePath(); 获取绝对路径 public File[] listFiles(); 获取当前文件下所有的文件,文件夹 public boolean isFile(); 判断File对象所对应的是否为文件,而不是目录 public boolean isDirectory(); 判断File对象所对应的是否为目录,而不是文件 3.File类的案例 如何找出D:\\eclipse-workspace下的所有.java文件 public static void findJava(File file){ //获取目录中所有的文件或文件夹 File[] listFiles=file.listFiles(); //判断文件夹内容是否为空 if(listFiles.length==0){ return; } //遍历这个目录里所有的文件或文件夹 for(File file2 : listFiles){ if(file2.isFile()){ //如果是文件 则验证该文件是否是.java结尾 if(file2.getName().endswith(".java")){ System.out.println(fiile2.getName()); } }else{ //如果是文件夹 则继续进入该文件夹,寻找.java findJava(file2); } } } |
六.IO知识点的梳理 |
Java基础(19)IO流相关推荐
- 【Java基础】· IO流习题详解
写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...
- Java基础学习—— IO流
Java基础学习-- IO流 1 文件 1.1 文件的创建 1.2 文件常用的方法 2 IO流 2.1 FileInputStream 2.2 FileOutputStream 2.3 文件的拷贝 2 ...
- Java基础进阶IO流概述
1.IO流,什么是IO? I : Input O : Output 通过IO可以完成硬盘文件的读和写. 2.IO流的分类? 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物 往内存 ...
- 学Java基础19 字符流 编码表 转换流 字符高效流 对象流 序列化 以及所有的IO流总结
一.字符流概述 1.字符流 就是用于来读写字符操作的流 2.字符流使用的原因: 使用字节流来读取文件中中文会出现乱码 因为中文不是一个字节组成的 所以读取中文的时候 需要使用字符流 字符实际上也是使用 ...
- Java基础之IO流
IO流用来处理设备间数据传输,java对数据的操作是通过流的方式,而这些操作流的对象被封装在IO包中.流可以分为字符流和字节流.字符流可以设置编码方式,这就使得处理文本更加方便. IO常用基类 字节流 ...
- Java基础知识——IO流
简介 IO是指Input/Output,即输入和输出.以内存为中心: Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等 Output指把数据从内存输出到外部,例 ...
- 【java基础】IO流是啥?有啥用?(上)
今天我们说说java代码中对文件的操作,比如新建删除文件,读取文件内容等. File类 File类用于操作文件和目录,可对文件或目录进行新建,删除和重命名等操作.但是如果要访问文件内容本身,就需要用到 ...
- Java基础:IO 流中的 flush
无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点 这里 可以跳转到教程. 内容概要 Java IO ...
- Java基础之IO流(一)
IO流(一) IO流:输入输出的流动 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 流按操作数据分为两种:字节流与字符流 . 流按流向分为 ...
- java基础之 IO流
javaIO流 IO流 : (input output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方. IO技术的作用:主要就是解决设备和设备之间的数据传输问题.比如: ...
最新文章
- php中getdistance函数_php计算两个经纬度地点之间的距离
- Linux无法联网怎么办?解析VMware上的CentOS7(Linux)系统无法联网的解决办法
- MySQL自增字段并发插入导致死锁
- 京瓷6525_京瓷6525扫描怎么设置?
- 台式计算机不用待机还是关机好,电脑应该选择“关机”还是“休眠”?不关机对电脑有损伤吗?...
- 剑指offer 顺时针打印矩阵
- 感知算法论文(八):Generalized Intersection over Union:A Metric and A Loss for Bounding Box Regression(2019)
- C语言实用算法系列之学生管理系统_单向链表外排序_栈内数组存储链表节点指针
- CentOS安全设置
- Laravel核心解读 -- 扩展用户认证系统
- Docker-创建和分享应用(3)
- 英文c语言笔试题,关于C语言模拟笔试题
- Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程
- 虚幻4 配置打包安卓
- 激光雷达工作原理简介
- 易语言 文件捆绑机的原理【转载】
- C++之字符串大小写转换
- 移动磁盘提示设备未就绪文件怎么恢复
- AI期末考试基础知识点复习(AI入门)
- 编程n的阶乘使用while语句_谷歌工程师新作,东北话编程
热门文章
- php浮点转int少1,PHP中浮点数计算比较及取整不准确的解决方法
- 加载json文件注意事项
- Matlab的D算法
- 150首中国翻唱韩国原歌曲
- php5.3 register_globals,在PHP 5.3中PHP寄存器全局支持?(PHP register globals support in PHP 5.3?)...
- C语言 深度剖析数据在内存中的存储(2)
- mac按键难回弹(按下去软软的)
- google map 离线数据
- Linux ❉ sudo 命令
- KEIL中左侧project 的文件编译后没有显示.h文件