目录
- 一、FileReader和FileWriter
- 三、BufferedReader和BufferedWriter
- 四、LineNumberReader
- 五、InputStreamReader和OutputStreamWriter
- 六、SequenceInputStream
- 总结
一、FileReader和FileWriter
1.FileReader
首先来介绍一下FileReader类。FileReader类可用于读取字符流和文本文件。它提供了多个构造函数,其中最常用的是接受一个文件名或File对象作为参数的构造函数。在使用FileReader类时,需要注意一些异常情况,如文件不存在、文件无法读取等。为此,我们可以使用try-catch块来捕获这些异常,并添加适当的处理逻辑。
简单使用:
public class Demo9_FileReader {public static void main(String[] args) throws IOException {//创建FileWriter对象FileReader fr = new FileReader("src/com/IOSteam/file/a.txt");int b;while ((b=fr.read())!=-1){//通过项目码表一次读取一个字符System.out.print((char)b);}fr.close();}
}
创建了FileReader对象后,就可以使用它来读取文件内容了。FileReader类提供了多个读取字符流的方法,如read()、read(char[])和read(char[], int, int)等。这些方法都会返回读取到的字符数,如果已经到达文件末尾,则返回-1。
2.FileWriter
FileWriter类用于向文本文件中写入数据。它也提供了多个构造函数,其中最常用的是接受一个文件名或File对象作为参数的构造函数。在使用FileWriter类时,同样需要注意异常情况,如文件无法写入、磁盘空间不足等。因此,建议在使用FileWriter类时添加try-catch块来捕获异常并进行相应的处理。
简单使用:
public class Demo10_FileWriter {public static void main(String[] args) throws IOException {//创建FileWriter对象FileWriter fw = new FileWriter("src/com/IOSteam/file/b.txt");fw.write("大家好我是xxx");fw.close();}
下面我们利用FileWriter和FileReader实现一个简单的文件拷贝:
public class Demo11_CharStreamCopy {public static void main(String[] args) throws IOException {FileReader fr= new FileReader("src/com/IOSteam/file/a.txt");FileWriter fw = new FileWriter("src/com/IOSteam/file/b.txt");int b;char[] arr = new char[1024];while ((b=fr.read(arr))!=-1){System.out.println(b);
//fw.write(arr, 0, b) 表示将 arr 数组中从下标为 0 开始的前 b 个元素写入到输出流中。其中,arr 是要写入的字符数组,0 是起始位置,b 是要写入的字符数量。fw.write(arr,0,b);}fr.close();fw.close();}
}
三、BufferedReader和BufferedWriter
BufferedReader和BufferedWriter是Java语言中常用的字符缓冲流类,它们分别用于高效地读取和写入文本数据。
1.BufferedReader类的使用
创建BufferedReader对象
为了使用BufferedReader类读取文件,我们需要先创建一个FileReader对象,然后将其作为参数传递给BufferedReader构造函数。
FileReader fileReader = new FileReader("filename.txt");
BufferedReader reader = new BufferedReader(fileReader);
读取文件内容
创建了BufferedReader对象后,就可以使用它来读取文件内容了。BufferedReader类提供了多个读取字符流的方法,如read()、read(char[])和readLine()等。这些方法都会返回读取到的字符数或字符串,如果已经到达文件末尾,则返回null。
下面是一个简单的例子,演示如何使用BufferedReader类读取文本文件的内容:
try (BufferedReader reader = new BufferedReader(new FileReader("filename.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}
2.BufferedWriter类的使用
与BufferedReader类不同,要使用BufferedWriter类写入文件时,我们只需创建一个FileWriter对象,然后将其作为参数传递给BufferedWriter构造函数即可
FileWriter fileWriter = new FileWriter("filename.txt");
BufferedWriter writer = new BufferedWriter(fileWriter);
创建了BufferedWriter对象后,就可以使用它来写入文件内容了。BufferedWriter类提供了多个写入字符流的方法,如write(int)、write(char[])和write(String)等。这些方法都会将字符写入输出流。
写入文件内容:
try (BufferedWriter writer = new BufferedWriter(new FileWriter("filename.txt"))) {String data = "Hello, World!";writer.write(data);
} catch (IOException e) {e.printStackTrace();
}
下面用文件拷贝例子简单使用一下这两个对象:
/*带缓冲区的流中的方法
* readLine()读取一个文本行,遇到\n,\r就结束
* newLine()写入一个换行
* */
public class Demo12_BufferReadWriter {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("src/com/IOSteam/file/a.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("src/com/IOSteam/file/b.txt"));String line;while ((line=br.readLine())!=null){bw.write(line);bw.newLine();//写出回车换行符}br.close();bw.close();}public static void test() throws IOException{BufferedReader br = new BufferedReader(new FileReader("src/com/IOSteam/file/a.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("src/com/IOSteam/file/b.txt"));int b;while ((b=br.read())!=-1){bw.write((char)b);}br.close();bw.close();}
}
四、LineNumberReader
2023/5/23 09:34:32
LineNumberReader是Java中的一个类,它可以在读取文本文件时,自动记录每行的行号。使用LineNumberReader可以方便地获取当前读取到文件的哪一行。
以下是一个示例代码,展示如何使用LineNumberReader来读取一个文本文件,同时输出每行的行号和文本内容:
import java.io.*;public class ReadFileWithLineNumbers {public static void main(String[] args) {try {File file = new File("test.txt");FileReader reader = new FileReader(file);LineNumberReader lineNumberReader = new LineNumberReader(reader);String line;while ((line = lineNumberReader.readLine()) != null) {int lineNumber = lineNumberReader.getLineNumber();System.out.println("Line " + lineNumber + ": " + line);}lineNumberReader.close();reader.close();} catch (IOException e) {e.printStackTrace();}}
}
五、InputStreamReader和OutputStreamWriter
InputStreamReader和OutputStreamWriter是Java中的两个类,它们可以用于将字节流转换为字符流,或者将字符流转换为字节流。这两个类通常用于处理文本文件,或者网络传输中的数据。
下面是一个简单的示例,演示如何使用InputStreamReader读取一个文本文件,并使用OutputStreamWriter将其写入到另一个文件中:
import java.io.*;public class CopyFile {public static void main(String[] args) {try {File inputFile = new File("input.txt");FileInputStream inputStream = new FileInputStream(inputFile);InputStreamReader reader = new InputStreamReader(inputStream);File outputFile = new File("output.txt");FileOutputStream outputStream = new FileOutputStream(outputFile);OutputStreamWriter writer = new OutputStreamWriter(outputStream);int data;while ((data = reader.read()) != -1) {char character = (char) data;writer.write(character);}reader.close();writer.close();inputStream.close();outputStream.close();System.out.println("File copied successfully.");} catch (IOException e) {e.printStackTrace();}}
}
六、SequenceInputStream
SequenceInputStream是Java IO中的一个类,它可以将多个InputStream对象串联在一起,形成一个新的InputStream对象。这样就可以从这个新的InputStream对象中连续读取多个文件或者数据流的内容。
下面是一个简单的示例,演示如何使用SequenceInputStream读取两个文本文件的内容,并输出到控制台:
import java.io.*;public class MergeFiles {public static void main(String[] args) {try {File file1 = new File("file1.txt");FileInputStream inputStream1 = new FileInputStream(file1);File file2 = new File("file2.txt");FileInputStream inputStream2 = new FileInputStream(file2);SequenceInputStream sequenceInputStream = new SequenceInputStream(inputStream1, inputStream2);InputStreamReader reader = new InputStreamReader(sequenceInputStream);int data;while ((data = reader.read()) != -1) {char character = (char) data;System.out.print(character);}reader.close();sequenceInputStream.close();inputStream1.close();inputStream2.close();System.out.println("Files merged successfully.");} catch (IOException e) {e.printStackTrace();}}
}
在上面的代码中,我们首先创建了两个FileInputStream对象分别用于读取"file1.txt"和"file2.txt"两个文件的内容。然后将这两个输入流对象作为参数,创建一个SequenceInputStream对象。
接着我们创建了一个InputStreamReader对象,将SequenceInputStream对象作为参数传递给它,这样我们就可以从这个新的InputStream对象中连续读取两个文件的内容。
在while循环中,我们逐个字符地读取InputStreamReader对象中的数据,并将其输出到控制台。最后,在程序结束时关闭所有打开的资源。
需要注意的是,SequenceInputStream会按照它们被传入的顺序,依次从每个输入流中读取数据。如果一个输入流读取完毕,将自动切换到下一个输入流。此外,SequenceInputStream本身并不缓存任何数据,因此在使用时要保证每个输入流都已经准备好了数据。
总结
除了基本的读取和写入功能外,FileReader和FileWriter还支持其他许多操作,例如读取行、读取指定长度的字符、追加数据等。在使用这些功能时,需要详细阅读API文档并了解其用法。
总之,FileReader和FileWriter是Java语言中非常实用的文件操作类,它们可以帮助我们轻松地读取和写入文本文件。在使用它们时,需要注意异常情况,并适当处理这些异常。此外,还可以利用它们提供的其他函数来实现更多功能。