File类
1.File类
File 是 Java 中用于操作文件和目录的类。它提供了一组方法来创建、删除、重命名、检查文件/目录是否存在等操作。
以下是 File 类的常见用法:
1.创建文件或目录:
- 使用
File file = new File
(“路径”) 创建一个 File 对象,可以是文件或目录的路径。 - 使用
file.createNewFile()
创建一个新文件。 - 使用
file.mkdir()
创建一个新目录。 mkdirs()
: 创建文件目录。 如果上层文件目录不存在, 一并创建。
2.文件/目录信息获取:
- 使用
file.exists()
检查文件或目录是否存在。 - 使用
file.getName()
获取文件或目录的名称。 - 使用
file.getAbsolutePath()
获取文件或目录的绝对路径。 - 使用
file.isDirectory()
和file.isFile()
分别检查文件或目录是目录还是文件。 - 使用
file.length()
获取文件的大小(字节数)。
3.文件/目录操作:
- 使用
file.delete()
删除文件或目录。 - 使用
file.renameTo(newName)
重命名文件或目录。
4.目录遍历:
- 使用
file.listFiles()
获取目录下的文件和子目录列表。
5.路径中的每级目录之间用一个路径分隔符隔开。
- windows和DOS系统默认使用“\”来表示
- UNIX和URL使用“/”来表示
- Java程序支持跨平台运行,因此路径分隔符要慎用。
为了解决这个隐患, File类提供了一个常量:public static final String separator。根据操作系统,动态的提供分隔符。
File file1 = new File("d:\\lxs\\info.txt");
File file2 = new File("d:" + File.separator + "lxs" + File.separator + "info.txt");
File file3 = new File("d:/lxs");
请注意,File 类只是用于操作文件和目录的元数据,而不涉及实际的文件内容读取或写入。如果需要读取或写入文件内容,可以使用 FileInputStream
、FileOutputStream
、BufferedReader
、BufferedWriter
等其他类。
2.IO流原理及流的分类
1.java IO原理
- I/O是Input/Output的缩写, I/O技术是非常实用的技术, 用于处理设备之间的数据传输。 如读/写文件,网络通讯等。
- Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。
- java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
- 输入input: 读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
- 输出output: 将程序(内存)数据输出到磁盘、光盘等存储设备中。
BIO,NIO,AIO
BIO、NIO和AIO是Java中用于进行I/O操作的不同编程模型和API。
-
BIO(Blocking I/O):BIO是最传统的I/O模型,它基于阻塞式I/O操作。在BIO中,每个I/O操作都会阻塞当前线程,直到该操作完成。当有多个客户端连接时,需要为每个客户端分配一个独立的线程来处理I/O操作,这可能导致线程数量增加,资源消耗也相应增加。
-
NIO(Non-blocking I/O):NIO引入了非阻塞I/O概念,通过使用选择器(Selector)和通道(Channel)来实现。在NIO中,一个单独的线程(通常称为事件循环线程)可以处理多个客户端连接,提高了系统资源的利用率。NIO中的操作是非阻塞的,可以通过轮询机制来判断是否有可用的数据或者连接就绪。
-
AIO(Asynchronous I/O):AIO是Java 7引入的一种新的异步I/O模型,也称为NIO.2。AIO允许应用程序执行I/O操作而无需等待其完成,当I/O操作完成后,系统会通知应用程序。AIO通过回调函数的方式来处理I/O操作完成的通知,从而实现异步非阻塞的I/O操作。
选择何种I/O模型取决于具体的应用场景和需求。BIO适用于连接数较少且吞吐量要求不高的场景;NIO适用于连接数多且需要高并发处理的场景;AIO适用于高并发性能要求较高的场景。
IO流的分类
- 按操作数据单位不同分为: 字节流(8 bit),字符流
- 按数据流的流向不同分为: 输入流,输出流
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
1. 字节流
字节流(Byte Stream)是 Java I/O 中用于处理二进制数据的输入输出流。它以字节为单位进行读取和写入操作。
在 Java 中,字节流主要有两个基本抽象类:InputStream
和 OutputStream
。这些类提供了一组用于读取和写入字节的方法。
常见的字节流类包括:
1.FileInputStream
和 FileOutputStream
:用于从文件中读取和写入字节流。
2.ByteArrayInputStream
和 ByteArrayOutputStream
:用于从内存中读取和写入字节数组。
3.BufferedInputStream
和 BufferedOutputStream
:提供了缓冲功能,加快了读写操作的效率。
4.DataInputStream
和 DataOutputStream
:提供了对基本数据类型(例如 int、double、boolean 等)的读写操作。
使用字节流的一般步骤如下:
1.创建字节输入流或字节输出流对象,可以选择合适的具体实现类。
2.打开输入源或输出目标,例如文件、数组等。
3.使用流对象的相关方法进行读取或写入操作,例如使用 read() 方法读取字节数据,或使用 write() 方法写入字节数据。
4.在不再需要流时,关闭流并释放资源,通常使用 close() 方法。
2.字符流
字符流(Character Stream)是 Java I/O 中用于处理文本数据的输入输出流。它以字符为单位进行读取和写入操作。
在 Java 中,字符流主要有两个基本抽象类:Reader 和 Writer。这些类提供了一组用于读取和写入字符的方法。
常见的字符流类包括:
1.FileReader
和 FileWriter
:用于从文件中读取和写入字符流。
2.BufferedReader
和 BufferedWriter
:提供了缓冲功能,加快了读写操作的效率。
3.InputStreamReader
和 OutputStreamWriter
:将字节流转换为字符流的桥梁类,可以指定字符编码。
4.StringReader
和 StringWriter
:用于读写字符串中的字符数据。
使用字符流的一般步骤如下:
1.创建字符输入流或字符输出流对象,可以选择合适的具体实现类。
2.打开输入源或输出目标,例如文件、字符串等。
3.使用流对象的相关方法进行读取或写入操作,例如使用 read()
方法读取字符数据,或使用 write()
方法写入字符数据。
4.在不再需要流时,关闭流并释放资源,通常使用 close()
方法。
字符流适用于处理文本数据,能够正确地处理字符编码和换行符等特殊字符。相比于字节流,字符流更方便有效地处理文本内容。
3.缓冲流
缓冲流(Buffered Stream)是 Java I/O 中的一种流,它能够提高读取和写入数据的效率。缓冲流通过在内存中创建一个缓冲区(Buffer),将数据先存储在缓冲区中,然后批量地进行读取或写入操作,减少了频繁的磁盘或网络访问,从而提高了性能。
在 Java 中,常见的缓冲流类包括:
1.BufferedReader
和 BufferedWriter
:用于对字符流实现缓冲操作,提供了更快速的字符读取和写入方法。
2.BufferedInputStream
和 BufferedOutputStream
:用于对字节流实现缓冲操作,提供了更快速的字节读取和写入方法。
使用缓冲流的一般步骤如下:
1.创建需要进行缓冲操作的输入流或输出流对象。
2.将创建的输入流或输出流对象作为参数传递给相应的缓冲流类的构造方法,创建缓冲流对象。
3.使用缓冲流对象进行读取或写入操作,例如使用 read() 方法读取数据,或使用 write() 方法写入数据。
4.在不再需要流时,记得关闭缓冲流对象,这会自动关闭其底层的输入流或输出流。
4.转换流
- 转换流提供了在字节流和字符流之间的转换
- 字节流中的数据都是字符时,转成字符流操作更高效。
- 很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能
- InputStreamReader
- 实现将字节的输入流按指定字符集转换为字符的输入流。
- 需要和InputStream“套接”。
- 构造器
- public InputStreamReader(InputStream in)
- public InputSreamReader(InputStream in,String charsetName) 如: Reader isr = new InputStreamReader(System.in,”gbk”);
- OutputStreamWriter
- 实现将字符的输出流按指定字符集转换为字节的输出流。
- 需要和OutputStream“套接”。
- 构造器
- public OutputStreamWriter(OutputStream out)
- public OutputSreamWriter(OutputStream out,String charsetName)
@Test
public void test1() throws Exception {
InputStream in = new FileInputStream("gbk.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "gbk"));
System.out.println(reader.readLine());
}