目录
2.2.1java.io.BufferedReader和java.io.InputStreamReader
2.2.2java.io.BufferedWriter和java.io.OutputStreamWriter
前言
这篇文章主要学习了Java的IO流、File和Path等知识。
一、Java IO流基础
1.1什么是IO流
IO易知是input和output,即输入和输出。通过IO流,我们可以将数据在硬盘上读写。
IO流的分类:
- 按照IO流的方向来分:我们把数据去往内存中的过程称为输入,即为读;把数据从内存中取出的过程称为输出,即为写。
- 按照读取数据的方式不同:我们把按照字节来读取数据(即一次一个字节)的方式称为字节流;把按照字符来读取数据的方式称为字符流。
对于字节流和字符流:字节流适用于任何文件,是万能的,包括视频文件、文本文件、图片、声音文件……而字符流仅适用于纯文本文件(能用记事本打开的任何文件)。
1.2Java中的IO流
1.2.1导包
注意:
- 这四个都是抽象类
- 这四个都实现了java.io.Closeable接口,都有.close()方法。用来关闭流。
- 这四个都实现了java.io.Flushable接口,都有.flush()方法。用来刷新流。(用于清空)
- 小tip:java中类名以“Stream”结尾都是字节流,以“Reader/Writer”结尾都是字符流。
1.2.2Java中的流
文件专属 |
|
转换流(将字节流转换成字符流) |
|
缓冲流专属 |
|
数据流专属 |
|
标准输出流 |
|
对象专属流 |
|
File文件类 |
|
二、部分IO流的使用
2.1文件专属
2.1.1java.io.FileInputStream
构造方法:
构造方法名 | 备注 |
---|---|
FileInputStream(String name) | name为文件路径 |
FileInputStream(File file) |
一般方法:
方法名 | 作用 |
int read() | 读取一个字节,返回值为该字节ASCII码;读到文件末尾返回-1 |
int read(byte[] b) | 读b数组长度的字节到b数组中,返回值为读到的字节个数;读到文件末尾返回-1 |
int read(byte[] b, int off, int len) | 从b数组off位置读len长度的字节到b数组中,返回值为读到的字节个数;读到文件末尾返回-1 |
int available() | 返回文件有效的字节数 |
long skip(long n) | 跳过n个字节 |
void close() | 关闭文件输入流 |
实践代码:
文本文档:
运行结果:
1 2 3
4 5
6 7 8
9 1
2 3 4
5 6
7 8 9
由此带上空格共计35个字节,因为数字都是在byte型范围里面。要是我们把其中一个数改一下(*是为了显示更清楚):
运行结果:
255*2
*3*4*
5*6*7
*8*9*
1*2*3
*4*5*
6*7*8
*9
嘿!我们发现变了。其中255占三个字节,每个数字分别占一字节。
2.1.2java.io.FileOutputStream
构造方法:
FileOutputStream(String name) | name为文件路径 |
FileOutputStream(String name, boolean append) | name为文件路径,append为true表示在文件末尾追加;为false表示清空文件内容,重新写入 |
FileOutputStream(File file) | |
FileOutputStream(File file, boolean append) | append为true表示在文件末尾追加;为false表示清空文件内容,重新写入 |
一般方法:
void write(int b) | 将指定字节写入文件中 |
void write(byte[] b) | 将b.length个字节写入文件中 |
void write(byte[] b, int off, int len) | 将b数组off位置开始,len长度的字节写入文件中 |
void flush() | 刷新此输出流并强制写出所有缓冲的输出字节 |
void close() | 关闭文件输出流 |
实践代码:
原本我的文件夹里:
可以看到没有tempFile2文件,但在运行完程序后:
这里就出现了该文件,当然,如果我们的文件本身就存在,我们可以选择在文件末尾添加。
在文件中,就完成了我们刚才的代码。
2.1.3java.io.FileReader
FileReader 文件字符输入流,只能读取普通文本。读取文本内容时,比较方便,快捷。
构造方法:
FileReader(String fileName) | name为文件路径 |
FileReader(File file) |
一般方法:
int read() | 读取一个字符,返回值为该字符ASCII码;读到文件末尾返回-1 |
int read(char[] c) | 读c数组长度的字节到c数组中,返回值为读到的字符个数;读到文件末尾返回-1 |
int read(char[] c, int off, int len) | 从c数组off位置读len长度的字符到c数组中,返回值为读到的字符个数;读到文件末尾返回-1 |
long skip(long n) | 跳过n个字符 |
void close() | 关闭文件输入流 |
实践代码:
继续利用我们刚才创建的tempFile2.
运行结果:
abcd
abHe
llo
Java
!!!a
bcda
bHel
lo J
ava!
!!
2.1.4java.io.FileWriter
FileWriter文件字符输出流。写。只能输出普通文本。在此,我们把tempFile2的内容删除,以便更好查看代码的运行。
构造方法:
FileWriter(String fileName) | name为文件路径 |
FileWriter(String fileName, boolean append) | name为文件路径,append为true表示在文件末尾追加;为false表示清空文件内容,重新写入 |
FileWriter(File file) | |
FileWriter(File file, boolean append) | append为true表示在文件末尾追加;为false表示清空文件内容,重新写入 |
一般方法:
void write(int c) | 将指定字符写入文件中 |
void write(char[] c) | 将c.length个字符写入文件中 |
void write(char[] c, int off, int len) | 将c数组off位置开始,len长度的字符写入文件中 |
void write(String str) | 将字符串写入文件中 |
void write(String str, int off, int len) | 从字符串off位置开始截取len长度的字符串写入文件 |
void flush() | 刷新此输出流并强制写出所有缓冲的输出字符 |
void close() | 关闭文件输出流 |
实践代码:
运行结果:
2.2缓冲流专属和转换流
2.2.1java.io.BufferedReader和java.io.InputStreamReader
BufferedReader带有缓冲区的字符输入流。使用这个流的时候不需要自定义char数组,或者说不需要自定义byte数组。自带缓冲。InputStreamReader字节输入流转字符输入流。
构造方法:
BufferedReader(Reader in) | in为reader对象(可以是reader的实现类) |
一般方法:
int read() | 读取一个字符,返回值为该字符ASCII码;读到文件末尾返回-1 |
int read(char[] c) | 读c数组长度的字节到c数组中,返回值为读到的字符个数;读到文件末尾返回-1 |
String readLine() | 读取文件一行 |
long skip(long n) | 跳过n个字符 |
void close() | 关闭文件输入流 |
实践代码:
运行结果:
这是第一组测试是第一第二测试
更为简洁的,利用转换流上边的代码可以缩写:
2.2.2java.io.BufferedWriter和java.io.OutputStreamWriter
构造方法:
BufferedWriter(Writer out) | out为Writer对象(可以是reader的实现类) |
一般方法:
void write(int c) | 将指定字符写入文件中 |
void write(char[] c, int off, int len) | 将c数组off位置开始,len长度的字符写入文件中 |
void write(String str, int off, int len) | 从字符串off位置开始截取len长度的字符串写入文件 |
void flush() | 刷新此输出流并强制写出所有缓冲的输出字符 |
void close() | 关闭文件输出流 |
实践代码:
运行结果:
2.3标准输出流
2.3.1java.io.PrintStream
构造方法:
PrintStream(File file) | |
PrintStream(OutputStream out) | |
PrintStream(String fileName) | fileName文件地址 |
一般方法:
println(参数类型不定 x) | 输出x带换行 |
print(参数类型不定 x) | 输出x不带换行 |
void flush() | 刷新此输出流并强制写出所有缓冲的输出字符 |
void close() | 关闭流 |
改变流的输出方向System.setOut(PrintStream对象)
实践代码:
哎!我们发现控制台里没有输出,输出到tempFile2文件中了。
运行结果:
三、File类
一个File对象就代表了文件和目录路径名的抽象表示形式。
构造方法:
File(String pathname) | pathname文件/文件夹路径 |
一般方法:
boolean delete() | 删除文件/文件夹 |
boolean exists() | 判断文件/文件夹是否存在 |
File getAbsoluteFile() | 获取文件/文件夹的绝对路径(返回值:File) |
String getName() | 获得文件/文件夹名字 |
String getParent() | 获取文件/文件夹的父文件/文件夹 |
File getParentFile() | 获取文件/文件夹的父文件/文件夹(返回值:File) |
String getPath() | 获取文件/文件夹的路径 |
boolean isDirectory() | 判断该文件/文件夹是不是文件夹 |
isFile() | 判断该文件/文件夹是不是文件 |
isHidden() | 判断该文件/文件夹是否隐藏 |
long lastModified() | 获取文件/文件夹最后一次修改时间 |
long length() | 获取文件大小;获取文件夹里面的文件个数 |
String[] list() | 获取文件夹的文件名字以String[]返回 |
File[] listFiles() | 获取文件夹的文件名字以File[]返回 |
boolean mkdir() | 创建文件/文件夹 |
实践代码:
运行结果:
tempFile3
null
tempFile3
true
false
false
false
81
2024-04-04 15:24:42
而且我们的文件也被创建:
四、Path类
Path表示一个目录名序列,它的后面还可以跟一个文件名。它有绝对路径和相对路径两种形式。以根目录开始的是绝对路径,反之。特别的,Path类是一个抽象类。在IDEA上可以方便快速的创建Path对象。而与之相结合的还有Paths类。
运行结果:
\Users\acton_zhang
pers\zhang\ThreadDemo.java
\bin
\Users\acton_zhang\bin
更多可以学习这篇文章。
学习笔记 如有错误 日后修改(∗ᵒ̶̶̷̀ω˂̶́∗)੭₎₎̊₊♡