IO流介绍
Posted 小布丁value
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流介绍相关的知识,希望对你有一定的参考价值。
IO流介绍
https://blog.csdn.net/qq_44543508/article/details/102831084?
1.输出流,输入流
2.字节流,字符流
3.介质流,过滤流
4.基类:inputStream,OutputStream,Reader,writer
5.fielXXX, BufferXXX, ObjectXXX…
6.序列化和反序列化
7.IO涉及的设计模式:适配器模式和装饰器模式
8.File类
9.RandomAccessFile:随机访问文件类型
java8类型
lambda,stream流
参考书籍
《java编程思想》第18章
《java核心技术 卷2》第一章
IO流介绍
流是一个抽象的概念,当程序读取数据时,就会开启一个通往数据源的流,这个数据源可以是文件,内存或是网络连接
当程序写入数据时,就会开启一个通往目的地的流
java中把不同到的来源或者目的地的数据都统一抽象为数据流
本质:就是对数据的传输,数据的结合,有方向性
一,IO流
Java中流的划分
1.1)按流向分:
输入流:程序可以从中读取数据的流
输出流:程序能向其中写入的流
输入流:从数据源读取数据流到程序(数据源: 磁盘\\u盘\\网络\\键盘)
输出流:从程序写入到目的地(目的地:磁盘\\U盘\\网络\\显示器)
1. 2)按数据传输单位划分:
字节流:以字节为单位传输数据的流
字符流:以字符为单位传输数据的流
1.3)按功能划分:
节点流: 用于直接操作目标设备的流
过滤流:对一个已存在的流进行包装,以提供更强大和灵活的读写功能
二, File 类介绍
1.java.io.File 类是专门对文件进行操作的类,只能对文件本身进行操作,不能对文件内容进行操作。
2.java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
怎么理解上面两句话?其实很简单!
1.第一句就是说File跟流无关,File类不能对文件进行读和写也就是输入和输出!
2.第二句就是说File主要表示类似D:\\文件目录1与D:\\文件目录1\\文件.txt,前者是文件夹(Directory)后者则是文件(file),而File类就是操作这两者的类。
2.1构造方法
在java中,一切皆是对象,File类也不例外,不论是哪个对象都应该从该对象的构造说起,所以博主来分析分析File类的构造方法。首先从API开始着手
1.File(String pathname)
1.File(String pathname) 通过给定路径名字符串转换为抽象路径名来创建新的File实例。
2.File(String parent, String child)
- 从父路径名和子路径名来构建file实例
3.File(File parent, String child)
3.根据父路径File实例和子路径名来构建实例
File类的注意点:
1.一个File对象代表硬盘中实际存在的一个文件或者目录。
2.File类构造方法不会给你检验这个文件或文件夹是否真实存在,因此无论该路径下是否存在文件或者目录,都不影响File对象的创建。
2…2常用方法
File的常用方法主要分为获取功能、获取绝对路径和``相对路径、判断功能、创建删除功能的方法
2.2.1获取功能的方法
注意本文全部以D/IO下的空文件为例
1、public String getAbsolutePath() :返回此File的绝对路径名字符串。
2、public String getPath() :将此File转换为路径名字符串。
3、public String getName() :返回由此File表示的文件或目录的名称。
4、public long length() :返回由此File表示的文件的长度。
```java
// 文件路径名
String path="D:\\\\IO";
File file = new File(path); //相当于D:\\IO
String path1="D:\\\\IO\\\\txt";
File file1 = new File(path1);//相当于D:\\IO\\txt
//通过父路径和子路径字符串
String parent ="D:\\\\IO";
String child="IO.txt";
File file2=new File(parent,child);//相当于D:\\IO\\txt
// 通过父级File对象和子路径字符串
File parentDir = new File("D:\\\\IO");
String child1="IO//txt";
File file4 =new File(parentDir,child1);////相当于D:\\IO\\txt
public static void main(String[] args) {
// 文件路z径名
String path="D:\\\\IO";
File file = new File(path); //相当于D:\\IO
System.out.println("文件绝对路径:"+file.getAbsolutePath());
System.out.println("文件构造路径:"+file.getPath());
System.out.println("文件名称:"+file.getName());
System.out.println("文件长度:"+file.length()+"字节");
}
文件绝对路径:D:\\IO
文件构造路径:D:\\IO
文件名称:IO
文件长度:0字节
2.1.2 绝对路径和相对路径
绝对路径:一个完整的路径,以盘符开头,(windows:**C:\\ linux/mac: / )
相对路径:一个简化的路径,不以盘符开头 //IO.txt//b.txt
1、路径是不区分大小写
2、路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠
"."表示当前路径 “…”表示父路径
分隔符:
windows分隔符:
mac分割符:/
java中有常量分隔符:File.separator ;//根据系统不同自动生成对应分隔符
String path = “test”+File.separator+“test.txt”;
//windows test\\test.txt
//linux test/test.txt
String path="test"+File.separator+"test.txt";
System.out.println(path);
代码运行结果: test\\test.txt
3.创建删除功能的方法
- public boolean createNewFile():文件不存在,创建一个新的空文件并返回true,文件存在,不创建文件并返回false。
- public boolean delete():删除由此File表示的文件或目录。
- public boolean mkdir() :创建由此File表示的目录。
- public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
其中,mkdirs()和mkdir()方法类似,但mkdir(),只能创建一级目录,mkdirs()可以创建多级目录比如//a//b//c,所以开发中一般用mkdirs();
方法一:
public class FileCreateDelete {
public static void main(String[] args) throws IOException {
//文件的创建
File f = new File("/IO/txt");
System.out.println("是否存在"+f.exists());//false
System.out.println("是否创建"+f.createNewFile());//true
System.out.println("是否创建"+f.createNewFile());//false
System.out.println("是否存在"+f.exists());//true
System.out.println();
//目录的创建
File f1=new File("/IO/txt1");
System.out.println("是否存在"+f1.exists());
System.out.println("是否创建"+f1.mkdir());
System.out.println();
}
}
创建多级目录
File F4=new File("/IO/txt1//txt2//txt3");
System.out.println(F4.mkdir());//false
File F5=new File("/IO/txt1//txt2//txt3");
System.out.println(F4.mkdirs());//true
文件的删除
System.out.println(F5.delete());
方法二:
public class FileCreateDelete {
public static void main(String[] args) {
File F=new File("/IO/ADA");
try {
boolean newFile = F.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 目录的遍历
- 4.1 public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
public class FileFor {
public static void main(String[] args) {
File f=new File("/IO");
//获取当前目录下的文件以及文件夹的名称。
String [] names =f.list();
for(String i : names){
System.out.println(i);
}
}
}
ADA
txt
txt1
4.2 public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
//获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
File[] files = f.listFiles();
for(File i : files){
System.out.println(i);
}
\\IO\\ADA
\\IO\\txt
\\IO\\txt1
listFiles在获取指定目录下的文件或者文件夹时必须满足下面两个条件
1,指定的目录必须存在
2,指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException异常
5.FilenameFilter接口详解
FilenameFilter:文件名过滤器。这名字起的,没说的,通俗易懂。就是在文件集合中过滤出我想要的文件。
public interface FilenameFilter {
//参数为目录和指定过滤名称
//返回结果 true: 可以返回 false:不能返回
boolean accept(File dir, String name);
}
不要着急!稍后你会看到这个接口和抽象方法的作用。提示:这里会显示出策略模式的强大之处。
我都是以下面这个文件来举例。
现在,我想要在D:\\eclipse下找到以 .xml 结尾的文件,看下面我写的代码
public class FilenameFilterDemo {
public static void main(String[] args) {
File file = new File("D:\\\\BaiduNetdiskDownload\\\\.idea");
//创建一个过滤器实例
FilenameFilterDemo filenameFilterDemo = new FilenameFilterDemo();
FileFilter fileFilter = filenameFilterDemo.new FileFilter();
String [] list = file.list(fileFilter);
for(String i : list){
System.out.println(i);
}
}
class FileFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
//String 中的endWith(String str)方法 ,筛选出以Str结尾的字符串
if (name.endsWith(".xml")) {
return true;//可以返回
}
return false;//不可以返回
}
}
}
misc.xml
modules.xml
workspace.xml
以上是关于IO流介绍的主要内容,如果未能解决你的问题,请参考以下文章
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_5_InputStreamReader介绍&代码实现
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_4_OutputStreamWriter介绍&代码实现