文件操作与IO(3)

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

这里我们将要讲到文件操作中的重要概念--流.

之前也在C语言讲解中提到了文件流的概念---读写文件内容

分为这几步:(1)打开文件;(2)读/写文件;(3)关闭文件.

数据流主要分为字节流和字符流.

字节流:以字节为单位进行读写(代表:InputStream,OutputStream).

字符流:以字符为单位进行读写,比如utf8表示汉字--即每次读写都得以3个字节(就是一个汉字)为单位进行读写.(代表:Reader:输入;Writer:输出.)

InputStream概述

方法

修饰符及返回值类型方法签名说明
int(实际是byte)read()

读取一个字节的数据,返回值代表读取到的

字节值,返回-1代表已经完全读完了

intread(byte[] b)

最多读取b.length字节的数据到b中,返回

实际读到的数量;-1代表已经读完了

intread(byte[] b, int off, int len)

其中off是offset(偏移量),最多读取len - off字节的数据

到b中,放在从off开始,返回实际读到的数量,-1代表读完

voidclose()关闭字节流

注意:

1.byte[] b表示一个缓冲区,往往是一个内存空间,方法内部对数组内容进行修改,方法执行结束之后,方法外部,亦会生效

2.在后面两个read方法中,read会尝试把数组填满,但文件剩余长度不足以填满.但文件剩余长度不足以填满.操作硬盘,本身就是比较低效的操作.出现次数越少越好.期望借助内存减少读写硬盘次数.

3.不同于内存的自动垃圾回收机制(GC),这里的字节流必须使用close()关闭(释放了文件相关资源).原因如下:我们在之前学进程PCB(一个或多个)时,中间就有个重要的属性--文件操作符表:记录打开了哪些文件.文件操作符表如果自动扩容,会付出很大代价,对于操作系统内核要求很高:每次打开一个文件,都需要在文件操作符表中占据一个位置的.如果不关闭的话,还一直代开就会导致文件操作符表耗尽.(文件操作符表的长度有上限,当文件操作符表被耗尽之后,后续再打开文件就会失败.进一步引发一系列逻辑问题).

说明

InputStream只是一个抽象类,要使用还需要具体的实现类.关于InputStream的实现类有很多,基本可以认为不同的输入设备都可以对应一个InputStream类,我们只关心从文件中读取,所以使用FileInputStream.

FileInputStream概述

构造方法

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

代码示例

示例1

将文件完全读完的两种方式.相比较而言,后一种的IO次数更少,性能更好. 

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;//需要先在项目目录下准备好一个hello.txt的文件,里面填充一些内容
public class FileTest8 {public static void main(String[] args) throws IOException {//注意:这样使用try() {格式写的原因是因为try执行完之后可以自动调用close()方法try(InputStream is = new FileInputStream("hello-world.txt")) {while (true) {int b = is.read();if(b == -1) {//代表文件已经全部读完break;}System.out.printf("%c", b);}}}
}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class FileTest9 {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello-world.txt")) {byte[] buf = new byte[1024];int len;while(true) {len = is.read(buf);if(len == -1) {//代表文件已经全部读完break;}for(int i = 0; i < len; i++) {System.out.printf("%c", buf[i]);}}}}
}

示例2

这里我们把文件内容中填充中文看看,注意,写中文的时候使用UTF-8编码.hello-world.txt中填写"卢本伟牛逼"

注意:这里我利用了这几个中文的UTF-8编码长度刚好是三个字节和长度不超过1024字节的现状,但这种方式不是通用的.

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class FileTest10 {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello-world.txt")) {while(true) {byte[] buf = new byte[1024];int n = is.read(buf);if(n == -1) {break;}//此处String的构造是基于前n个字节,而不是整个数组String s = new String(buf, 0, n);System.out.println(s);}}}
}

运行结果:

 

利用Scanner进行字符读取

上述栗子中,我们看到了对字符类型直接使用InputStream进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是Scanner类.

构造方法说明
Scanner(InputStream is, String charset)使用charset字符集进行is的扫描读取
import java.io.*;
import java.util.Scanner;public class FileTest11 {public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("hello-world.txt")) {try (Scanner sc = new Scanner(is, "UTF-8")) {while (sc.hasNext()) {String s = sc.next();System.out.println(s);}}}}
}

OutputStream概述

方法

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

重要:我们知道I/O的速度是很慢的,所以,大多OutputStream

为了减少设备操作的次数,再写数据的时候都会将数据暂时

写入内存的一个指定区域里,直到该区域满了或者其它指定

条件时才真正将数据写入设备中,这个区域一般称为缓冲区.

但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中.需要在最后或者合适的位置,调用flush(刷新)操作,

将数据刷新到设备中.

 说明

Output同样只是一个抽象类,要使用还需要具体的实现类.我们现在还是只关心写入文件中,所以使用FileOutputStream.

利用OutputStreamWriter进行字符写入

示例

注意,此处OutputStream默认情况下,会把之前的文件内容都清空掉,然后重新开始写(清空)

不是write引起的,而是打开操作引起的.

写文件的时候,也不是说,非得把文件内容清空,也可以使用追加写的方式,不清空文件内容,把新的内容写到文件末尾.

eg.OutputStream os = new FileOutputStream("test.txt", true);//将后面的append追加视为true即可.

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class FileTest12 {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("hello-world.txt")) {os.write('l');os.write('b');os.write('w');os.write('n');os.write('b');//不要忘记flushos.flush();}}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class FileTest13 {public static void main(String[] args) throws IOException {try(OutputStream os = new FileOutputStream("hello-world.txt")) {byte[] b = new byte[] {(byte)'G', (byte)'o', (byte)'o', (byte)'d'};os.write(b);//不要忘记flushos.flush();}}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class FileTest14 {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("hello-world.txt")) {byte[] b = new byte[] {(byte)'b', (byte)'y', (byte)'e'};os.write(b, 0, 3);//不要忘记flushos.flush();}}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class FileTest15 {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("hello-world.txt")) {String s = "Nothing";byte[] b = s.getBytes();os.write(b);//不要忘记flushos.flush();}}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class FileTest16 {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("hello-world.txt")) {String s = "从今天开始这里叫卢本伟广场";byte[] b = s.getBytes("utf-8");os.write(b);//不要忘记flushos.flush();}}
}

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java网络编程01】网络原理初识

【Java网络编程01】网络原理初识 1. 网络通信基础概念 网络通信&#xff1a;网络互连的目的就是网络通信&#xff0c;即网络数据传输&#xff0c;再直白点而言就是不同主机的不同进程之间基于网络进行数据的传输交互。 那么&#xff0c;在组建的网络上有各种各样的主机&#…

Python量化交易- mplfinance库 -画K线图

mplfinance库 1. mplfinance 模块说明2. mplfinance安装3. mplfinance 模块 plot 基本用法参数typestylemake_addplot设置图表颜色 make_marketcolors添加图表样式 make_mpf_style 4. mplfinance 的基本K线图实现自定义风格和颜色图表尺寸调整、相关信息的显示添加完整移动平均…

Vue 实例创建流程

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

CentOs7 安装Mysql(5.7和8.0版本)密码修改跳过 超详细教程

CSDN 成就一亿技术人&#xff01; 今天出一期Centos下安装Mysql&#xff08;详细教程&#xff09;包括数据库密码跳过修改 CSDN 成就一亿技术人&#xff01; 目录 1.获取安装包 2.安装程序 安装下载的rpm包 查看安装包 修改5.7版本&#xff08;重要&#xff09; 安装M…

设置代码模板创建sql映射文件、Mybatis主配置文件

目录 1、Sql映射&#xff08;Sql Mapper&#xff09;文件的介绍 2、Mybatis的主配置文件的介绍 3、通过代码模板创建Sql映射文件 4、通过代码模板创建Mybatis主配置文件 1、Sql映射&#xff08;Sql Mapper&#xff09;文件的介绍 <?xml version"1.0" encod…

太太二字的由来?

“太太”这个称谓的由来可以追溯到周朝时期的“周室三母”。这三位贤妃分别是太姜、太任和太姒。她们以母仪天下的德范&#xff0c;养育和辅佐了开创太平盛世的数位君王&#xff0c;成为了夫君的良佐、胎教的典范。因此&#xff0c;后世尊称别人的妻子为“太太”&#xff0c;以…

13.XXL-JOB应用

XXL-JOB应用 1.介绍 XXL-JOB是大众点评员工徐雪里于2015年发布的分布式任务调度平台 2.XXL-JOB与Quartz的关系 老版本依赖Quartz的定时任务触发&#xff0c;在V2.1.0版本开始移除了Quartz 3.官方地址 官方文档&#xff1a;https://www.xuxueli.com/xxl-job/gitee&#xf…

面试经典 150 题 - 多数元素

多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&#xff1…

搜索引擎优化:利用Python爬虫实现排名提升

什么是搜索引擎优化&#xff08;SEO&#xff09; 搜索引擎优化&#xff08;SEO&#xff09;是通过优化网站内容和结构&#xff0c;提高网站在搜索引擎中的排名&#xff0c;从而增加网站流量和曝光度的技术和方法。SEO的目标是使网站在搜索引擎结果页面中获得更高这个过程包括吸…

windows11上安装虚拟机VMware

1、安装虚拟机&#xff08;待补充&#xff09; 第二步&#xff1a;安装VMware tools 实现windows文件上传到虚拟机中 1、安装好虚拟机后&#xff0c;查看虚拟机ip用Xshell连接虚拟机&#xff0c;并安装VMware tools(只有安装了VMware tools才能实现虚拟机和本机的文件共享。在…

python:socket基础操作(2)-《udp发送信息》

基础发送udp信息 1.导入socket模块 2.使用udp模块 3.发送内容 4.关闭套接字 很简单的4步就可以实现udp的消息发送 import socket # 导入模块udp_socket socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 使用ipv4 udp协议udp_socket.sendto(b"hello world",(&…

Bit Extraction and Bootstrapping for BGV/BFV

参考文献&#xff1a; [GHS12] Gentry C, Halevi S, Smart N P. Better bootstrapping in fully homomorphic encryption[C]//International Workshop on Public Key Cryptography. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 1-16.[AP13] Alperin-Sheriff J, Pe…

爬虫requests+综合练习详解

Day2 - 1.requests第一血_哔哩哔哩_bilibili requests作用&#xff1a;模拟浏览器发请求 requests流程&#xff1a;指定url -> 发起请求 -> 获取响应数据 -> 持续化存储 爬取搜狗首页的页面数据 import requests# 指定url url https://sogou.com # 发起请求 resp…

Leetcode刷题笔记题解(C++):670. 最大交换

思路&#xff1a; 假设数字 9923676 从右边找最大的数字的下标maxindex&#xff0c;然后向左边寻找小于最大数字的数的下标&#xff0c;直到找到最左边&#xff0c;交换两者得出新的数字&#xff0c;比如从左到右递减的数字如9621则不需要变化&#xff0c;在寻找中记录这种数…

系统问题排查定位流程

1. 系统问题排查范围定义 本次交流中描述的故障&#xff0c;主要是指系统级别的故障&#xff0c;对于某个具体的业务功能的故障&#xff0c;不在本次讨论范围内。下面描述的故障定位、排查&#xff0c;主要是指跨模块、跨项目级别的故障的定位、排查&#xff0c;包括软件、硬件…

LeetCode 热题 100 | 滑动窗口

目录 1 3. 无重复字符的最长子串 2 438. 找到字符串中所有字母异位词 菜鸟做题第二周&#xff0c;语言是 C 1 3. 无重复字符的最长子串 解题思路&#xff1a; 设置两个指针&#xff0c;左指针和右指针&#xff0c;二者之间形成窗口右指针不断右移&#xff0c;新字母被纳…

阿里云优惠整理,最新2024阿里云优惠政策解读

阿里云优惠政策有哪些&#xff1f;2024年阿里云优惠政策风向改了&#xff0c;之前一直是老用户与狗的营销策略&#xff0c;今年阿里云2核2G、3M固定带宽服务器99元居然开启了老用户购买权限&#xff0c;并且续费不涨价&#xff0c;阿里云这波操作确实让用户赢麻了&#xff0c;在…

X-Bogus加密参数分析与jsvmp算法(仅供学习)

文章目录 1. 抓包分析2. X-Bogus参数分析 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关注《爬虫…

任意模数多项式乘法MTT(可拆系数FFT)详解

更好的阅读体验 任意模数多项式乘法 前言&#xff1a; 在教练讲的时候脑子并不清醒&#xff0c;所以没听懂。后来自己看博客学会了&#xff0c;但目前只学了一种方法&#xff1a;可拆系数FFT。为了方便日后复习&#xff0c;决定先写下这个的笔记&#xff0c;关于三模数NTT下次…

【Linux】常见指令(一)

前言: Linux有许多的指令&#xff0c;通过学习这些指令&#xff0c;可以对目录及文件进行操作。 文章目录 一、基础指令1. ls—列出目录内容2. pwd—显示当前目录3. cd—切换目录重新认识指令4. touch—创建文件等5. mkdir—创建目录6. rmdir指令 && rm 指令7. man—显…