导图社区 IO流
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。
编辑于2022-09-26 20:23:00 四川省listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
社区模板帮助中心,点此进入>>
listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
IO流
介绍
在Java程序中,对于数据的输入/输出操作以“流”(Stream)方式进行;J2SDK提供了各种各样的“流”类,用以获取不同种类的数据:程序中通过标准的方法输入或输出数据
I表示intput,是数据从硬盘进内存的过程,称之为读
O表示output,是数据从内存到硬盘的过程。称之为写
IO的数据传输,可以看做是一种数据的流动,按照流动的方向,以内存为参照物,进行读写操作
内容
用windows记事本打开能读的懂,这样的文件就是纯文本文件
File
介绍
File类可以在读写数据时告诉虚拟机要操作的(文件/文件夹)的位置,以及对(文件/文件夹)本身进行操作,如创建,删除等
File是文件和目录路径名的抽象表示,文件和目录可以通过File封装成对象。File封装的对象仅仅是一个路径名,该路径名可以是存在的,也可以是不存在的。
构造方法
File(String pathname)
通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
File(String parent,String child)
从父路径名字符串和子路径名字符串创建新的File实例
File(File parent,String child)
从父抽象路径名和子路径名字符串创建新的File实例
补充
为了使用File类里面的方法,所以要把字符串表示形式的路径变成File对象
常用方法
创建
public boolean createNewFile()
文件所在的文件夹必须要存在
创建一个新的空的文件
如果文件存在,那么创建失败,返回false;如果文件不存在,那么创建成功,返回true
不管调用者有没有后缀名,只能创建文件
public boolean mkdir()
创建一个单级文件夹
只能创建单级文件夹,不能创建多级文件夹
不管调用者有没有后缀名,只能创建单级文件夹
public boolean mkdirs()
创建一个多级文件夹
可以创建单级文件夹,也可以创建多级文件夹
不管调用者有没有后缀名,只能创建文件夹
创建文件夹用该方法就行,源码包含mkdir方法
删除
public boolean delete()
删除由此抽象路径名表示的文件或目录
删除的内容不走回收站
如果删除的是文件,那么直接删除,如果删除的是文件夹,那么只能删除空文件夹
判断
public boolean isDirectory()
测试此抽象路径名表示的File是否为目录
public boolean isFile()
测试此抽象路径名表示的File是否为文件
public boolean exists()
测试此抽象路径名表的File是否存在
获取
public String getName()
返回由此抽象路径名表示的文件或目录的名称
如果调用者是文件,那么获取的是文件名和后缀名,如果调用者是一个文件夹,那么获取的是文件夹的名字
public File[] listFiles()
返回此抽象路径名表示的目录中的文件和目录的File对象数组
进入文件夹,获取这个文件夹里面所有的文件和文件夹的File对象,并把这些File对象都放在一个数组中返回,包括隐藏文件和隐藏文件夹都可以获取
当调用者不存在时,返回null
当调用者是一个文件时,返回null
当调用者是一个空文件夹时,返回一个长度为0的数组
当调用者是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
当调用者是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏内容
当调用者是一个需要权限才能进入的文件夹时,返回null
绝对路径与相对路径
绝对路径
从盘符开始
例子
相对路径
相对当前项目下的路径
例子
递归操作File
删除一个多级文件夹
1.进入
2.遍历
3.判断
4.判断
字节流
介绍
可以操作(拷贝)所有类型的文件
因为字节流一次读一个字节,而不管GBK还是UTF-8一个中文都是多个字节,用字节流每次只能读其中的一部分,所以就会出现乱码问题。
补充
拷贝文件的四种方式
字节流一次读写一个字节
字节流一次读写一个字节数组
字节缓冲流一次操作一个字节
字节缓冲流一次操作一个字节数组
写数据
步骤
1.创建字节输出流的对象
如果文件不存在,会自动创建出来.
如果文件存在,会把文件清空,如果不想被清空则加true
2.写数据
传递一个整数时,那么实际上写到文件中的,是这个整数在码表中对应的那个字符
3.释放资源
每次使用完流必须要释放资源
方法
void write(int b)
一次写一个字节数据
void write(byte[] b)
一次写一个字节数组数据
void write(byte[] b,int off,int len)
一次写一个字节数组的部分数据
问题
如何换行
Windows
\r\n
Linux
\n
Mac
\r
如是追加写入
public FileOutputStream(String name,boolean append)
创建文件输出流以指定的名称写入文件。如果第二个参数为true,不会清空文件里面的内容
try...catch...finally捕获异常
读数据
步骤
1.创建字节输入流对象
如果文件存在,那么就不会报错.
如果文件不存在,那么就直接报错
2.读数据
一次读取一个字节,返回值就是本次读到的那个字节据.也就是字符在码表中对应的那个数字.如果想要看到的是字符数据,那么一定要强转成char
读取多个字节
3.释放资源
操作
复制文件
复制文件,其实就把文件的内容从一个文件中读取出来(数据源,然后写入到另一个文件中(目的地)
提高速度
为了解决速度问题,字节流通过创建字节数组,可以一次读写多个数据
public int read(byte[] b)
从输入流读取最多b.length个字节的数据返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
字符流
介绍
如果利用字节流,把文本文件中的中文,读取到内存中,有可能出现乱码,把中文写到文本文件中,也有可能出现乱码。字符流可以解决字符乱码的问题
汉字存储和展示
字符流读取中文
介绍
字符流=字节流+编码表
不管是在哪张码表中,中文的第一个字节一定是负数
结论
想要进行拷贝,一律使用字流或者字节缓冲流
想要把文本文件中的数据读到内存中,请使用字符输入流。想要把内存中的数据写到文本文件中,请使用字符输出流。
注意
windows默认使用码表为:GBK,一个字符两个字节。
Idea和以后工作默认使用Unicode的UTF-8编解码格式,一个中文三个字节
常用方法
编码
byte[] getBytes()
使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName)
使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
解码
String(byte[] bytes)
通过使用平台的默认字符集解码指定的字节数组来构造新的String
String(byte[] bytes,String charsetName)
通过指定的字符集解码指定的字节数组来构造新的String
flush()
刷新流,还可以继续写数据
close()
关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
写数据
步骤
1.创建字符输出流对象
如果文件不存在,就创建。但是要保证父级路径存在。
如果文件存在就清空
2.写数据
写出int类型的整数,实际写出的是整数在码表上对应的字母。
写出字符串数据,是把字符串本身原样写出
3.释放资源
方法
void write(int c)
写一字符
void write(char[] cbuf)
写出一个字符数
void write(char[] cbuf,int off,int len)
写出字符数组的一部分
void write(String str)
写一个字符串
void write(String str,int off,int len)
写一个字符串的一部分
问题
如何换行
Windows
\r\n
Linux
\n
Mac
\r
如是追加写入
public FileOutputStream(String name,boolean append)
创建文件输出流以指定的名称写入文件。如果第二个参数为true,不会清空文件里面的内容
读数据
步骤
1.创建字符输入流对象
2.读数据
一次读取一个字符
读取一个字符数组
3.释放资源
缓冲流
字节缓冲流
介绍
BufferedOutputStream:字节缓冲输出流
BufferedInputStream:字节缓冲输入流
字节缓冲流仅仅提供缓冲区,可以提高效率,不能直接操作文件真正的读写数据还得依靠传递的字节流对象进行操作
构造方法
字节缓冲输出流:BufferedOutputStream(OutputStream out)
字节缓冲输入流:BufferedInputStream(InputStream in)
原理
读写一个字节
读写一个字节数组
字符缓冲流
介绍
BufferedWriter:可以将数据高效的写出。
BufferedReader:可以将数据高效的读取到内存
构造方法
字符缓冲输出流:BufferedWriter(Writer out)
字符缓冲输入流:BufferedReader(Reader in)
特有方法
BufferedWriter
void newLine()
写一行行分隔符,行分隔符字符串由系统属性定义
BufferedReader
public String readlLine()
读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
转换流
介绍
转换流就是来进行字节流和字符流之间转换的
InputStreamReader是从字节流到字符流的桥梁
OutputStreamWriter是从字符流到字节流的桥梁
使用场景
指定编码读写
JDK11 之后可用字符流构造方法直接指定编码
对象操作流
介绍
可以把对象以字节的形式写到本地文件,直接打开文件,是读不懂的,需要再次用对象操作流读到内存中
对象操作流分为两类:对象操作输入流ObjectInputStream和对象操作输出流ObjectOutputStream
对象操作输出流(对象序列化流):就是将对象写到本地文件中,或者在网络中传输对象
对象操作输入流(对象反序列化流):把写到本地文件中的对象读到内存中,或者接收网络中传输的对象
serializable
是一个标记性接口,里面没有任何的抽象方法只要一个类实现了这个Serializable接口,那么就表示这个类的对象可以被序列化
serialversionUID
序列号
如果自己没有定义,那么虚拟机会根据类中的信息会自动的计算出一个序列号,之后修改类中的信息,虚拟机会再次计算出一个序列号
自定义
序列化
构造方法
ObjectOutputStream(OutputStream out)
写数据
public final void writeObject(Object obj)
反序列化
构造方法
ObjectInputStream(InputStream in)
读数据
public final Object readObject()
注意
用对象序列化流序列化了一个对象后,假如修改了对象所属的Javabean类,读取数据会出问题,会抛出InvalidClassException异常,可以给对象所属的类加一个serialVersionUID来解决
如果一个对象中的某个成员变量的值不想被序列化,就给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
Properties
介绍
Properties是一个Map体系的集合类
Properties中有跟IO相关的方法
键值对的数据类型基本都定义为字符串
特有方法
Object setProperty(String key,String value)
设置集合的键和值,都是String类型,底层调用Hashtable方法put
String getProperty(String key)
使用此属性列表中指定的键搜索属性
Set<String> stringPropertyNames()
从该属性列表中返回一个不可修改的键集,其中健及其对应的值是字符串
IO流相关方法
void load(InputStream inStream)
从输入字节流读取属性列表(键和元素对)
void load(Reader reader)
从输入字符流读取属性列表(键和元素对)
void store(OutputStream out,String comments)
将此属性列表(键和元素对)写入此Properties表中,以适合于使用load(InputStream)方法的格式写入输出字节流
void store(Writer writer,String comments)
将此属性列表(键和元素对)写入此Properties表中,以适合使用load(Reader)方法的格式写入输出字符流
主题