JavaEE Elementary Lesson 2: File Operation and IO

.Swiss 2023-01-25 20:30:46 阅读数:391

javaeeelementarylessonfileoperation

欢迎来到javaeePreliminary stage of the second class,这节课我会带大家了解文件的概念和java中如何操作文件.

1.了解文件

1.1文件概念

狭义上来讲,When we are in the hard disk data storage,肯定不存所有数据为一个整体,Because the data is classified.我们往往会把这些数据分成不同的单位来保存,This unit is the file.
Broad sense…
在linux上,There has been a word,叫:“一切皆文件”.什么意思呢?linux操作系统为了更好的管理软硬件资源,linux将我们的硬件设备也抽象成了文件,For example, our keyboard:We call the input data typing,计算机从键盘获取我们敲的信息叫做读取数据.

1.2文件存储

随着计算机的发展,The more we want to store the file,The file storage will become a problem,为了更好的管理文件,文件夹As a special file was born,Through the folder will be our file to树状结构的形式组织起来,这是一种按照层级结构进行组织
的方法.

这里是引用

1.3文件路径

Solved the problem of the file to save,To solve the problem of file take.In such a way to store,我们要怎么找到我们想要的文件呢?这就需要一条能找到文件的路,This is the path to the file.
The file path is divided into two kinds of,一种叫绝对路径,另一种叫相对路径.

绝对路径:
绝对路径主要是从根目录出发(windowsOn the system from此电脑出发)通过一层一层的向内寻找文件,例如:
C:\Program Files\Git
C:是盘符

相对路径:
To say relative path,Must be clear 基准路径/工作路径 .
What is a benchmark path?举个例子:
在这里插入图片描述
Under this picture,小刚和小王都是从不同的基准出发找超市的.Xiao gang is relatively intersectionA的角度,But wang is relative crossingB.They give different answers,But the destination is the same.Relative paths of the relative is相对基准路径.So to find relative path,The benchmark is very important.

2.Java中的文件操作(文件系统操作)

该节主要介绍文件系统的操作,Such as file delete etc,Don't involve file read and write.

2.1File类

FileClass as wejava文件操作的核心类,There are many ways of its methods:

构造方法
在这里插入图片描述
其他常用方法:
值类型 方法签名 说明
String getParent()
返回 File 对象的父目录文件路径
String getName()
返回 FIle 对象的纯文件名称
String getPath()
返回 File 对象的文件路径,根据构造方法的参数是相对还是绝对决定
String getAbsolutePath()
返回 File 对象的绝对路径
String getCanonicalPath()
返回 File 对象的修饰过的绝对路径
boolean exists()
判断 File 对象描述的文件是否真实存在
boolean isDirectory()
判断 File 对象代表的文件是否是一个目录
boolean isFile()
判断 File 对象代表的文件是否是一个普通文件
boolean createNewFile()
根据 File 对象,自动创建一个空文件.成功创建后返回 true
boolean delete()
根据 File 对象,删除该文件.成功删除后返回 true
void deleteOnExit()
根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行
String[] list()
返回 File 对象代表的目录下的所有文件名
File[] listFiles()
返回 File 对象代表的目录下的所有文件,以 File 对象
表示

boolean mkdir()
创建 File 对象代表的目录
boolean mkdirs()
创建 File 对象代表的目录,如果必要,会创建中间目录
boolean renameTo(File dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操作
boolean canRead()
判断用户是否对文件有可读权限
boolean canWrite()
判断用户是否对文件有可写权限

2.1.1方法实践

1.获取File对象路径:

public void getPath() throws IOException {

//创建File实例,传入文件路径.Notice that the file isn't really exist
File file=new File("D:/IO/test.txt");
System.out.println("文件名称:"+file.getName());
System.out.println("父路径:"+file.getParent());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("文件路径:"+file.getPath());
System.out.println("修饰过的绝对路径:"+file.getCanonicalPath());
}

结果:
在这里插入图片描述

2.Judge file and create a delete:

public void judgeFile() throws IOException {

File file=new File("./test.txt");
System.out.println("判断文件是否存在"+file.exists());
System.out.println("判断file是不是文件"+file.isFile());
System.out.println("判断file是不是目录"+file.isDirectory());
System.out.println("创建文件:");
file.createNewFile();
System.out.println("创建成功,再次判断:");
System.out.println("判断文件是否存在"+file.exists());
System.out.println("判断file是不是文件"+file.isFile());
System.out.println("判断file是不是目录"+file.isDirectory());
System.out.println("删除文件:");
file.delete();
System.out.println("删除成功,再次判断:");
System.out.println("判断文件是否存在"+file.exists());
System.out.println("判断file是不是文件"+file.isFile());
System.out.println("判断file是不是目录"+file.isDirectory());
}

在这里插入图片描述

剩下的方法大家可以自己尝试

3.Java的文件操作(文件读写操作)

介绍之前,We first have to understand a lowstream.

这里是引用
流,顾名思义,Is the water.
If the change of water into the data,So the water is called the input stream,Water is called an output stream.
也就是数据流,java标准库在“流”(字符流和字节流–基本单位不同)这概念的基础上提供了一组类,Help us to read and write files.

3.1字节流

重要:这里的输入输出是相对于内存来说,From the file into memory called input,Whereas for the output.

在这里插入图片描述
The parent class is an abstract class,The implementation also depends on the subclass,Here only introduce the seeds.

常用方法:

InputStream:
int read()
读取一个字节的数据,返回 -1 代表已经完全读完了
int read(byte[] b)
最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了
int read(byte[] b,int off, int len)
最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
void close()
关闭字节流
—————————————
FileInputStream的构造方法:
FileInputStream(File file)
利用 File 构造文件输入流
FileInputStream(String name)
利用文件路径构造文件输入流
————————————————————————————
OutputStream:
void write(int b)
写入要给字节的数据
void write(byte[] b)
将 b 这个字符数组中的数据全部写入 os(缩写) 中
int write(byte[] b, int off,int len)
将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
void close()
关闭字节流
void flush()
重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,This area is generally referred to as缓冲区.但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中.需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中
——————————————
FileOutputStream的构造方法:
同FileInputStream

3.1.1方法实践

先在与srcAt the same level in the directory to create a.txt文件,Next, speaking, reading and writing in the file, for example.

这里是引用

read方法测试

public static void readDemo() throws IOException {

InputStream ips=new FileInputStream("./test.txt");
//read()测试 一次读取一个字节
// int res=0;
// while((res= ips.read())!=-1){

// System.out.print(res+" ");
// }
//read(byte[] bytes)测试 输出型参数 一次读取一个字节数组的大小
byte[] bytes=new byte[1024];
int len=0;
while((len=ips.read(bytes))!=-1){

for (int i = 0; i < len; i++) {

System.out.printf("%c", bytes[i]);
}
}
ips.close();
}

可以发现这样读取是很麻烦的,我们还有更简单的方法,通过Scanner获取:

 InputStream ips=new FileInputStream("./test.txt");
Scanner scanner=new Scanner(ips);
while(scanner.hasNext()){

System.out.println(scanner.next());
}
ips.close();

write方法测试:

 public static void writeDemo() throws IOException {

OutputStream ops=new FileOutputStream("./test.txt");
String ss="Java Python C++";
for(int i=0;i<ss.length();i++){

ops.write(ss.charAt(i));
}
ops.close();
}

这里是引用

重要:如果你发现write没有及时将你的内容写入文件,Is likely to be without youflush操作!
flush或者程序运行结束都会将缓冲区内容全部写入

可以发现这样输出也不太方便,这样就可以采用PrintWriter完成输出操作:

 OutputStream ops = new FileOutputStream("./test.txt");
PrintWriter printWriter=new PrintWriter(ops);
printWriter.print("金牌讲师");
printWriter.println(1);
printWriter.close();
ops.close();

3.1.2 close()方法- -重要

观察上述代码,我们发现如果程序中间出现问题,Most likely lead to can't performclose方法.一般我们自己练习关不关闭也没什么问题,但是如果再服务器上出现这种问题,就会存在风险.因为每次打开文件都会消耗资源(文件描述符表),只开不关就会导致文件资源泄漏问题.
So we need a stableclose方式,We learned from here can be usedtry-finally处理

public static void writeDemo() throws IOException {

OutputStream ops= null;
try {

ops = new FileOutputStream("./test.txt");
String ss="Java Python C++";
for(int i=0;i<ss.length();i++){

ops.write(ss.charAt(i));
}
} catch (FileNotFoundException e) {

throw new RuntimeException(e);
} catch (IOException e) {

throw new RuntimeException(e);
} finally {

ops.close();
}
}

This doesn't seem very beautiful,那么也可以将需要关闭的资源防止try()中,Multiple resources with;分隔:
它会自动帮我们关闭资源的.

public static void writeDemo() throws IOException {

try(OutputStream ops = new FileOutputStream("./test.txt")) {

String ss="Java Python C++";
for(int i=0;i<ss.length();i++){

ops.write(ss.charAt(i));
}
} catch (FileNotFoundException e) {

throw new RuntimeException(e);
} catch (IOException e) {

throw new RuntimeException(e);
}
}

3.2字符流

字符流和字节流的用法大同小异,What methods are the same
简单演示:

static void readerDemo() throws IOException {

Reader reader=new FileReader("./test.txt");
char[] chars=new char[1024];
int len = 0;
while((len = reader.read(chars))!=-1){

for(int i=0;i<len;i++){

System.out.print(chars[i]);
}
}
reader.close();
}

结尾

At the end of the second class,下一节课将进入网络原理的学习,Also please everybody many concerns praise,Or subscribe to my column!

版权声明:本文为[.Swiss]所创,转载请带上原文链接,感谢。 https://qdmana.com/2023/025/202301251918458127.html