🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿
- 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻
文本I/O流
- 文本I/O流概述
- Reader类和Writer类
- Reader
- Writer
- FileReader和FileWriter类
- FileReader
- FileWriter
- 实战演练
- BufferedReader和BufferedWriter类
- BufferedReader
- BufferedWriter
- 实战演练
- PrintWriter类的应用
- 使用Scanner对象
- 综合演练
文本I/O流概述
- 文本I/O流以字符为基本单位, 也叫字符I/O流。
- 抽象类Reader和Writer分别是文本输入流和输出流的根类。
Reader类和Writer类
Reader
- Reader类是文本输入流的根类,主要方法有:
int read() 返回值0-65535之间
int read(char[] cbuf)
void close()Writer
- Writer是字符输出流的根类,主要方法有:
void write(int c) 写入c的低16位
void write(char [] cbuf)
void write(String str)
void close()
FileReader和FileWriter类
FileReader
- FileReader类构造方法有:
FileReader(String fileName) FileReader(File file)
FileWriter
- FileWriter类构造方法有:
FileWriter(String fileName) FileWriter(File file) FileWriter(String fileName, boolean append)
实战演练
问题描述:
- 编写程序,使用FileReader和FileWriter 将文件input.txt 的内容复制到output.txt文件中。
- 思路:用input.txt创建FileReader,用output.txt创建FileWriter,从文件输入流读取字符,写入文件输出流。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class FileCopyExample { public static void main(String[] args) { // 定义源文件和目标文件的路径 String inputFilePath = "input.txt"; String outputFilePath = "output.txt"; // 使用try-with-resources语句自动关闭资源 try (FileReader reader = new FileReader(inputFilePath); FileWriter writer = new FileWriter(outputFilePath)) { // 创建一个字符数组(缓冲区)来存储从文件读取的字符 char[] buffer = new char[1024]; int bytesRead; // 读取文件到缓冲区,直到没有更多的数据 while ((bytesRead = reader.read(buffer)) != -1) { // 将缓冲区中的数据写入输出文件 writer.write(buffer, 0, bytesRead); } System.out.println("文件复制完成。"); } catch (IOException e) { // 如果发生I/O错误,打印错误消息 e.printStackTrace(); } }
}
程序解释
1、导入必要的类:
- FileReader 用于读取字符文件。
- FileWriter 用于写入字符文件。
- IOException 用于处理可能发生的I/O错误。
2、定义文件路径:
- inputFilePath 是源文件input.txt的路径。
- outputFilePath 是目标文件output.txt的路径。
3、使用try-with-resources语句:
- 这个语句自动管理资源(即FileReader和FileWriter对象),并在代码块执行完毕后自动关闭它们。
4、读取和写入:
- 创建一个字符数组(或称为缓冲区)buffer,用于临时存储从input.txt读取的字符。
- 使用while循环和read方法从FileReader中读取数据到缓冲区中,直到没有更多的数据(即read方法返回-1)。
- 在每次循环中,使用write方法将缓冲区中的数据写入到FileWriter中。注意write方法的第三个参数指定了要写入文件的字节数(在这个情况下是bytesRead)。
5、异常处理:
- 如果在读取或写入过程中发生IOException,则捕获该异常并打印堆栈跟踪。
这个示例展示了如何使用Java IO库中的FileReader
和FileWriter
类来复制文件内容。注意,由于这个示例使用了字符流,所以它最适合用于处理文本文件。如果你需要处理二进制文件,应该考虑使用FileInputStream
和FileOutputStream
。
BufferedReader和BufferedWriter类
BufferedReader
- BufferedReader类的构造方法如下:
BufferedReader(Reader in) BufferedReader(Reader in, int sz)BufferedReader in = new BufferedReader(new FileReader("input.txt"));
public String readLine()
BufferedWriter
- BufferedWriter类的构造方法如下:
BufferedWriter(Writer out)BufferedWriter(Writer out, int sz)BufferedWriter br = new BufferedWriter(new FileWriter("output.txt"));
实战演练
问题描述
编写程序,统计文本文件article.txt中的单词数量。
思路:从article.txt文件中读取一行,解析成单词组成的字符串数组,累加数组的长度即可。
假设单词的分隔符只用空格、逗号和点号3种。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Pattern; public class WordCount { public static void main(String[] args) { String filePath = "article.txt"; int totalWords = 0; try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; while ((line = reader.readLine()) != null) { // 使用正则表达式分割单词,这里假设单词之间由空格、逗号或点号分隔 String[] words = line.split("[\\s,.]+"); // \\s 匹配任何空白字符,+表示一个或多个 // 累加当前行的单词数量 totalWords += words.length; // 注意:这种简单的计数方式会将连续的分隔符视为空字符串,因此可能需要进一步处理 // 但在这个特定情况下,由于我们关注的是单词的总数,所以可以接受这种“额外”的计数 } System.out.println("Total words in the file: " + totalWords); } catch (IOException e) { e.printStackTrace(); } }
}
注意:
我们使用了split("[\\s,.]+")
来根据空格、逗号和点号(一个或多个)分割字符串。这里的+确保了即使连续出现多个分隔符,它们也只被视为一个分隔点,从而避免生成空字符串(尽管在这个计数场景下空字符串不会影响最终结果)。
请确保article.txt
文件存在于程序的运行目录中,或者提供正确的文件路径。
如果文件很大,或者性能是一个关注点,可能需要考虑更高效的读取和解析策略,比如使用Scanner
类或者NIO包
中的类来读取文件。
- PrintWriter类实现文本打印输出流,构造方法如下:
PrintWriter(Writer out)
PrintWriter(Writer out, boolean autoFlush)
void println(boolean b)
void println(int i)
void println(String s)
void println(Object obj)
PrintWriter printf(String format, Object…args)
PrintWriter类的应用
问题描述
编写程序,随机产生10个100到200之间的整数,然后使用PrintWriter对象输出到文件number.txt中。
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random; public class RandomNumbersToFile { public static void main(String[] args) { // 创建 Random 对象 Random random = new Random(); // 创建 FileWriter 对象,如果文件不存在则创建文件 try (FileWriter fileWriter = new FileWriter("number.txt"); PrintWriter printWriter = new PrintWriter(fileWriter)) { // 循环生成10个随机数 for (int i = 0; i < 10; i++) { // 生成 100 到 200 之间的随机整数 int randomNumber = random.nextInt(101) + 100; // 因为nextInt(n)生成的是0到n-1之间的随机数 // 写入随机数到文件 printWriter.println(randomNumber); } // 注意:由于使用了try-with-resources语句,不需要显式关闭PrintWriter和FileWriter } catch (IOException e) { e.printStackTrace(); System.out.println("发生错误,无法写入文件。"); } System.out.println("随机数已写入到number.txt文件中。"); }
}
这个程序首先创建了一个Random
对象用于生成随机数。然后,它使用FileWriter
和PrintWriter
对象将随机数写入到number.txt
文件中。注意,由于FileWriter
构造函数在文件不存在时会创建文件,因此不需要事先手动创建number.txt
文件。程序中的循环会生成10个随机数,并使用println
方法将每个随机数写入文件(每个数占一行)。最后,使用try-with-resources
语句来确保PrintWriter
和FileWriter
在使用后能够被正确关闭,这避免了潜在的资源泄露问题。
使用Scanner对象
- 使用Scanner类从键盘读取数据,这是在创建Scanner对象时将标准输入设备System.in作为其构造方法的参数。
Scanner input = new Scanner(System.in);int n = input.nextInt();
- 使用Scanner还可以关联文本文件,从文本文件中读取数据。
- Scanner类的常用的构造方法有:
Scanner(String source)Scanner(InputStream source)
- Scanner常用方法:
byte nextByte()double nextDouble()String nextLine() boolean hasNextDouble()void close()
综合演练
问题描述
编写程序,使用Scanner类从程序13.5创建的文本文件number.txt中读出每个整数。
思路: 先用number.txt创建FileInputStream对象,再用它创建Scanner对象,用nextInt()方法从中读出整数。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner; public class ReadNumbersFromFile { public static void main(String[] args) { // 指定文件路径 String filePath = "number.txt"; // 使用File对象指向文件 File file = new File(filePath); // 创建Scanner对象来读取文件 try (Scanner scanner = new Scanner(file)) { // 检查文件是否成功打开 if (!scanner.hasNext()) { System.out.println("文件为空或无法读取"); return; } // 循环读取文件中的整数 while (scanner.hasNextInt()) { int number = scanner.nextInt(); System.out.println(number); // 打印读取到的整数 } // 注意:由于使用了try-with-resources语句,Scanner对象会在结束时自动关闭 } catch (FileNotFoundException e) { System.out.println("文件未找到:" + filePath); e.printStackTrace(); } }
}
博主用心写,读者点关注,互动传真情,知识不迷路。