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

JavaEE——文件内容的读写

JavaEE传送门

JavaEE

JavaEE——认识文件

JavaEE——File类


目录

  • 文件内容的读写 —— 数据流
    • 字节流
      • InputStream
      • OutputStream
    • 字符流
      • Reader
      • Writer
      • Scanner
      • PrintWriter


文件内容的读写 —— 数据流

把读写文件的操作, 比喻成 "水流". (水的特点, 流动起来, 绵延不断)

比如: 我们想接 100ml 的水, 有好几种接法

  1. 一次接 1ml, 分 100 次接完
  2. 一次接 10ml, 分 10 次接完
  3. 一次接 50ml, 分 2 次接完

我们读写文件也是一样, 我们想写 100 字节的数据到文件中, 我们可以

  1. 一次写 1 字节, 分 100 次写
  2. 一次写 10 字节, 分 10 次写
  3. 一次写 50 字节, 分 2 次写

Java 标准库, 就在 " 流" 的概念上, 提供了一组类, 完成读写文件的操作. 分为

字节流 (以字节为基本单位), 适用于二进制文件

字符流 (以字符为基本单位), 适用于文本文件


字节流

InputStream

方法

修饰符及返回值类型方法签名说明
intread()读取一个字节的数据 (返回 -1 代表已经完全读完了)
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数量 (-1 代表以及读完了)
intread(byte[] b, int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量 (-1 代表以及读完了)
voidclose()关闭字节流

read() 方法, 用来读数据, 把数据从硬盘中读到内存中

FileInputStream 构造方法

签名说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

示例

  • 打开文件
//相当于打开文件
InputStream inputStream = new FileInputStream("./heihei.txt");

# 注意 # 打开了文件, 进行操作后, 一定要记得关闭文件 ! !

//关闭文件
inputStream.close();
  • 读文件 read()
while(true) {
    int b = inputStream.read();
    // 返回 -1 表示读完了
    if (b == -1) {
        break;
    }
    System.out.println(b);
}

  • 完整代码
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("./heihei.txt");

        while(true) {
            int b = inputStream.read();
            if (b == -1) {
                break;
            }
            System.out.println(b);
        }
        inputStream.close();
    }
}

我们打开看一下 heihei.txt, 然后看一下运行结果

# 注意事项 #

进行文件操作的时候, 一定要记得进行 close ! !

每个进程都对应着 PCB (可能是多个), PCB 里面有一个字段, 文件描述表. (同一个进程里多个 PCB 公共使用同一份文件描述表的)

文件描述表相当于是一个数组/ 顺序表.

进程每次打开一个文件, 都会在这个表里, 创建一个项, 这个项就表示一个文件.

如果关闭一个文件, 就会把表里的对应项给释放掉. 如果不关闭, 意味着这个表项就在这里占着位置.

如果持续打开文件, 而且从来不关, 此时表项就会被耗尽, 导致后续再打开文件, 就会打开失败.

就会造成文件资源泄露, 这是一个非常严重的问题 ! !


OutputStream

方法

修饰符及返回值类型方法签名说明
voidwrite(int b)写入要给字节的数据
voidwrite(byte[] b)将 b 这个字符数组中的数据全部写入 os 中
intwrite(byte[] b, int off, int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流

示例

public class Test {
    public static void main(String[] args) throws IOException {
        //只要打开文件成功, 就会把文件原有内容清空
        //OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。
        OutputStream outputStream = new FileOutputStream("./heihei.txt");

        outputStream.write(97);//a
        outputStream.write(98);
        outputStream.write(99);

        //一定记得关闭
        outputStream.close();
    }
}

运行结果展示


字符流

Reader

方法

示例

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Test {
    public static void main(String[] args) throws IOException {
        Reader reader = new FileReader("./heihei.txt");
        while (true) {
            int ret = reader.read();
            if(ret == -1) {
                break;
            }
            System.out.println((char)ret);
        }

        reader.close();
    }
}

heihei.txt 与 运行结果展示


Writer

方法

示例

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test {
    public static void main(String[] args) throws IOException {
        Writer writer = new FileWriter("./heihei.txt");
        writer.write("hello world");
        writer.close();
    }
}

运行结果展示


Scanner

针对文本文件, 使用字符流的时候, 还可以使用 Scanner 来进行读取

示例

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("./heihei.txt");

        // 从inputStream读取
        Scanner scanner = new Scanner(inputStream);

        //hasNext遇到空白符结束
        while (scanner.hasNext()) {
            System.out.println(scanner.next());
        }

        inputStream.close();
    }
}

heihei.txt 与 运行结果展示

# 注意 #

InputStream 是字节流. Scanner 是在 InputStream 的基础上, 包装出来了个字符流.


PrintWriter

PrintWriter 类中提供了我们熟悉的 print/println/printf 方法

示例

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

public class Test {
    public static void main(String[] args) throws IOException {

        OutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream("./heihei.txt");
            PrintWriter printWriter = new PrintWriter(outputStream);

            printWriter.println();
            printWriter.printf("a = %d", 10);
            
            //刷新缓冲区
            printWriter.flush();
            
        } finally {
            //保证文件一定能关闭防止资源泄露
            outputStream.close();
        }

}

运行结果展示

# 注意 #

一定不要忘记调用flush

缓冲区其实就是一个 “内存空间”.

文件是在硬盘上的, 写文件操作, 就是在写硬盘, 但是写硬盘是一个低效操作 ! !

缓冲区满了会自动把内存缓冲区的数据写到硬盘中.

若缓冲区未满, 我们就需要调用 flush 手动刷新.

除了try finally 保证 close 还可以使用 try with resources.

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

public class Demo5 {
    public static void main(String[] args) throws IOException {

        //把要关闭的对象写在 try() 中, 当try结束, 就会自动调用到对应对象的 close 方法
        //且支持一个 () 放对各对象, 多个对象的创建之间使用; 分割
        try (OutputStream outputStream = new FileOutputStream("./heihei.txt")){
            PrintWriter printWriter = new PrintWriter(outputStream);

            printWriter.println();
            printWriter.printf("a = %d", 10);
			
            //刷新缓冲区
            printWriter.flush();
        }
        
    }
}

🌷(( ◞•̀д•́)◞⚔◟(•̀д•́◟ ))🌷

以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!
在这里插入图片描述
加粗样式

这里是Gujiu吖!!感谢你看到这里🌬
祝今天的你也
开心满怀,笑容常在。

相关文章:

  • 人脑能否重启?
  • 软件测试基础(五)—— Liunx基础命令行
  • 基于群智能的路径规划算法(三)------遗传算法
  • 到底怎么能精准挑到“报恩榴莲”?
  • C# 窗体进度条
  • 【opencv-c++】鼠标事件
  • STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)
  • ijkplayer播放器剖析(四)音频解码与音频输出机制分析
  • 本地web项目如何使用外网访问?教你轻松使用cpolar在windows搭建内网穿透
  • MySQL复合查询
  • 你需要的导航网站,这里都有
  • [SV]SystemVerilog中指定打印格式
  • 长期主义就是坚持重复的做一件事?
  • 各位程序员们,睡眠不足产生的后果超出你想象!
  • c++学习
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Android Studio:GIT提交项目到远程仓库
  • Angular 响应式表单之下拉框
  • django开发-定时任务的使用
  • JavaScript设计模式系列一:工厂模式
  • Lsb图片隐写
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Protobuf3语言指南
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 数据仓库的几种建模方法
  • 我这样减少了26.5M Java内存!
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​queue --- 一个同步的队列类​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (八)Spring源码解析:Spring MVC
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (待修改)PyG安装步骤
  • (二十三)Flask之高频面试点
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .htaccess配置重写url引擎
  • .NET CF命令行调试器MDbg入门(一)
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /var/spool/postfix/maildrop 下有大量文件
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [C#7] 1.Tuples(元组)
  • [c++] C++多态(虚函数和虚继承)
  • [C++基础]-初识模板
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [CentOs7]iptables防火墙安装与设置