什么是IO流
IO流(输入/输出流)是Java中用于处理读取和写入数据的机制。它为用户在程序与文件或网络之间传输数据提供了便利。
Java的IO流主要分为两类:
-
字节流(Byte Stream):以字节为单位进行数据传输,它们是数据传输的基本形式,适用于所有类型的数据,例如字符、数组和图像等等。字节流处理的中心对象是 InputStream 和 OutputStream。
InputStream 抽象类及其常见子类:
- FileInputStream:从本地文件系统中读取字节。
- DataInputStream:二进制流
- ByteArrayInputStream:使用 byte 数组中的数据作为源(内存缓冲区)。
- BufferedInputStream:提供缓冲功能来增加性能。
OutputStream 抽象类及其常见子类:
- FileOutputStream:向本地文件系统中写入数据。
- ByteArrayOutputStream:将数据写入一个 byte 数组,这个缓冲区会随着数据的不断写入而自动增长。
- BufferedOutputStream:提供缓冲功能来增加性能。
-
字符流(Character Stream):以字符为单位进行数据传输,它们是一种更方便的形式,可以直接操作字符串文本,以字符为单位读写,而不用担心字符集编码问题。字符流处理的中心对象是 Reader 和 Writer。
Reader 抽象类及其常见子类:
- FileReader:从本地文件系统中读取字符。
- InputStreamReader:从输入字节流中读取字符。
- BufferedReader:提供缓冲功能来增加性能。
Writer 抽象类及其常见子类:
- FileWriter:向本地文件系统中写入字符。
- OutputStreamWriter:将字符流转换为字节流,通常可以指定字符集。
- BufferedWriter:提供缓冲功能来增加性能。
我们可以通过IO流读取或写入文件、网络数据甚至从设备(如键盘或鼠标)中读取和传输数据。在使用IO流时,需要注意必要的异常处理,确保程序的稳定性和安全性。同时,在处理大量数据时,可以使用缓冲区来减少频繁的读写硬盘/网络IO操作,提高程序的效率。
什么是File类
File 类是 Java 用于操作文件和目录的类。它提供了一组用于创建、删除、重命名、检查、遍历目录等文件相关操作的方法,可以访问计算机上的本地文件系统。
File 类有以下常见构造方法:
// 创建 File 对象
File file = new File("文件路径");
// 根据父路径和子路径字符串创建 File 对象
File file1 = new File("父路径", "子路径");
// 根据父级 File 和子路径字符串创建 File 对象
File file2 = new File("父文件对象", "子路径");
File 类的常用方法及作用如下:
exists()
:判断该 File 对象所代表的文件或目录是否存在。getName()
:返回该 File 对象表示的文件或目录名称。isFile()
:判断该 File 对象是否表示一个文件。isDirectory()
:判断该 File 对象是否代表一个目录。mkdir()
:创建由该 File 对象代表的目录。renameTo(File dest)
:更改该 File 对象所代表的文件或目录的名称(或移动文件)。list()
:返回由该 File 对象所代表的目录中所有文件和目录的名称字符串数组。length()
:返回该 File 对象表示的文件的大小,单位为字节。
例如,以下代码将创建一个名为“myfile.txt”的文件,并检查该文件是否被创建:
File file = new File("myfile.txt");
try {
if (file.createNewFile()) {
System.out.println("文件已创建");
} else {
System.out.println("文件已存在");
}
} catch (IOException e) {
e.printStackTrace();
}
在以上示例中,我们使用 createNewFile()
方法来创建文件。文件的创建必须在 try-catch 语句块中进行,以处理可能出现的异常情况。如果文件创建成功,则输出 “文件已创建”。否则,输出 “文件已存在”。
java寻找路径的方法
在 Java 中查找文件路径的方法有很多,以下是比较常用的几种:
- 使用绝对路径:使用文件系统中的完整路径来指定文件位置。例如:
File file = new File("C:\\Users\\User\\Documents\\file.txt");
- 使用相对路径:相对于当前工作目录或类路径来指定文件位置。例如:
File file1 = new File("file.txt"); // 当前工作目录下的文件
File file2 = new File("src/main/resources/config.properties"); // 类路径下的资源文件
- 使用 classpath:将文件打包到项目的 JAR 包中,并从类路径中查找文件。例如:
InputStream input = getClass().getResourceAsStream("/config.properties");
其中 /
表示类路径的根目录。
- 使用文件选择器:让用户自己选择需要访问的文件或文件夹。例如,使用
JFileChooser
类创建一个弹出式对话框,显示文件选择器,使用户可以选择文件或文件夹。
JFileChooser chooser = new JFileChooser();
int result = chooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
// 处理文件对象
}
以上是常见的一些查找文件路径的方法,在选择具体的方法时要考虑实际场景需求及对应的代码实现难易程度等因素。
…的使用(两个点)
在文件系统中,..
表示当前目录的父级目录,例如:
/usr/share/doc/..
表示/usr/share
目录。/usr/share/../bin
表示/usr/bin
目录。C:\Windows\System32\..\Program Files
表示C:\Windows\Program Files
目录(在 Windows 中,..
确定为上级目录)。
可以使用 File
类的 getCanonicalPath()
方法来解析 ..
,从而确定文件路径。例如:
try {
File file = new File("/usr/share/doc/../bin");
String path = file.getCanonicalPath();
System.out.println(path); // 输出 /usr/bin
} catch (IOException e) {
e.printStackTrace();
}
在以上示例中,我们创建一个代表 /usr/share/doc/../bin
路径的文件对象,并通过调用 getCanonicalPath()
方法获取其规范路径。该方法会处理路径中的 ..
,并返回一个和实际路径相同的字符串 “/usr/bin”。
需要注意的是,getCanonicalPath()
方法可能会抛出 IOException
异常,因此需要编写适当的异常处理代码。
创建一个a.txt
写入
结果
读取
read和input区别
在Java IO中,InputStream
与Reader
是两种不同的输入流类。其中,InputStream
和其子类用于读取字节数据,而Reader
及其子类则用于按字符读取数据。
在InputStream
类中,read()
方法以字节为单位从输入流读取数据,并返回所读取的字节数。当没有更多数据可读时,该方法返回-1。对于BufferedInputStream
和DataInputStream
等输入流类来说,它们提供了一些缓存机制和数据类型转换等功能,更加方便使用字节流进行处理。
在Reader
类中,read()
方法以字符为单位从输入流中读取数据,并返回所读取的字符数。当没有更多数据可读时,该方法返回-1。与注意到,对于BufferedReader
和InputStreamReader
等字符输入流类来说,它们也提供了缓存和编码转换等功能。
因此,如果需要读取文本文件或者其他以字符为单位编写的数据,例如配置文件等,应该使用Reader
类及其相关的类库读取。如果要读取二进制文件(如图片、音频、视频等),则应该使用InputStream
类。