IO流 (二) ----- 文件流
相关文章:
- 《IO流 (一) ----- 基本概念和File类》
- 《IO流 (二) ----- 文件流》
- 《IO流 (三) ----- 字符流和字符缓冲流》
- 《IO流 (四) ----- 转换流和标准字节输出流》
- 《IO流 (五) ----- 对象数据的序列化和反序列化》
本篇涉及内容
FileInputStream详解
FileOutputStream详解
FileInputStream和FileOutputStream结合使用实现文件拷贝
文件字节输入流FileInputStream详解
一、关于文件字节输入流FileInputStream的基本内容
能实现的效果:通过该流可以读取硬盘中的文件数据到内存中来。
创建并且关闭一个文件字节输入流的完整过程
public static void main(String[] args) {FileInputStream fis = null;try {// 绝对路径可以写为:"C:/Users\yukea/Desktop/JavaProject/Test/FileInputStreamTest.txt",也可以用相对路径fis = new FileInputStream("C:\\Users\yukea\\Desktop\\JavaProject\\Test\FileInputStreamTest.txt");} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}
二、FileInputStream的常用方法
使用
int read()
读取文件中的数据——返回读取到的字节本身try {//.txt文件中存储了abc三个字符,在windows中占用3个字节空间fis = new FileInputStream("C:\\ProgramData\\Test\\FileInputStreamTest.txt");fis.read();// 返回97fis.read();// 返回98fis.read();// 返回99fis.read();// 返回-1}
原理:有一个指针会随着Read()方法的调用而前移,首次调用Read()方法时指针前移指向.txt文件中的第一个字节,调用完后返回该字节数,后面每调用一次Read()方法则指针向后移动一位并且返回对应的字节数,直到指针指向文件末尾时返回-1。
使用
int read(byte[] b)
读取文件中的数据——返回读取到的字节数量try {//.txt文件中存储了abcdef五个个字符fis = new FileInputStream("C:\\ProgramData\\Test\\FileInputStreamTest.txt");byte[] bytes = new byte[4];fis.read(bytes);// 返回4,读取到了4个字节到bytes数组中System.out.println(new String(bytes));// 打印 "abcd" 字符串fis.read(bytes);// 返回2,读取到了2个字节到bytes数组中System.out.println(new String(bytes));// 打印 "efcd" 字符串fis.read(bytes);// 返回-1,没有读取到其他字节}
原理:每次最多读取bytes数组长度的字节。
第一次读取:{97, 98 ,99 ,100} 4个字节保存到了字节数组中,返回读取到的字节数量4
第二次读取:{101, 102, 99, 100} 文件中的后两个字节覆盖到了字节数组中,返回读取到的字节数量2
第三次读取:返回-1,因为已读取到文件末尾int read(byte[] b)
结合String构造方法使用——读取多少字节转换为多长字符串try {//.txt文件中存储了abcdef五个个字符fis = new FileInputStream("C:\\ProgramData\\Test\\FileInputStreamTest.txt");byte[] bytes = new byte[4];int readCount = 0;readCount = fis.read(bytes);// 返回4,读取到了4个字节到bytes数组中System.out.println(new String(bytes, 0, readCount));// 打印 "abcd" 字符串readCount = fis.read(bytes);// 返回2,读取到了2个字节到bytes数组中System.out.println(new String(bytes, 0, readCount));// 打印 "ef" 字符串}
int available()
——返回文件中剩余的没有读取到的字节数量long skip(long n)
——跳过几个字节不读取int available()
配合int read(byte[] b)
——不使用循环,一次性读取完文本中的字节。try {fis = new FileInputStream("Test/FileInputStreamTest.txt");// 创建一个长度恰好为文本字节数量的bytes数组byte[] bytes = new byte[fis.available()];// 把文件中的字节读取到bytes数组中fis.read(bytes);// bytes数组转为字符串String s = new String(bytes);System.out.println(s);// 输出"莫莫你好hello"}
三、从硬盘上读取一个.txt文件内容到内存中的流程
先创建一个.txt文件
代码实现——将文件内容保存到一个String字符串上
FileInputStream fis = null;try {fis = new FileInputStream("Test/FileInputStreamTest.txt");byte[] bytes = new byte[12];int readCount = 0;StringBuffer sb = new StringBuffer(10);while ((readCount = fis.read(bytes)) != -1) {String s = new String(bytes, 0, readCount);sb.append(s);}System.out.println(sb);// 打印 "莫莫你好hello"} catch (IOException e) {e.printStackTrace();} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}
文件字节输出流FileOutputStream详解
一、关于文件字节输出流FileOutputStream的基本内容
能实现的效果:通过该流可以将内存中的数据写入到硬盘数据文件中去。
创建并且关闭一个文件字节输出流的完整过程
try {// 如果文件不存在则会自动新建一个文件fos = new FileOutputStream("Test/FileOutputStreamTest.txt");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}
二、FileOutputSream的常用方法
将指定字节数组中的字节写到流中的方法
(1)void write(byte[] b)
(2)void write(byte[] b, int off, int len)
try {fos = new FileOutputStream("Test/FileOutputStreamTest.txt");byte[] bytes = {97, 98, 99, 100};fos.write(bytes);// 将数组中的全部字符写入fos.write(bytes, 0, 2);// 将数组中从下标0开始写入2个长度的字节(接着上面写入的字节后面)// 写完后一定要刷新!fos.flush();// 刷新后该文本文件中出现abcdab}
注意:使用上述方法将字节写入文件,写入之前会先清空文件的内容再进行写入。
以追加的方式写入:fos = new FileOutputStream("Test/FileOutputStreamTest.txt", ture);
配合String类的
byte[] getBytes()
方法使用——将字符串转换为字节数组,向文件中写入字符串try {FileOutputStream fos = new FileOutputStream("Test/FileOutputStreamTest.txt");String s = "莫莫大包子";fos.write(s.getBytes());fos.flush();}
FileInputStream和FileOutputStream的结合使用实现文件拷贝
String originFilePath = "/Users/apple/Downloads/FinalVideo_1591626463.139785.MOV";String targetFilePath = "Test/copyFile/copiedFile2.MOV";FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream(originFilePath);fos = new FileOutputStream(targetFilePath);// 一次读取1MB byte[] bytes = new byte[1024 * 1024];int readCount = 0;// 读取多少写入多少while ((readCount = fis.read(bytes)) != -1) {fos.write(bytes, 0, readCount);}fos.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}
IO流 (二) ----- 文件流相关推荐
- C++ 流的操作 | 初识IO类、文件流、string流的使用
文章目录 前言 IO头文件 iostream fstream sstream 流的使用 不能拷贝或对 IO对象 赋值 条件状态与 iostate 类型 输出缓冲区 文件流 fstream类型 文件模式 ...
- java流与文件——流
[0]README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件--流 的相关知识: 0.2) 输入流和输出流(InputStream 和 OutputS ...
- php接收流文件,PHP传输文件流及文件流的保存
什么是文件流 在HTTP数据传送过程中,传输一方直接以二进制流方式传送文件内容,这样就形成了一个文件流: 文件流的接收通常涉及到预定义变量函数 $HTTP_RAW_POST_DATA 和 file_g ...
- Linux C: IO库函数,文件流缓冲,变参函数
一.I/O 库函数与系统调用 在Linux 中有很多关于IO(输入输出)的库函数,其大部分都存在 stdio.h 头文件中.例如fopen,fread,fwrite,fseek,fclose , 这些 ...
- Java IO流之【缓冲流和文件流复制文件对比】
与文件流相比,缓冲流复制文件更快 代码: package Homework;import java.io.BufferedOutputStream; import java.io.File; impo ...
- Java IO流之文件流
一.文件流分类 二.FileInputStream 三.FileOutputStream 四.FileReader 五.FileWriter 六.文件流应用 1,复制或剪切文件 2,读取文件信息 应用 ...
- .NET中的IO操作之文件流
读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不 ...
- C++ IO类(3) 文件流
我们可以通过文件流来控制文件的输入以及输出: fstream: 创建一个未绑定的文件流 fstream fstrm("file.txt") 创建一个fstream,并打开名为s的 ...
- .net 流(Stream) - 文件流、内存流、网络流
一.文件流 FileStream FileStream流继承与Stream类,一个FileStream类的实例实际上代表一个文件流,使用FileStream类可以对文件系统上是文件进行读取.写入.打开 ...
最新文章
- 这个AI让马斯克头秃,还能帮他设计特斯拉
- Spring Security 实战:基于配置的接口角色访问控制
- 全球规模最大的全浸没式液冷数据中心落户杭州余杭
- 突然被工信部重罚!阿里云到底干了啥?
- Git笔记(21) 分布式工作流程
- 澎思科技获洪泰基金千万级天使轮融资,深耕AI+安防行业
- javascript 为对象中的二级元素赋值 1006 Uncaught TypeError: Cannot set property ‘‘ of undefined
- IEEE 浮点数编码规则
- 思科模拟器静态路由设置,以及rip路由设置
- gmp新附录 计算机系统,GMP新附录:计算机系统.doc
- Matlab 工作区变量和 MAT 文件
- Android Studio 升级到3.0后出现编译错误\.gradle\caches\transforms-1\files-1.1\*****-release.aar
- python 中sample是什么_python中的sample什么意思
- template用法
- 有关《家》的经典歌曲_浅谈艺术歌曲《家》的演唱
- 世界上最有名和哲理的17句话
- 請問下需要一套繁體字多商戶商城+跑腿外賣系統
- 郭平欣老先生在恢复中
- 注册商标的流程及费用是怎样的?
- mysql重启数据库实例命令_mysql重启数据库实例命令