13-1 File类的使用
四、File 类的常用方法
1.File类的获取功能
public String getAbsolutePath():获取绝对路径
public String getPath() :获取路径
public String getName() :获取名称
public String getParent():获取上层文件目录路径。若无,返回null
public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
public long lastModified() :获取最后一次的修改时间,毫秒值
public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
2.File类的重命名功能
public boolean renameTo(File dest):把文件重命名为指定的文件路径
3.File类的判断功能
public boolean isDirectory():判断是否是文件目录
public boolean isFile() :判断是否是文件
public boolean exists() :判断是否存在
public boolean canRead() :判断是否可读
public boolean canWrite() :判断是否可写
public boolean isHidden() :判断是否隐藏
4.File类的创建功能
public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建
注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
5.File类的删除功能
public boolean delete():删除文件或者文件夹
删除注意事项:
Java中的删除不走回收站。要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录
13-2 IO流原理及流的分类
二、流的分类
1.按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
2.按数据流的流向不同分为:输入流,输出流
3.按流的角色的不同分为:节点流,处理流
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
三、IO 流体系
处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
五、InputStream & Reader
1.InputStream 和 Reader 是所有输入流的基类。
2.InputStream(典型实现:FileInputStream)
>int read()
>int read(byte[] b)
>int read(byte[] b, int off, int len)
3.Reader(典型实现:FileReader)
>int read()
>int read(char [] c)
>int read(char [] c, int off, int len)
4.程序中打开的文件 IO 资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以 应该显式关闭文件 IO 资源。
5.FileInputStream 从文件系统中的某个文件中获得输入字节。FileInputStream 用于读取非文本数据之类的原始字节流。要读取字符流,需要使用 FileReader
六、InputStream
1.int read()
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。
2.int read(byte[] b)
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。否则以整数形式返回实际读取
的字节数。
3.int read(byte[] b, int off,int len)
将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值 -1。
4.public void close() throws IOException
关闭此输入流并释放与该流关联的所有系统资源。
七、Reader
1.int read()
读取单个字符。作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff)(2个字节的Unicode码),如果已到达流的末尾,则返回 -1
2.int read(char[] cbuf)
将字符读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
3.int read(char[] cbuf,int off,int len)
将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字符。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数。
4.public void close() throws IOException
关闭此输入流并释放与该流关联的所有系统资源。
八、OutputStream & Writer
1.OutputStream 和 Writer 也非常相似:
>void write(int b/int c);
>void write(byte[] b/char[] cbuf);
>void write(byte[] b/char[] buff, int off, int len);
>void flush();
>void close();// 需要先刷新,再关闭此流
2.因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数。
>void write(String str);
>void write(String str, int off, int len);
>FileOutputStream 从文件系统中的某个文件中获得输出字节。FileOutputStream 用于写出非文本数据之类的原始字节流。要写出字符流,需要使用 FileWriter。
九、OutputStream
void write(int b)
将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 即写入0~255范围的。
void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。
void write(byte[] b,int off,int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
public void flush()throws IOException
刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。
public void close() throws IOException
关闭此输出流并释放与该流关联的所有系统资源。
十、Writer
void write(int c)
写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。 即写入0 到 65535 之间的Unicode码。
void write(char[] cbuf)
写入字符数组。
void write(char[] cbuf,int off,int len)
写入字符数组的某一部分。从off开始,写入len个字符
void write(String str)
写入字符串。
void write(String str,int off,int len)
写入字符串的某一部分。
void flush()
刷新该流的缓冲,则立即将它们写入预期目标。
public void close() throws IOException
关闭此输出流并释放与该流关联的所有系统资源。
13-3 节点流(或文件流)
二、写入文件
1.创建流对象,建立数据存放文件
>FileWriter fw = new FileWriter(new >File(“Test.txt”));
2.调用流对象的写入方法,将数据写入流
>fw.write(“atguigu-songhongkang”);
3.关闭流资源,并将流中的数据清空到文件中。
>fw.close();
三、注意点
1.定义文件路径时,注意:可以用“/”或者“\\”。
2.在写入一个文件时,如果使用构造器FileOutputStream(file),则目录下有同名文件将被覆盖。
3.如果使用构造器FileOutputStream(file,true),则目录下的同名文件不会被覆盖,在文件内容末尾追加内容。
4.在读取文件时,必须保证该文件已存在,否则报异常。
5.字节流操作字节,如:.mp3,.avi,.rmvb,mp4,.jpg,.doc,.ppt
6.字符流操作字符,只能操作普通文本文件。最常见的文本文件:.txt,.java,.c,.cpp 等语言的源代码。尤其注意.doc,excel,ppt这些不是文本文件。
13.4 处理流之一:缓冲流
2.缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:
1)BufferedInputStream 和BufferedOutputStream
2)BufferedReader 和 BufferedWriter
3.当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区
4.当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节数组。
5.向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流
6.关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可,关闭最外层流也会相应关闭内层节点流
7.flush()方法的使用:手动将buffer中内容写入文件
8.如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出.
例程:
13.5 处理流之二:转换流
例程:
四、补充:字符编码
1.编码表的由来
计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。这就是编码表。
2.常见的编码表
ASCII:美国标准信息交换码。用一个字节的7位可以表示。
ISO8859-1:拉丁码表。欧洲码表
用一个字节的8位表示。
GB2312:中国的中文编码表。最多两个字节编码所有字符
GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码
Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的
字符码。所有的文字都用两个字节来表示。
UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。
3.Unicode不完美,这里就有三个问题,一个是,我们已经知道,英文字母只用一个字节表示就够了,第二个问题是如何才能区别Unicode和ASCII?计算机怎么知道两个字节表示一个符号,而不是分别表示两个符号呢?第三个,如果和GBK等双字节编码方式一样,用最高位是1或0表示两个字节和一个字节,就少了很多值无法用于表示字符,不够表示所有字符。Unicode在很长一段时间内无法推广,直到互联网的出现。
4.面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
5.Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的Unicode编码是UTF-8和UTF-16。
7.编码:字符串–>字节数组
解码:字节数组–>字符串
8.转换流的编码应用
可以将字符按指定编码格式存储
可以对文本数据按指定编码格式来解读
指定编码表的动作由构造器完成
Unicode符号范围 | UTF-8编码方式 |
---|---|
(十六进制) | (二进制) |
0000 0000-0000 007F | 0xxxxxxx(兼容原来的ASCII) |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
13-6 处理流之三:标准输入、输出流
13-7 处理流之四: 打印流
13.8 处理流之五:数据流(了解)
13-9 处理流之六:对象流
四、谈谈你对java.io.Serializable接口的理解,我们知道它用于序列化,是空方法接口,还有其它认识吗?
1.实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。换句话说,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。不必关心数据在不同机器上如何表示,也不必
关心字节的顺序或者其他任何细节。
2.由于大部分作为参数的类如String、Integer等都实现了java.io.Serializable的接口,也可以利用多态的性质,作为参数使接口更灵活。
13-10 随机存取文件流
四、写入文件内容
例一:
例二:
五、流的基本应用小结
1.流是用来处理数据的。
2.处理数据时,一定要先明确数据源,与数据目的地
3.数据源可以是文件,可以是键盘。
4.数据目的地可以是文件、显示器或者其他设备。
5.而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理、转换处理等。
13-11 NIO.2中Path、Paths、Files类的使用
说明:以上内容整理自尚硅谷B站Java视频