一、流的概念与分类

概念:内存与存储设备之间传输数据的通道。数据借助流传输。

分类

①按方向【重点】

输入流:将<存储设备>中的内容读入到<内存>中。

输出流:将<内存>中的内容写入到<存储设备>中。

②按单位

字节流:以字节为单位,可以读写所有数据。

字符流:以字符为单位,只能读写文本数据。

③按功能

字节流:具有实际传输数据的读写功能。

过滤流:在节点流的基础之上增强功能。

二、字节流

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)相关推荐

  1. socket.io框架学习

    socket.io框架是用于网页中实时通信,一般用于开发聊天室等实时性较强的系统模块 一开始从官网http://socket.io/上down了一个demo下来,这个demo里面只有基本的收发消息的功 ...

  2. 【安卓开发系列 -- APP 开源框架】IO 框架 OKIO

    [安卓开发系列 -- APP 开源框架]IO 框架 OKIO [1]OKIO的整体框架 [1.1]OKIO的整体框架图示 [1.2]OKIO的优势 CPU和内存消耗低,OKIO采用了segment机制 ...

  3. Netty,Nginx严重落后;网络IO框架最新性能排名

    Netty,Nginx严重落后:网络IO框架最新性能排名 新一代网络IO框架性能吊打传统框架 最近看了一下最新第21期(2022年7月)的Techempower的网络框架性能排名,实在有些惊讶.很多老 ...

  4. 【十四】Java IO框架思维导图

    知识章节参考:[十四]Java IO框架

  5. 数据库、MongoDB/Mongoose、cookie与session、密码加密、图片处理、web Socket和Socket.IO框架

    一.传统数据库 数据库就是存储数据的,那么存储数据就用txt就行了啊,为什么要有数据库? 理由1: 数据库有行.列的概念,数据有关系,数据不是散的. 老牌数据库,比如MySQL.SQL Server. ...

  6. 树莓内核驱动io框架

    树莓派内核驱动框架 驱动层框架编写 驱动程序:pin4driver2.c 上层程序pin4test.c 驱动代码编译和测试 1.返回内核源码linux文件进行模块编译 2.将生成的pin4driver ...

  7. 网络编程模型综述 之 成熟的IO框架介绍

    ACE "重量级的C++ I/O框架,用面向对象实现了一些I/O策略和其它有用的东西,特别是它的Reactor是用OO方式处理非阻塞I/O,而Proactor是用OO方式处理异步I/O的( ...

  8. KVM Virtio: An I/O virtualization framework for Linux(Linux虚拟IO框架)

    目录 Virtio 适用于kvm / Linux的半虚拟化驱动程序 如何使用Virtio 如何使用Virtio获得高性能 Virtio:Linux的I / O虚拟化框架 完全虚拟化与半虚拟化 Linu ...

  9. Java IO框架之BIO、NIO、AIO

    我是傲骄鹿先生,沉淀.学习.分享.成长. 如果你觉得文章内容还可以的话,希望不吝您的「一键三连」,文章里面有不足的地方希望各位在评论区补充疑惑.见解以及面试中遇到的奇葩问法 目录 一.概述 二.BIO ...

最新文章

  1. postgresql 远程用户_liunx环境下安装PostgresSQL,开启远程连接
  2. 【完结】总结12大CNN主流模型架构设计思想
  3. java poi excel无法添加水印替代方法
  4. SpringMVC容器和Spring容器
  5. html读取本地txt_手机本地电子书籍阅读器 — 静读天下
  6. 离开载具_迷你世界 自制火箭试飞成功 飞行载具不负众望
  7. 《编程珠玑(续)(修订版)》—第2章2.1节Awk中的关联数组
  8. python中pack函数,python中struct.pack()函數和struct.unpack()函數
  9. LaTeX Cookbook by Eric
  10. python2.7卸载出问题原因分析_怎么卸载python2.7
  11. js-格式化数字保留两位小数-带千分符
  12. (原创)javascript进阶(三)
  13. [wcf]入门.3.1
  14. nero 刻录一张4g的服务器系统盘大概需要多长时间,刻录系统盘(如何刻录系统盘) 狸窝用户有福了:nero刻录系统盘...
  15. →箭头符号大全复制_特殊符号大全8908194
  16. 2021年最近的猝死案例有点多!!!(关注我,让你活的更久一点)
  17. 老鹰-第一次Python笔记
  18. xubuntu系统关闭自动锁屏和待机
  19. xmanager无法连接Linux服务器,xmanager连接linux出错问题怎么解决
  20. 10.算法进阶之分布式篇——分布式环境下如何生成唯一ID——UUID

热门文章

  1. java给图片添加水印工具类
  2. 2023年网络安全最应该看的书籍,弯道超车,拒绝看烂书
  3. Android 使用腾讯的TBS浏览器X5内核的集成加载pdf等文件
  4. 在线涂改图片 php,php网站怎么修改图片
  5. 贵安新区聚焦智能终端产业推进移动互联升级
  6. 【附源码】Java计算机毕业设计网上鞋店管理系统(程序+LW+部署)
  7. MySQL 不同版本默认字符集
  8. 深度学习评价标准:TP、FN、FP、TN、AP、MAP
  9. [NOIP2017 普及组] 棋盘
  10. IPMI设置使用说明