Java中的IO流是指输入/输出流(Input/Output Stream)的操作。IO流用于处理文件的输入和输出,以及网络通信等输入输出操作。Java IO流分为字节流和字符流两种类型,其中字节流用于处理二进制数据,而字符流用于处理文本数据。
Java中的IO流分为四种类型:
-
字节流(byte stream):用于读写二进制数据,如InputStream和OutputStream。
-
字符流(character stream):用于读写文本数据,如Reader和Writer。
-
缓冲流(buffered stream):用于提高IO性能的缓冲区,如BufferedReader和BufferedWriter。
-
对象流(object stream):用于读写Java对象,如ObjectInputStream和ObjectOutputStream。
Java IO流的基本操作包括打开流、写入数据、读取数据和关闭流等,具体使用方法可以参考Java官方文档或相关教程。
File类
File类是Java IO包中的一个类,用于处理与文件系统的交互。它提供了一种跨平台的方式来处理文件和目录。
File类可以用来创建、删除、重命名和获取文件或目录的信息。它还可以用来查找文件和目录,以及遍历目录和文件。此外,File类还可以检查文件或目录是否存在,并确定文件或目录的大小、最后修改时间等属性信息。
在Java中,File类很常用,例如在文件复制、文件读写、文件移动、文件过滤等情况下都需要用到File类。
File类常用方法
下面列举了一些常用的Java File类的方法:
1.构造方法:
File(String pathname)
:根据给定的路径名创建一个新File实例。File(String parent, String child)
:根据给定的父路径和子路径名创建一个新File实例。File(File parent, String child)
:根据给定的父路径和子路径名创建一个新File实例。
2.获取文件信息:
getName()
:返回文件或目录的名称。getPath()
:返回文件或目录的路径。getAbsolutePath()
:返回文件或目录的绝对路径。getParent()
:返回文件或目录的父目录路径。isFile()
:判断当前File实例是否为一个文件,是返回true,否则返回false。isDirectory()
:判断当前File实例是否为一个目录,是返回true,否则返回false。length()
:返回文件的大小。
3.操作文件:
exists()
:判断当前File实例对应的文件或目录是否存在,存在返回true,否则返回false。createNewFile()
:创建一个新文件。mkdir()
:创建一个目录。mkdirs()
:创建一个多级目录。delete()
:删除当前File实例对应的文件或目录。
4.遍历目录:
list()
:返回当前目录下所有文件和目录的名称数组。listFiles()
:返回当前目录下所有文件和目录对应的File对象数组。list(FilenameFilter filter)
:返回当前目录下符合指定过滤器条件的所有文件和目录的名称数组。listFiles(FileFilter filter)
:返回当前目录下符合指定过滤器条件的所有文件和目录对应的File对象数组。
这些方法仅为常用方法的一部分,File类还有很多其他方法,可以根据具体需要进行调用。
字节输出/输入流
Java字节输出流和输入流是Java IO API中的两个基本类,用于读取和写入二进制数据。这两个类都是抽象类,通常使用子类来实现具体的功能。
字节输出流用于向输出设备(如文件、网络套接字等)写入二进制数据。常用的字节输出流包括FileOutputStream、ByteArrayOutputStream、PipedOutputStream等。
常用的字节输出流方法包括:
- write(int b):将一个字节写入输出流。
- write(byte[] b):将b中的所有字节写入输出流。
- write(byte[] b, int off, int len):将b中从off开始的len个字节写入输出流。
- flush():强制清空缓冲区并输出所有数据。
- close():关闭输出流。
字节输入流用于从输入设备(如文件、网络套接字等)读取二进制数据。常用的字节输入流包括FileInputStream、ByteArrayInputStream、PipedInputStream等。
常用的字节输入流方法包括:
- read():读取一个字节并返回,如果到达输入流的末尾,则返回-1。
- read(byte[] b):读取尽可能多的字节并将它们存储在给定的字节数组中,返回读取的字节数,如果到达输入流的末尾,则返回-1。
- read(byte[] b, int off, int len):从输入流中读取len个字节到给定的数组中,从数组中的off位置开始存储,返回读取的字节数,如果到达输入流的末尾,则返回-1。
- available():返回输入流中可以读取的字节数。
- close():关闭输入流。
需要注意的是,Java字节输入流和输出流会自动进行缓冲,以提高效率。当关闭流或调用flush()方法时,缓冲区中的数据会被写入目标设备或从输入流中读取。在编写程序时,需要根据需要手动设置缓冲区大小,以充分利用缓冲机制。
文件复制
Java文件复制可以通过字节输入/输出流实现。以下是一个简单的示例代码:
import java.io.*;
public class FileCopyExample {
public static void main(String[] args) {
File sourceFile = new File("sourceFile.txt");
File targetFile = new File("targetFile.txt");
try (
InputStream in = new FileInputStream(sourceFile);
OutputStream out = new FileOutputStream(targetFile);
) {
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
System.out.println("File Copied Successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上代码将源文件“sourceFile.txt”复制到目标文件“targetFile.txt”,使用了try-with-resources语句确保流的正确关闭。在循环读取和写入文件内容时,使用了缓冲区的方法,可以提高文件复制效率。
字符输入/输出流
Java提供了两种类型的字符流:字符输入流和字符输出流。字符输入流用于读取文本文件中的字符,而字符输出流用于将字符写入文本文件中。
Java字符输入流的主要类是Reader
,它是一个抽象类,不能直接使用,需要使用其子类,例如FileReader
,它可以从指定文件中读取字符。
Java字符输出流的主要类是Writer
,它也是一个抽象类,不能直接使用,需要使用其子类,例如FileWriter
,它可以将字符写入指定的文件中。
以下是一个简单的Java字符输入/输出流示例,从一个文本文件中读取字符并将它们写入另一个文本文件中:
import java.io.*;
public class CharStreamExample {
public static void main(String[] args) {
File inputFile = new File("input.txt");
File outputFile = new File("output.txt");
try (
FileReader reader = new FileReader(inputFile);
FileWriter writer = new FileWriter(outputFile);
) {
int c;
while ((c = reader.read()) != -1) {
writer.write(c);
}
System.out.println("Characters Copied Successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个示例中,FileReader
类用于读取input.txt
文件,而FileWriter
类用于将字符写入output.txt
文件。使用while
循环从输入文件中读取每个字符,然后将其写入输出文件中。最后,输出一条消息表明字符已成功复制。
字符缓冲输入/输出流
Java提供了两种字符缓冲输入/输出流:BufferedReader和BufferedWriter。
BufferedReader: 用于读取输入流中的字符数据。它在Java中的定义如下:
public class BufferedReader extends Reader {
...
}
BufferedWriter: 用于写入输出流中的字符数据。它在Java中的定义如下:
public class BufferedWriter extends Writer {
...
}
以下是使用BufferedReader和BufferedWriter读取和写入文件的示例代码:
import java.io.*;
public class Main {
public static void main(String[] args) {
String fileName = "input.txt";
try {
// 创建文件输入流
FileReader fileReader = new FileReader(fileName);
// 创建缓冲输入流
BufferedReader bufferedReader = new BufferedReader(fileReader);
// 创建文件输出流
FileWriter fileWriter = new FileWriter("output.txt");
// 创建缓冲输出流
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
// 读取文件内容并写入新文件
String line;
while ((line = bufferedReader.readLine()) != null) {
bufferedWriter.write(line);
bufferedWriter.newLine();
}
// 关闭输入输出流
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代码中,首先我们定义了要读取的文件名。然后,我们创建一个文件输入流,将其传递给一个缓冲输入流。接下来,我们创建一个新的文件输出流和一个缓冲输出流,以便我们可以将读取的文件内容写入新文件。最后,我们读取文件内容,写入新文件,然后关闭输入输出流。
请注意,我们使用了bufferedReader.readLine()方法来读取文件内容。此方法返回文件中的一行文本,并在读取完每行文本后自动将文件指针移动到下一行的开头。因此,我们可以使用bufferedWriter.write()方法来将读取的文本写入新文件,并使用bufferedWriter.newLine()方法将文件指针移动到新的一行。
在写入完文件后,我们关闭输入输出流以释放资源。