javaio流总结
File类介绍
1.File类的理解:
- file类的一个对象,代表了一个文件或者文件夹
- file类声明在java.io包下
- file类涉及到文件或者目录的创建,删除,重命名,查看等方法,并未涉及到写入或者读取文件内容的操作,如果需要写入或者读取需要通过io流来完成
- 后续file类的对象常作为参数传递到流的构造器中,指明读取或写入的终点
2.File类的实例化
-
常用的构造器
File(String filePath)
File(String parentPath,String childPath)
File(File parentFile,String childPath)
-
路径的分类
相对路径:相较于某个路径下,知名的路径
绝对路径:包含盘符在内的文件或者文件夹路径
-
路径分隔符
windows和dos系统默认使用"\"来表示
unix和url使用"/"来表示
3.File类中的一些常用方法
public String getAbsolutePath()//获取绝对路径
public String getPath()//获取路径
public String getName()//获取名称
public string getParent()//获取上层文件目录路径,若无返回null
public long length()//获取文件长度(即:字节数),不能获取目录的长度
public long lastModified()//获取最后一次修改的时间,毫秒值
public String[] list()//获取指定目录下的所有文件或者文件目录的名称数组
public boolean renameTo(File dest)//把文件重命名为指定的文件路径
public boolean isDirectory()//判断是否是文件夹
public boolean isFile()//判断是否是文件
public boolean exists()//判断是否存在
public boolean canRead()//判断是否可读
public boolean canWrite()//判断是否可写
public boolean isHidden()//判断是否隐藏
public boolean createNewFile()//创建文件
public boolean mkdirs()//创建目录
public boolean delete()//删除文件或者目录,如果是删除目录,那么目录下不能有文件或者文件夹
IO流介绍
io流是什么:i代表input输入,o代表output输出
输入输出流的意思:Java程序进行数据传输的管道,这个流就是管道的意思
- I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读写文件,网络通信等。
- java程序中,对于数据的输入/输出操作以流stream的方式进行
- java.io包下提供了各种流类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据
输入:读取外部数据(磁盘,光盘等存储设备的数据)到程序(内存)中
输出:将程序(内存)的数据输出到磁盘,光盘等存储设备中
我们应该处在程序中来判断这是输入还是输出,不应该从内存的位置来看
io流的分类:
- 按操作数据单位不同分为:字节流(8bit)(非文本的数据都主要用字节流来处理)和字符流(16bit)(文本数据主要用字符流来处理)
- 按数据流的流向不同可以分为:输入流和输出流
- 按流的角色不同分为:节点流和处理流
下面来看具体的一个图
主要解释一下节点流和处理流
节点流就相当于直接用一根管道把数据和程序连接起来,而处理流就是在这个管道的上面再加上一个管道,可以加速数据的传输,处理流可以多次叠加
java的Io流共涉及到40多个类,实际上非常规则都是,都是从下面这四个基类派生的,这些子类名称都是父类名称作为后缀的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ma27rhF4-1604632941624)(C:\Users\24239\Desktop\数据库截图\屏幕截图 2020-11-05 092026.png)]
下面来看下io流的一个体系
在这上面中处了访问文件的四个流是节点流之外,它以下的所有流都是处理流,其中蓝色表示的流是主要用到的流
当我们看到一个流时,应该马上就能知道它是出于什么流,我们主要通过流的后面部分来判断这是一个什么流。
FileReader流和FileWriter流的操作
我们可以通过FileReader来读取文件,通过FileWriter来写入文件,结合两种可以进行文件的复制,但是不能用来处理图片,下面通过代码来看下
public class FileReaderWriterTest {
private FileReader filereader;
//单元测试Test,这个也是可以运行的,和Main方法中的相对路径的不同
//单元测试中的相对路径是基于Module的
//Main方法中的相对路径是基于Project的
@Test
//throws没有try catch finally 好用
public void fileReaderTest01() {
//为了保证流资源一定可以执行关闭操作,需要使用try-catch-finally
try {
//这个相对路径是较于当前Module中的(io流)
//1、实例化File对象,指明我们要操作的文件
//读入的文件一定要存在,不然会出现错误
File file = new File("hello.txt");
//2、提供具体的流,流的实例化
filereader = new FileReader(file);
//3、数据的读入
//read():返回读入的一个字符,如果达到末尾,返回-1
//字符char是可以自动转换成为int的
//方式一
/*int data = filereader.read();//data返回的是-1表示文件已经读完
while (data != -1) {
System.out.print((char) data);
data = filereader.read();
}*/
//方式二,语法上的修改
int data1;
while ((data1 = filereader.read()) != -1){
System.out.print((char)data1);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4、流的关闭操作
try {
filereader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//对read()操作升级,使用read的重载方法
@Test
public void FileReaderTest02(){
FileReader f1 = null;
try {
//File类的实例化
File file = new File("hello.txt");
//FileReader流的实例化
f1 = new FileReader(file);
//读取的操作
//read(char[] cbuf):返回每次读入cbuf数组中的字符个数,达到文件末尾返回-1
char[] cbuffer = new char[1024];
int data ;
while ((data = f1.read(cbuffer)) != -1){
//方式一
// for (int i = 0; i < cbuffer.length; i++) {
// System.out.print(cbuffer[i]);
// }这样写是有问题的,当最后读取的字符不够五个时,依然是输出五个字符,因为它是采用填充式的
// ,不够的字符依然采用上一次没有被覆盖的字符
//正确的写法
for (int i = 0; i < data; i++) {
System.out.print(cbuffer[i]);
}
//方式二
// String str = new String(cbuffer);
// System.out.println(str);
// 这种错误和方式一中的错误是一样的,都会多输出
//正确方式
//这个构造器就是输出你输入进来的字符个数,
/*String str = new String(cbuffer,0,data);
System.out.println(str);*/
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(f1 != null){
try {
//资源的关闭
f1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//从内存中写出数据到硬盘文件中
/*
* 说明
* 输出操作,对应的File可以不存在,如果不存在,在输出地过程中会自动地创建
* 如果存在,想要接着写,就要在创建FileWriter流的时候,进行说明
* fw = new FileWrite