IO框架(BV1Tz4y1X7H7)
一、流的概念与分类
概念:内存与存储设备之间传输数据的通道。数据借助流传输。
分类:
①按方向【重点】
输入流:将<存储设备>中的内容读入到<内存>中。
输出流:将<内存>中的内容写入到<存储设备>中。
②按单位
字节流:以字节为单位,可以读写所有数据。
字符流:以字符为单位,只能读写文本数据。
③按功能
字节流:具有实际传输数据的读写功能。
过滤流:在节点流的基础之上增强功能。
二、字节流
1.字节流的父类(抽象类)
InputStream字节输入流
public int read(){}
public int read(byte[] b){}
public int read(byte[] b,int off,int len){}
OutputStream字节输出流
public void write(int n){}
public void write(byte[] b){}
public void write(byte[] b,int off,int len){}
2.字节流的子类
2.1文件字节流
FileInputStream
public int read()//从输入流中读取一个字节数据,返回读到的字节数据,如果达到文件末尾,返回-1。
public int read(byte[] b)//从输入流中读取字节数组长度的字节数据存入数组中,返回实际读到的字节数;如果达到文件的尾部,则返回-1。
FileOutputStream
public void write(int b)//将指定字节写入输出流。
public void write(bute[] b)//一次写多个字节,将b数组中所有字节,写入输出流。
如:
package com.IO;import java.io.FileInputStream;
import java.io.IOException;/*
演示文件字节输入流的使用
FileInputStream*/
public class Demo01 {public static void main(String[] args) throws IOException {//文件内容:abcdefgFileInputStream fileInputStream=new FileInputStream("d:\\aaa.txt");//read();读入单个字节int data=fileInputStream.read();System.out.println((char)data);//awhile((data=fileInputStream.read())!=-1) {System.out.print((char)data);}//bcdefg//read(byte[] b);读入多个字节byte[] b=new byte[1024];if((data=fileInputStream.read(b))!=-1) {System.out.println(new String(b,0,data));}//bcdefg//关闭流fileInputStream.close();}
}
如:
package com.IO;import java.io.FileOutputStream;
import java.io.IOException;/*
演示文件字节输出流的使用
FileOutputStream*/
public class Demo02 {public static void main(String[] args) throws IOException {//如果没有文件会自动创建FileOutputStream fileOutputStream=new FileOutputStream("d:\\bbb.txt");//write(int b);fileOutputStream.write(97);fileOutputStream.write('b');fileOutputStream.write('c');//write(byte[] b);fileOutputStream.write(new String("helloworld").getBytes());//此时文件bbb.txt内容为abc helloworld//关闭流fileOutputStream.close();}
}
2.2字节流赋值文件
package com.IO;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo03 {public static void main(String[] args) throws IOException {//将图片读取到输入流FileInputStream fileInputStream=new FileInputStream("d:\\MrG1.jpg");//从输出流写入数据FileOutputStream fileOutputStream=new FileOutputStream("d:\\MrG2.jpg");int count;//保存一次读取到的实际个数byte[] b=new byte[1024];while((count=fileInputStream.read(b))!=-1) {fileOutputStream.write(b, 0, count);}System.out.println("复制成功");//关闭流fileInputStream.close();fileOutputStream.close();}
}
2.3字节缓冲流
缓冲流:BufferedInputStream/BufferedOutputStream
特点:
提高IO效率,减少访问磁盘的次数;
数据存储在缓冲区中。flush可以将缓存区的内容写入文件,也可以直接close。
如:
package com.IO;/*
使用字节缓冲流读取
BufferedInputStream*/import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;public class Demo04 {public static void main(String[] args) throws IOException {//使用该输入流每次会从硬盘读入FileInputStream fileInputStream=new FileInputStream("d:\\aaa.txt");//缓冲流需要一个底层流//缓冲流每次从缓冲区读取BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);//读取int data;while((data=bufferedInputStream.read())!=-1) {System.out.print((char)data);}// 用自己创建的缓冲流byte[] buf = new byte[1024];int count = 0;while((count = bufferedInputStream.read(buf)) != -1){System.out.println(new String(buf, 0, count));}bufferedInputStream.close();}
}
如:
package com.IO;import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*
使用字节缓冲流写入文件
BufferedOutputStream*/
public class Demo05 {public static void main(String[] args) throws IOException {FileOutputStream fileOutputStream=new FileOutputStream("d:\\buf.txt");//缓冲流将数据写入到缓冲区BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream);//写入文件bufferedOutputStream.write("helloworld".getBytes());bufferedOutputStream.flush();//其实内部也会调用flushbufferedOutputStream.close();}
}
三、 对象流
对象流:ObjectOutputStream/ObjectInputStream
增加了缓冲区功能。
增强了读写8种基本数据类型和字符串功能。
增强了读写对象的功能:
readObject()//从流中读取一个对象。
writeObject(Object obj)向流中写入一个对象。
使用流传输对象的过程称为序列化、反序列化。
1.序列化
package com.IO;/*
学生类*/
public class Student {private String name;private int age;public Student(String name, int age) {super();this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}
package com.IO;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;/*
使用ObjectOutputStream实现对象的序列化
注:序列化的类必要要实现Serializable接口*/
public class Demo06 {public static void main(String[] args) throws IOException {//这个文件后缀名表示二进制文件,但你可以写成其他如obj等任意后缀。FileOutputStream fileOutputStream=new FileOutputStream("d:\\stu.bin");ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);//序列化(写入操作)Student tang=new Student("唐瑞", 21);objectOutputStream.writeObject(tang);objectOutputStream.close();System.out.println("序列化完毕");}
}
2.反序列化
package com.IO;import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;/*
使用ObjectInputStream实现反序列化(读取重构对象)*/
public class Demo07 {public static void main(String[] args) throws IOException, ClassNotFoundException {FileInputStream fileInputStream=new FileInputStream("d:\\stu.bin");ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);//读取文件(反序列化)Student student=(Student) objectInputStream.readObject();objectInputStream.close();System.out.println("执行完毕");System.out.println(student.toString());}
}
3.序列化和反序列化注意事项
①序列化类必须实现Serializable接口。
②序列化类中的对象属性也要求实现Serializable接口。
③序列化类中可以添加序列化版本号ID,以保证序列化的类和被序列化的类是同一个类。
④使用transient修饰属性,可以避免该属性被序列化。
⑤静态属性不能被序列化。
⑥可以利用集合来序列化多个对象。
四、编码方式
当编码方式和解码方式不一致时,会出现乱码。
①IOS-8859-1:
收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。采用1个字节来表示,最多只能表示256个字符。
②UTF-8:
针对Unicode码表的可变长度字符编码。国际上使用的编码,也称为“万国码”,收录了几乎所有国家的常用字符。采用1至3个字节来表示一个字符。
③GB2312:
简体中文,采用1个或2个字节来表示字符,95年之前所采用的编码。
④GBK:
简体中文的扩充,GB2312的升级版本。
⑤BIG5:
台湾,繁体中文。
五、字符流
1.字符流的父类(抽象类)
Reader:字符输入流
public int read()
从流中读取单个字符,用整型来返回读取的字符;当读到流底部时返回-1。
public int read(char[] c)
从流中读取字符保存到c数组中,返回读取的字符个数,当读到流底部时返回-1。
public int read(char[] cbuf,int off,int len){}
抽象方法。
Writer:字符输出流
public void write(int n)
写入单个字符,只能写入包含16位低阶字节的整型数值,16位高阶字节将会被忽略。
public void write(String str)
写入一个字符串。
public void write(char[] cbuf)
写入一个字符数组。
2.字符流的子类
FileReader:
public int read()
继承自InputStreamReader类。读取单个字符,返回读取的字符,当读到流底部时返回-1。
public int read(char[] c)
继承自Reader类。
public int read(char[] cbuf,int offset,int length)
继承自InputStreamReader类。从流中读取部分字符到cbuf中指定位置,返回读取到的字符个数,当读到流底部时返回-1。
FileWriter:
public void write(int c)
继承自OutputStreamWriter类,写入一个字符。
public void write(String str)
继承自Writer类。
public void Write(char[] cbuf)
继承自Writer类。
如:
package com.IO;import java.io.FileReader;public class Demo08 {public static void main(String[] args) throws Exception {// 1. 创建FileReader 文件字符输入流FileReader fr = new FileReader("..");// 2. 读取// 2.1 单个字符读取int data = 0;while((data = fr.read()) != -1){ // 读取一个字符System.out.println((char)data);}char[] buf = new char[2]; // 字符缓冲区读取int count = 0;while((count = fr.read(buf)) != -1){System.out.println(new String(buf, 0, count));}
// 3. 关闭fr.close();}
}
如:
package com.IO;import java.io.FileWriter;public class Demo09 {public static void main(String[] args) throws Exception{// 1. 创建FileWriter对象FileWriter fw = new FileWriter("d:\\write.txt");// 2. 写入for(int i = 0; i < 10; i ++){fw.write("写入的内容");fw.flush();}// 3. 关闭fw.close();System.out.println("执行完毕");}
}
如:
package com.IO;import java.io.FileReader;
import java.io.FileWriter;/*
使用FileReader和FileWriter复制文本文件,不能复制图片或二进制文件*/
public class Demo10 {public static void main(String[] args) throws Exception{// 1. 创建FileReader fr = new FileReader("d:\\write.txt");FileWriter fw = new FileWriter("d:\\write2.txt");// 2. 读写int data = 0;while((data = fr.read()) != -1){fw.write(data);fw.flush();}// 3. 关闭fw.close();fr.close();}
}
2.1字符缓冲流
缓冲流:BufferedReader/BufferedWriter
高效读写
支持换行输入符
可一次写一行、读一行。
package com.IO;import java.io.BufferedReader;
import java.io.FileReader;/*
使用字符缓冲流读取文件
BufferedReader*/
public class Demo11 {public static void main(String[] args) throws Exception{// 创建缓冲流FileReader fr = new FileReader("d:\\write.txt");BufferedReader br = new BufferedReader(fr);// 读取// 1. 第一种方式char[] buf = new char[1024];int count = 0;while((count = br.read(buf)) != -1){System.out.println(new String(buf, 0, count));}// 2. 第二种方式 一行一行读取String line = null;while((line = br.readLine()) != null){System.out.println(line);}// 关闭br.close();}
}
package com.IO;import java.io.BufferedWriter;
import java.io.FileWriter;/*
演示BufferedWriter的使用*/
public class Demo12 {public static void main(String[] args) throws Exception{// 1. 创建BufferedWriter对象FileWriter fw = new FileWriter("..");BufferedWriter bw = new BufferedWriter(fw);// 2. 写入for(int i = 0; i < 10; i ++){bw.write("写入的内容");bw.newLine(); // 写入一个换行符bw.flush();}// 3. 关闭bw.close(); // 此时会自动关闭fw}
}
2.2打印流
PrintWriter:
封装了print()/println()方法,支持写入后换行。
支持数据原样打印。
package com.IO;import java.io.PrintWriter;/*
演示PrintWriter的使用*/
public class Demo13 {public static void main(String[] args) throws Exception{// 1 创建打印流PrintWriter pw = new PrintWriter("d:\\print.txt");// 2 打印pw.println(12);pw.println(true);pw.println(3.14);pw.println('a');// 3 关闭pw.close();}
}
2.3转换流
桥转换流:InputStreamReader/OutputStreamWriter
可将字节流转换为字符流。
可设置字符的编码方式。
package com.IO;import java.io.FileInputStream;
import java.io.InputStreamReader;/*
使用InputStreamReader读取文件,指定使用的编码*/
public class Demo14 {public static void main(String[] args) throws Exception{// 1 创建InputStreamReader对象FileInputStream fis = new FileInputStream("d:\\write.txt");InputStreamReader isr = new InputStreamReader(fis, "utf-8");// 2 读取文件int data = 0;while((data = isr.read()) != -1){System.out.println((char)data);}// 3 关闭isr.close();}
}
package com.IO;import java.io.FileOutputStream;
import java.io.OutputStreamWriter;/*
使用InputStreamReader读取文件,指定使用的编码*/
public class Demo15 {public static void main(String[] args) throws Exception{// 1 创建OutputStreamReader对象FileOutputStream fos = new FileOutputStream("d:\\info.txt");OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");// 2 写入for(int i = 0; i < 10; i ++){osw.write("写入内容");osw.flush();}// 3 关闭osw.close();}
}
六、File类
概念:代表物理盘符中的一个文件或者文件夹。
方法:
public boolean CreateNewFile()
当且仅当指定的文件名不存在时创建一个指定的新的、空的文件。创建成功返回true,如果指定文件名已存在返回false。
public boolean mkdir()
创建一个指定路径名的文件夹。当且仅当文件夹被创建时返回true,否则返回false。
public boolean delete()
删除一个指定的文件或文件夹,文件夹必须为空才能被删除。当且仅当指定的文件或文件夹被删除时返回true,否则返回false。
public boolean exists()
检查指定的文件或文件夹是否存在。当且仅当指定的文件或者文件夹存在时返回true,否则返回false。
public File[] listFiles()
列出目录中的所有内容,返回一个指定路径名中的文件数组,如果指定的路径名不代表一个文件夹(目录)就返回null。
public boolean renameTo(File dest)
重命名一个路径名所指定的文件。当且仅当修改操作成功时返回true,否则返回false。
1.文件操作
package com.IO;import java.io.File;
import java.util.Date;/*
File类的使用
1. 分隔符
2. 文件操作
3. 文件夹操作
*/
public class Demo16 {public static void main(String[] args) {separator();}// 1. 分隔符public static void separator() {System.out.println("路径分隔符" + File.pathSeparator);System.out.println("名称分隔符" + File.separator);}// 2. 文件操作public static void fileOpen() throws Exception{// 1. 创建文件File file = new File("d:\\file.txt");if (!file.exists()) { // 是否存在boolean b = file.createNewFile();System.out.println("创建结束:"+b);}// 2. 删除文件// 2.1 直接删除file.delete(); // 成功true// 2.2 使用jvm退出时删除file.deleteOnExit();// 3. 获取文件信息System.out.println("获取绝对路径" + file.getAbsolutePath());System.out.println("获取路径" + file.getPath());System.out.println("获取文件名称" + file.getName());System.out.println("获取夫目录" + file.getParent());System.out.println("获取文件长度" + file.length());System.out.println("文件创建时间" + new Date(file.lastModified()).toLocaleString());// 4. 判断System.out.println("是否可写" + file.canWrite());System.out.println("是否是文件" + file.isFile());System.out.println("是否隐藏" + file.isHidden());}
}
2.文件夹操作
package com.IO;import java.io.File;
import java.util.Date;public class Demo17 {// 文件夹操作public static void directoryOpe() throws Exception {// 1. 创建文件夹File dir = new File("...");System.out.println(dir.toString());if (!dir.exists()) {//dir.mkdir(); // 只能创建单级目录dir.mkdirs(); // 创建多级目录}// 2. 删除文件夹// 2.1 直接删除dir.delete(); // 只能删除最底层空目录// 2.2 使用jvm删除dir.deleteOnExit();// 3. 获取文件夹信息System.out.println("获取绝对路径" + dir.getAbsolutePath());System.out.println("获取路径" + dir.getPath());System.out.println("获取文件名称" + dir.getName());System.out.println("获取夫目录" + dir.getParent());System.out.println("获取文件长度" + dir.length());System.out.println("文件夹创建时间" + new Date(dir.lastModified()).toLocaleString());// 4. 判断System.out.println("是否是文件夹" + dir.isFile());System.out.println("是否隐藏" + dir.isHidden());// 5. 遍历文件夹File dir2 = new File("...");String[] files = dir2.list();for (String string : files) {System.out.println(string);}}
}
3.文件过滤器
FileFilter接口:
public interface FileFilter
boolean accepte(File pathname)
当调用File类中的listFiles()方法时,支持传入FileFilter接口实现类,对获取的文件进行过滤,只有满足条件的文件才可以出现在listFiles()的返回值中。
System.out.println("=======FileFilter接口的使用=======");// FileFilter接口的使用File[] files2 = dir2.listFiles(new FileFilter(){@Overridepublic boolean accept(File pathname){if(pathname.getName().endsWith(".jpg")){return true;}return false;}});for(File file : files2){System.out.println(file.getName());}
4.递归遍历文件夹
package com.IO;import java.io.File;public class Demo18 {public static void main(String[] args) {listDir(new File("d:\\myfiles"));}public static void listDir(File dir){File[] files = dir.listFiles();System.out.println(dir.getAbsolutePath());if(files != null && files.length > 0){for(File file : files){if(file.isDirectory()){listDir(file); // 递归}else {System.out.println(file.getAbsolutePath());}}}}
}
5.递归删除文件夹
package com.IO;import java.io.File;public class Demo19 {public static void deleteDir(File dir){File[] files = dir.listFiles();if(files != null && files.length > 0){for(File file : files){if(file.isDirectory()){deleteDir(file); // 递归}else{// 删除文件System.out.println(file.getAbsolutePath() + "删除" + file.delete());}}}}
}
七、补充:Properties
Properties:属性集合
特点:
①存储属性名和属性值(键值对)。
②属性名和属性值都是字符串类型。
③没有泛型。
④和流有关(所以没有整理在集合里面)。
方法:
public String getProperty(String key)
根据key在属性列表里查找value,如果原始属性列表找不到就去默认属性列表找。返回key所对应的value。
public void list(PrintWriter out)
将属性列表打印在指定的输出流上,在debug时很有用。
public Object setProperty(String key,String value)
内部调用的是Hashtable的put方法,将key和value成对地保存在属性列表中。返回这个key上一个对应的value,没有就返回null。
Properties可以保存在一个流中或是从一个流中加载,属性列表中的每个键值对都是一个字符串。一个属性列表可以包括另一个第二属性列表来作为它的默认值,如果在原始属性列表中没有找到key时就搜索第二属性列表。
IO框架(BV1Tz4y1X7H7)相关推荐
- socket.io框架学习
socket.io框架是用于网页中实时通信,一般用于开发聊天室等实时性较强的系统模块 一开始从官网http://socket.io/上down了一个demo下来,这个demo里面只有基本的收发消息的功 ...
- 【安卓开发系列 -- APP 开源框架】IO 框架 OKIO
[安卓开发系列 -- APP 开源框架]IO 框架 OKIO [1]OKIO的整体框架 [1.1]OKIO的整体框架图示 [1.2]OKIO的优势 CPU和内存消耗低,OKIO采用了segment机制 ...
- Netty,Nginx严重落后;网络IO框架最新性能排名
Netty,Nginx严重落后:网络IO框架最新性能排名 新一代网络IO框架性能吊打传统框架 最近看了一下最新第21期(2022年7月)的Techempower的网络框架性能排名,实在有些惊讶.很多老 ...
- 【十四】Java IO框架思维导图
知识章节参考:[十四]Java IO框架
- 数据库、MongoDB/Mongoose、cookie与session、密码加密、图片处理、web Socket和Socket.IO框架
一.传统数据库 数据库就是存储数据的,那么存储数据就用txt就行了啊,为什么要有数据库? 理由1: 数据库有行.列的概念,数据有关系,数据不是散的. 老牌数据库,比如MySQL.SQL Server. ...
- 树莓内核驱动io框架
树莓派内核驱动框架 驱动层框架编写 驱动程序:pin4driver2.c 上层程序pin4test.c 驱动代码编译和测试 1.返回内核源码linux文件进行模块编译 2.将生成的pin4driver ...
- 网络编程模型综述 之 成熟的IO框架介绍
ACE "重量级的C++ I/O框架,用面向对象实现了一些I/O策略和其它有用的东西,特别是它的Reactor是用OO方式处理非阻塞I/O,而Proactor是用OO方式处理异步I/O的( ...
- KVM Virtio: An I/O virtualization framework for Linux(Linux虚拟IO框架)
目录 Virtio 适用于kvm / Linux的半虚拟化驱动程序 如何使用Virtio 如何使用Virtio获得高性能 Virtio:Linux的I / O虚拟化框架 完全虚拟化与半虚拟化 Linu ...
- Java IO框架之BIO、NIO、AIO
我是傲骄鹿先生,沉淀.学习.分享.成长. 如果你觉得文章内容还可以的话,希望不吝您的「一键三连」,文章里面有不足的地方希望各位在评论区补充疑惑.见解以及面试中遇到的奇葩问法 目录 一.概述 二.BIO ...
最新文章
- postgresql 远程用户_liunx环境下安装PostgresSQL,开启远程连接
- 【完结】总结12大CNN主流模型架构设计思想
- java poi excel无法添加水印替代方法
- SpringMVC容器和Spring容器
- html读取本地txt_手机本地电子书籍阅读器 — 静读天下
- 离开载具_迷你世界 自制火箭试飞成功 飞行载具不负众望
- 《编程珠玑(续)(修订版)》—第2章2.1节Awk中的关联数组
- python中pack函数,python中struct.pack()函數和struct.unpack()函數
- LaTeX Cookbook by Eric
- python2.7卸载出问题原因分析_怎么卸载python2.7
- js-格式化数字保留两位小数-带千分符
- (原创)javascript进阶(三)
- [wcf]入门.3.1
- nero 刻录一张4g的服务器系统盘大概需要多长时间,刻录系统盘(如何刻录系统盘) 狸窝用户有福了:nero刻录系统盘...
- →箭头符号大全复制_特殊符号大全8908194
- 2021年最近的猝死案例有点多!!!(关注我,让你活的更久一点)
- 老鹰-第一次Python笔记
- xubuntu系统关闭自动锁屏和待机
- xmanager无法连接Linux服务器,xmanager连接linux出错问题怎么解决
- 10.算法进阶之分布式篇——分布式环境下如何生成唯一ID——UUID