当前位置: 首页 > news >正文

Java语言程序设计——篇十三(2)

在这里插入图片描述
在这里插入图片描述

       🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
    您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻

在这里插入图片描述

文本I/O流

  • 文本I/O流概述
    • Reader类和Writer类
      • Reader
      • Writer
    • FileReader和FileWriter类
      • FileReader
      • FileWriter
        • 实战演练
    • BufferedReader和BufferedWriter类
      • BufferedReader
      • BufferedWriter
        • 实战演练
        • PrintWriter类的应用
    • 使用Scanner对象
          • 综合演练

文本I/O流概述

  • 文本I/O流以字符为基本单位, 也叫字符I/O流。
  • 抽象类ReaderWriter分别是文本输入流和输出流的根类。
    在这里插入图片描述
    在这里插入图片描述

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库中的FileReaderFileWriter类来复制文件内容。注意,由于这个示例使用了字符流,所以它最适合用于处理文本文件。如果你需要处理二进制文件,应该考虑使用FileInputStreamFileOutputStream

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对象用于生成随机数。然后,它使用FileWriterPrintWriter对象将随机数写入到number.txt文件中。注意,由于FileWriter构造函数在文件不存在时会创建文件,因此不需要事先手动创建number.txt文件。程序中的循环会生成10个随机数,并使用println方法将每个随机数写入文件(每个数占一行)。最后,使用try-with-resources语句来确保PrintWriterFileWriter在使用后能够被正确关闭,这避免了潜在的资源泄露问题。

使用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();  }  }  
}

博主用心写,读者点关注,互动传真情,知识不迷路。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 哈希表 - 赎金信
  • 数学建模笔记(2):Topsis分析法
  • java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2
  • 【洛谷/水滴题解】[NOIP2005 普及组] 采药
  • C++入门:类和对象(入门篇)
  • 详解Linux命令--zip/unzip
  • 谷粒商城实战笔记-175~177-商城业务-检索服务-检索查询接口开发
  • Unity动画模块 之 简单创建一个序列帧动画
  • 6 款最佳付费和免费 iPhone 解锁应用和软件
  • [FBCTF2019]RCEService1
  • Redis7-分布式锁
  • 嵌入式学习Day30---Linux软件编程---进程间的通信
  • 网络通信(TCP/UDP协议 三次握手四次挥手 )
  • Webpack Bundle Analysis:减少包体积的技巧
  • Linux——进程(2)
  • [数据结构]链表的实现在PHP中
  • Akka系列(七):Actor持久化之Akka persistence
  • Bytom交易说明(账户管理模式)
  • css选择器
  • JAVA之继承和多态
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux各目录及每个目录的详细介绍
  • php中curl和soap方式请求服务超时问题
  • Sass Day-01
  • session共享问题解决方案
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 给github项目添加CI badge
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 离散点最小(凸)包围边界查找
  • 目录与文件属性:编写ls
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​Java基础复习笔记 第16章:网络编程
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​一些不规范的GTID使用场景
  • #、%和$符号在OGNL表达式中经常出现
  • #{}和${}的区别是什么 -- java面试
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (LeetCode 49)Anagrams
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (二)PySpark3:SparkSQL编程
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十)T检验-第一部分
  • (十三)Flask之特殊装饰器详解
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .bat批处理(一):@echo off
  • .htaccess配置重写url引擎