Java介绍文件的几种方式

Java是一种流行的编程语言,开发者经常需要处理很多文件,如读取或写入文件内容等。Java的文件I/O(Input/Output,输入输出)类库提供了很多API和工具类来操作文件。本文将介绍Java中常用的文件操作方式,包括使用File类、字节流、字符流以及NIO(New I/O)等,以及它们的方法和应用场景。

### 使用File类

Java的File类提供了一种基于文件路径的抽象,可以用来操作文件和目录。File类提供了如下常用方法:

```java

public boolean createNewFile() throws IOException:创建一个新文件,如果文件存在则返回false

public boolean delete():删除文件或者空文件夹

public boolean exists():返回文件或目录是否存在

public boolean isDirectory():判断当前File是否表示一个目录

public boolean isFile():判断当前File是否表示一个文件

public boolean mkdir():创建单级目录

public boolean mkdirs():创建多级目录

public boolean renameTo(File dest):将当前File对象所表示的文件重命名为dest所表示的文件或目录。

public String[] list():返回当前File对象所表示的目录下所有文件和目录名称的字符串数组,不包含子目录。

public String[] list(FilenameFilter filter):返回当前File对象所表示的目录下符合FilenameFilter过滤器的所有文件和目录名称的字符串数组,不包含子目录。

public File[] listFiles():返回当前File对象所表示的目录下所有文件和目录的File数组,不包含子目录。

public long length():返回当前File对象所表示文件的长度。

public String getName():返回当前File对象所表示的文件或目录的名称,不包含路径。

public String getPath():返回当前File对象所表示的文件或目录的路径或者文件的相对路径。

public String getAbsolutePath():返回当前File对象所表示的文件或目录的绝对路径。

public long lastModified():返回当前File对象所表示文件最后修改的时间,返回一个时间戳

```

下面是使用File类读取内容的示例:

```java

File file = new File("text.txt");

try (Scanner scanner = new Scanner(file)) {

while (scanner.hasNextLine()) {

String line = scanner.nextLine();

System.out.println(line);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

}

```

该示例从名为"text.txt"的文件中读取所有行并打印它们。需要注意的是,读取操作需要在try-with-resources中进行。在try语句块结束后,会自动关闭Scanner并释放与该文件相关的资源。

### 使用字节流

字节流是Java处理文件的最基本方法之一。它从文件中读取/写入字节,可以处理任何类型的文件,包括文本、图像、音频和视频。

使用字节流来读取文件可以使用以下类:

- FileInputStream:可以从文件读取字节流

- BufferedInputStream:可以使用缓冲区从文件读取字节流

使用字节流来写入文件可以使用以下类:

- FileOutputStream:可以将字节流写入文件

- BufferedOutputStream:可以使用缓冲区将字节流写入文件

字节流的读取和写入示例:

```java

FileInputStream in = null;

FileOutputStream out = null;

try {

in = new FileInputStream("input.txt");

out = new FileOutputStream("output.txt");

int c;

while ((c = in.read()) != -1) {

out.write(c);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (in != null) {

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (out != null) {

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

```

该示例从名为"input.txt"的文件中读取所有字节并将它们写入名为"output.txt"的文件中。需要注意的是,需要在finally块中关闭InputStream和OutputStream以释放与文件相关的资源。

使用BufferedInputStream和BufferedOutputStream时,需要在创建这些类之前创建FileInputStream和FileOutputStream类,然后将它们传递到缓冲区类中。此外,通过使用BufferedInputStream可以提高读取速度。

```java

BufferedInputStream bis = null;

BufferedOutputStream bos = null;

try {

bis = new BufferedInputStream(new FileInputStream("input.txt"));

bos = new BufferedOutputStream(new FileOutputStream("output.txt"));

byte[] buffer = new byte[1024];

int length;

while ((length = bis.read(buffer)) > 0) {

bos.write(buffer, 0, length);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (bis != null) {

try {

bis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (bos != null) {

try {

bos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

```

该示例使用缓冲区从名为"input.txt"的文件中读取数据,并将缓冲区中的字节写入名为"output.txt"的文件中。需要注意的是,当读取数据时,数据将存储在缓冲区中,因此读取操作更加快速和有效。

### 使用字符流

Java还提供了一种用于读取和写入字符的高级I/O类,称为字符流。与字节流不同,字符流可以处理Unicode字符,包括文本文件的读取和写入,构造从字符读取的缓冲区以及许多其他功能。

使用字符流来读取文件可以使用以下类:

- FileReader:可以从文件读取字符流

- BufferedReader:可以使用缓冲区从文件读取字符流

使用字符流来写入文件可以使用以下类:

- FileWriter:可以将字符流写入文件

- BufferedWriter:可以使用缓冲区将字符流写入文件

字符流的读取和写入示例:

```java

FileReader fr = null;

FileWriter fw = null;

try {

fr = new FileReader("input.txt");

fw = new FileWriter("output.txt");

int c;

while ((c = fr.read()) != -1) {

fw.write(c);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fr != null) {

try {

fr.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (fw != null) {

try {

fw.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

```

该示例从名为"input.txt"的文件中读取所有字符并将它们写入名为"output.txt"的文件中。需要注意的是,需要在finally块中关闭FileReader和FileWriter以释放与文件相关的资源。

使用BufferedReader和BufferedWriter时,需要在创建这些类之前创建FileReader和FileWriter类,然后将它们传递到缓冲区类中。此外,通过使用BufferedReader可以提高读取速度。

```java

BufferedReader br = null;

BufferedWriter bw = null;

try {

br = new BufferedReader(new FileReader("input.txt"));

bw = new BufferedWriter(new FileWriter("output.txt"));

String line;

while ((line = br.readLine()) != null) {

bw.write(line);

bw.newLine();

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (br != null) {

try {

br.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (bw != null) {

try {

bw.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

```

该示例使用缓冲区从名为"input.txt"的文件中读取数据,并将缓冲区中的字符写入名为"output.txt"的文件中。需要注意的是,在读取数据时,数据将存储在缓冲区中,因此读取操作更加快速和有效。

### 使用NIO

NIO是一个Java的I/O API,可以在不使用线程的情况下,通过一个单一的线程处理多个输入和输出。NIO的核心是Channel和Buffer类,Channel类与字节流和字符流不同,它需要使用Buffer类来存储数据。

使用NIO读取文件可以使用以下类:

- FileChannel:可以对文件执行读取操作

- ByteBuffer:可以使用缓冲区存储数据

使用NIO写入文件可以使用以下类:

- FileChannel:可以对文件执行写入操作

- ByteBuffer:可以使用缓冲区存储数据

使用NIO的读取和写入示例:

```java

FileInputStream in = null;

FileOutputStream out = null;

FileChannel inChannel = null;

FileChannel outChannel = null;

try {

in = new FileInputStream("input.txt");

out = new FileOutputStream("output.txt");

inChannel = in.getChannel();

outChannel = out.getChannel();

ByteBuffer buffer = ByteBuffer.allocate(1024);

while (inChannel.read(buffer) != -1) {

buffer.flip(); // 切换为读模式

outChannel.write(buffer);

buffer.clear(); // 切换为写模式

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (in != null) {

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (out != null) {

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (inChannel != null) {

try {

inChannel.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (outChannel != null) {

try {

outChannel.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

```

该示例从名为"input.txt"的文件中读取所有字节并将它们写入名为"output.txt"的文件中。需要注意的是,需要在finally块中关闭FileInputStream、FileOutputStream、FileChannel以释放与文件相关的资源。

### 总结

Java提供了多种方式来操作文件,包括使用File类、字节流、字符流以及NIO。不同的方式适用于不同的场景,选择合适的方式可以帮助我们更高效地读取和写入文件。最后,需要注意在读取和写入文件时需要定义异常处理和资源释放操作,以避免程序出现问题。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(5) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部