近年来,Java编程语言一直是互联网行业的热门技术之一。Java具有跨平台、面向对象、可扩展性等优点,成为众多开发者的首选语言。在Java开发中,读写文件是不可避免的任务之一,因此,本文将围绕Java读写文件展开深入探讨,让读者从入门到精通。
一、文件读写的基础知识
在Java中,文件读写可以使用java.io包中提供的File、FileReader、FileWriter、BufferedReader、BufferedWriter等类来完成。
1. 文件
在Java中,文件通过File类来表示。File类有两个常用的构造方法:
- File(String pathname):使用路径名字符串创建一个新File实例。
- File(String parent, String child):根据父路径名字符串和子路径名字符串创建一个新File实例。
例如,可以使用下面的代码创建名为test.txt的文件:
```
File file = new File("test.txt");
```
2. 字符流
字符流指的是以字符为单位读写数据的流,主要分为字符输入流(Reader)和字符输出流(Writer)。
字符输入流:
- FileReader:用于读取字符文件的便捷类。
- BufferedReader:为BufferedWriter提供缓冲,一次可以读取很多个字符,避免频繁读写。
字符输出流:
- FileWriter:用于写入字符文件的便捷类。
- BufferedWriter:为FileWriter提供缓存,一次可以写入很多字符,避免频繁写入。
3. 字节流
字节流指的是以字节为单位读写数据的流,主要分为字节输入流(InputStream)和字节输出流(OutputStream)。
字节输入流:
- FileInputStream:将文件以字节为单位进行读取的便捷类。
- BufferedInputStream:为FileInputStream提供缓冲,避免频繁读写。
字节输出流:
- FileOutputStream:将字节写入文件的便捷类。
- BufferedOutputStream:为FileOutputStream提供缓冲,避免频繁读写。
以上是Java文件读写的基础知识,下面我们将通过实践来加深理解。
二、Java文件读写实例
1. 文件的读取
示例代码如下:
```
//读取文件
public static void readFile(File file) {
FileInputStream fis = null;
BufferedReader reader = null;
try {
fis = new FileInputStream(file);
reader = new BufferedReader(new InputStreamReader(fis));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
以上代码中,首先我们通过FileInputStream类打开文件,然后使用BufferedReader类读取文件数据,并将读取到的数据打印到控制台。最后,我们需要在finally块中关闭文件流,以保证程序不会因为资源错误而出错。
2. 文件的写入
示例代码如下:
```
// 写入文件
public static void writeFile(File file, String data) {
FileOutputStream fos = null;
BufferedWriter writer = null;
try {
fos = new FileOutputStream(file);
writer = new BufferedWriter(new OutputStreamWriter(fos));
writer.write(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
writer.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
以上代码中,我们创建了一个FileOutputStream实例用于写入数据,并使用BufferedWriter类来写入文件数据。最后,我们也需要在finally块中关闭文件流。需要注意的是,第二个参数可以指定字符编码,例如:new OutputStreamWriter(fos, "utf-8")。
三、Java文件读写高级应用
在实际开发中,文件读写可能涉及到更加复杂的场景。下面我们将围绕几个高级应用场景,让读者更好地理解Java文件读写。
1. 自动关闭文件流
Java 7引入了“Try-With-Resources”语句,使得我们可以自动关闭文件流。示例代码如下:
```
//读取文件(自动关闭)
public static void readFile2(File file) {
try (FileInputStream fis = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
```
以上代码中,我们使用了try-with-resources语句来打开文件流,不用再在finally块中关闭文件流。当语句执行完成或者程序抛出异常时,自动关闭由try括号中的实例离开代码块时被创建的文件流。需要注意的是,被声明的流必须实现AutoCloseable接口。
2. 一行代码读取文件
使用Java 8中的Files类,只需要一行代码就可以读取文件的所有内容。示例代码如下:
```
// 读取文件(一行代码)
public static void readFile3(File file) {
try {
List
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
```
以上代码中,我们通过Files类中的readAllLines方法一次性将整个文件读取到一个List
3. 文件的复制
文件的复制是日常开发中经常会用到的功能。示例代码如下:
```
// 文件复制
public static void fileCopy(File src, File dest) {
FileInputStream fis = null;
FileOutputStream fos = null;
FileChannel inChannel = null;
FileChannel outChannel = null;
try {
fis = new FileInputStream(src);
fos = new FileOutputStream(dest);
inChannel = fis.getChannel();
outChannel = fos.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inChannel.close();
outChannel.close();
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
以上代码中,我们使用了FileInputStream、FileOutputStream、FileChannel来复制文件,并使用transferTo方法将数据从源文件传输到目标文件。
四、总结
Java文件读写是开发中必须要面对的问题之一。通过本文的学习,我们了解了Java文件读写的基础知识和实战操作,同时也掌握了几个高级的应用场景,例如自动关闭文件流、一行代码读取文件和文件复制等。希望本文能够帮助读者更好的掌握Java文件读写技术。如果读者有更多疑问或者建议,欢迎在评论中留言。