Java的I/O框架
创始人
2024-03-06 10:27:33
0

目录

一、流的概念

二、流的分类

1.按方向

2.按单位:

3.按功能:

三、字节流

1、文件字节流

(1) FileInputStream:

(2)FileOutputStream:

(3)完成复制文件

 2、字节缓冲流

(1)BufferedInputStream:

(2)BufferedOutputStream:

3、对象流

(1)序列化:

(2)反序列化:

四、字符编码

五、字符流

 1. 文件字符流

(1)FileReader

(2)FileWriter

 (3)完成复制文件

2.字符缓冲流

(1)BufferedReader

(2)BufferedWriter

3.打印流 ——PrintWriter

六、转换流

1. InputStreamReader

2.OutputStreamWriter

七、File类

1.分隔符

2.文件操作

3.文件夹操作

4. FileFilter 接口

 

5.递归遍历和递归删除

附加:Properties(属性集合)

1.特点:

2.使用


一、流的概念

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

数据借助流传输。

二、流的分类

1.按方向

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

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

 

2.按单位:

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

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

3.按功能:

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

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

三、字节流

字节流的父类(抽象类)

InputStream:字节输入流

OutputStream:字节输出流

1、文件字节流

(1) FileInputStream:

public int read(byte[] b)

从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数,如果达到文件的尾部,则返回-1。

 

(2)FileOutputStream:

public void write(byte[] b)

一次写多个字节,将b数组中所有字节,写入输出流。

 

(3)完成复制文件

使用文件字节流实现文件的复制,先读取(FileInoutStream)再写入(FileOutputStream)。

 2、字节缓冲流

缓冲流:BufferedInputStream / BufferedOutputStream

(1)提高IO效率,减少访问磁盘的次数;

(2)数据存储在缓冲区中,flush是将缓冲区的内容写入文件中。

(1)BufferedInputStream:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
/*** 使用字节缓冲流读取* BufferedInputStream*/
public class Demo04 {public static void main(String[] args)throws Exception {//1.创建BufferedInputStreamFileInputStream file = new FileInputStream("d:\\aaa.txt");BufferedInputStream bufferedInputStream = new BufferedInputStream(file);//2.读取//方法一:
//        int data = 0;
//        while((data=bufferedInputStream.read())!=-1){
//            System.out.println((char) data);
//        }//方法二:byte[] buf = new byte[1024];int count = 0;while((count=bufferedInputStream.read(buf))!=-1){System.out.println(new String(buf,0,count));}//3.关闭bufferedInputStream.close();}
}

(2)BufferedOutputStream

 

3、对象流

对象流:ObjectOutputStream / ObjectInputStream

(1)增强了缓冲区功能

(2)增强了读写8种基本数据类型和字符串功能

(3)增强了读写对象的功能:

readObject()    从流中读取一个对象

writeObiect(Object obj)    向流中写入一个对象

使用流传输对象的过程称为序列化、反序列化。

(1)序列化:

(2)反序列化:

 

注意事项:

1. 序列化类必须实现Serializable接口;

2. 序列化类中的对象属性也要实现Serializable接口;

3. 写序列化版本号ID,可以保证序列化和反序列化的类是同一个类;

 4. 使用 transient(瞬间的) 修饰属性,这个属性不能序列化;

5. 静态属性也不能序列化;

6. 序列化多个对象,放在同个集合里,一次序列化 / 反序列化。

 

四、字符编码

ISO-8859-1    收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。

UTF-8        针对Unicode码表的可变长度字符编码。

GB2312     简体中文

GBK           简体中文、扩充

BIG5          台湾,繁体中文

当编码方式和解码方式不一致时,就会出现乱码。

五、字符流

字符流的父类(抽象类)

Reader:字符输入流

 

Writer:字符输出流

 1. 文件字符流

(1)FileReader

从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数,如果达到文件的尾部,则返回-1。

pubic  int read (char[] c)

 

(2)FileWriter

一次写多个字符,将b数组中所有字符,写入输出流。

public void write(String str)

 (3)完成复制文件

2.字符缓冲流

 缓冲流:BufferedReader / BufferedWriter

高效书写

支持输入换行符

可一次写一行、读一行。

(1)BufferedReader

import java.io.BufferedReader;
import java.io.FileReader;/*** 使用字符缓冲流读取文件*/
public class Demo4 {public static void main(String[] args) throws Exception{//1.创建缓冲流FileReader fileReader = new FileReader("d:\\bbb.txt");BufferedReader bufferedReader = new BufferedReader(fileReader);//2.读取//2.1方法一:整个读取
//        char[] buf = new char[1024];
//        int count = 0;
//        while((count=bufferedReader.read(buf))!=-1){
//            System.out.println(new String(buf,0,count));
//        }//2.2方法二:一行一行的读取String line= null;while((line=bufferedReader.readLine())!=null){System.out.println(line);}//3.关闭bufferedReader.close();}
}

(2)BufferedWriter

import java.io.BufferedWriter;
import java.io.FileWriter;/*** BufferedWriter的使用*/
public class Demo5 {public static void main(String[] args)throws Exception {//1.创建BufferedWriter对象FileWriter fileWriter = new FileWriter("d:\\bbb.txt");BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);//2.写入for (int i = 0; i < 10; i++) {bufferedWriter.write("好好学习java\n");bufferedWriter.newLine();  //写入一个换行符,相当于\nbufferedWriter.flush();}//3.关闭bufferedWriter.close();System.out.println("执行完毕");}
}

3.打印流 ——PrintWriter

封装了print() / println()方法,支持写入后换行。

支持数据原样打印。

import java.io.PrintWriter;
/*** PrintWriter的使用*/
public class Demo6 {public static void main(String[] args) throws  Exception{//1.创建打印流PrintWriter printWriter = new PrintWriter("d:\\print.txt");//2.打印printWriter.println(97);printWriter.println(true);printWriter.println('2');printWriter.println('a');printWriter.println(3.13);//3.关闭printWriter.close();System.out.println("执行完");}
}

六、转换流

桥转换流:InputStreamReader / OutputStreamWriter

可将字节流转换为字符流。

可设置字符的编码方式。

1. InputStreamReader

2.OutputStreamWriter

 

七、File类

概念:代表物理盘符中的一个文件或文件夹。

 

1.分隔符

 

2.文件操作

public class Demo10 {public static void main(String[] args) throws IOException, InterruptedException {fileOpe();}public static void fileOpe() throws IOException, InterruptedException {//1.创建文件File file = new File("d:\\file.txt");if (!file.exists()){boolean b = file.createNewFile();System.out.println("创建结果:"+b);}//2.删除文件//2.1直接删除System.out.println("删除结果:"+file.delete());//2.2使用jvm退出时删除file.deleteOnExit();Thread.sleep(5000);  //休眠结束,就删除//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());}
}

3.文件夹操作

public class Demo10 {public static void main(String[] args) throws IOException, InterruptedException {directoryOpe();}public static void directoryOpe() throws IOException, InterruptedException {//1.创建文件夹File dir = new File("d:\\aa\\bb\\cc");if (!dir.exists()){dir.mkdir();  //只能创建单级目录dir.mkdirs();  //创建多级目录}//2.删除文件夹//2.1直接删除   只能删除空目录System.out.println("删除结果:"+dir.delete());  //只删除最后一个,并且是空目录//2.2使用jvm退出时删除dir.deleteOnExit();Thread.sleep(5000);  //休眠结束,就删除//3.获取文件夹信息System.out.println("获取文件的绝对路径:"+ dir.getAbsolutePath());System.out.println("获取路径:"+dir.getPath());System.out.println("获取文件夹名称:"+dir.getName());  //最底层的文件名称System.out.println("获取父目录:"+dir.getParent());System.out.println("获取文件的创建时间:"+new Date(dir.lastModified()).toLocaleString());//4.判断System.out.println("是否是文夹件:"+dir.isFile());System.out.println("是否隐藏:"+dir.isHidden());//5.遍历文件夹File file = new File("d:\\aa");String[] list = file.list();for (String string : list){System.out.println(string);}}
}

4. FileFilter 接口

public interface FileFilterboolean accept (File pathname)

当调用File类中的ListFiles()方法时,支持传入FileFilter接口实现类,对获取文件进行过滤,只有满足条件的文件才能出现在listFiles()的返回值中。

 

5.递归遍历和递归删除

public class Demo11 {public static void main(String[] args) {listDir(new File("c:\\MyJavaStudy"));deleteDir(new File("c:\\MyJavaStudy"));}//递归遍历文件夹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());}}}}//递归删除文件夹public static void deleteDir(File dir){File[] files = dir.listFiles();System.out.println(dir.getAbsolutePath());if (files!=null&&files.length>0){for (File file:files){if (file.isDirectory()){deleteDir(file);   //递归}else {//删除文件System.out.println(file.getAbsolutePath()+"删除:"+file.delete());}}}//删除空文件夹System.out.println(dir.getAbsolutePath()+"删除:"+dir.delete());}
}

附加:Properties(属性集合)

1.特点:

1. 存储属性名和属性值

2.属性名和属性值都是字符串类型

3.没有泛型

4.和流有关

2.使用

public class Demo08 {public static void main(String[] args) throws IOException {//1.创建集合Properties properties = new Properties();//2.添加元素properties.setProperty("username","zhangsan");properties.setProperty("age","20");System.out.println(properties.toString());//3.遍历//3.1   keySet//3.2   entrySet//3.3   StringPropertyNames()方法Set strings = properties.stringPropertyNames();for (String pro : strings){System.out.println(pro+"----"+properties.getProperty(pro));}//4.和流有关的方法// 4.1 list方法     打印列表PrintWriter pw = new PrintWriter("d:\\print.txt");properties.list(pw);pw.close();//4.2 store方法     保存FileOutputStream fileOutputStream = new FileOutputStream("d:\\store.properties");properties.store(fileOutputStream,"注释");fileOutputStream.close();//4.3  load方法     加载Properties properties1 = new Properties();FileInputStream fileInputStream = new FileInputStream("d:\\store.properties");properties1.load(fileInputStream);fileInputStream.close();System.out.println(properties1.toString());}
}

 



重在理解!

感谢ლ(°◕‵ƹ′◕ლ)!!!

 

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...