『Java练习生的自我修养』java-se进阶⁵ • 常用IO流
⛅⛅书接上回⛅⛅
IO之大,一篇文章放不下~ 前面我们已经对IO流有了一个大致的了解,在本文中我们先对上一篇文章中学到的内容做一个简单的总结,并将进一步学习各种IO流的使用方法。
🚀传送门🚀: 『Java练习生的自我修养』java-se进阶⁴ • IO流概览
💌💌 欢迎订阅专栏,Java进阶不迷路😘
☕☕ Java进阶攻坚克难,持续更新,一网打尽IO、注解、多线程…等java-se
进阶内容。
🍍前情提要:
🌵🌵任何程序都是有输入输出的,我们很难想象一个程序既不从用户那里得到点什么,也不向客户那里输出点什么东西。包括JavaWeb中的网络程序也需要接收客户端发来的请求,对请求内容进行一定的处理再发给客户端。任何一个程序都需要一种和外界打交道的方式,在Java语言中肯定也提供了处理输入输出的手段,我们叫它IO流。
🌴🌴前文中我们已经了解到Java中的IO流分为字节流与字符流,以及与之对应的四大抽象类InputStream、OutputStream,Reader、Writer,它们是所有IO流的父类~
🌻🌻IO流可以分为节点流,它们直接直接从数据源读取数据,最为常用,阅读时请注意本文的所有常用流都属于节点流,它们直接与数据源打交道,下面我们一起来看看IO流中有哪些常用的实现类…
🍏工具类:File
上篇文章的末尾使用了File这个类,详细了解IO流之前我们有必要先来简单看看File工具类。Java的世界中,万事万物皆对象,一个File类对象可以表示具体的一个文件,IO流的构造方法中除了可以使用文件的路径作为参数,还可以File对象。
File方法摘要:
常用方法 | 描述 |
---|---|
构造方法:File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 |
boolean exists() | 测试此抽象路径名表示的文件或目录是否存在 |
boolean mkdir() | 创建由此抽象路径名命名的目录 |
long length() | 返回由此抽象路径名表示的文件的长度 |
boolean delete() | 删除由此抽象路径名表示的文件或目录 |
boolean createNewFile() | 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件 |
👉🏻学会了没?没学会…其实只需要知道File类的构造方法可以把文件变成对象,而且这个对象可以用来作为IO流构造方法的参数就行了…
(* ̄0 ̄)ノ
🍉文件字节流
FileInputStream通过字节的方式读取文件,适合读取所有类型的文件(图像、视频、文本等)。FileOutputStream通过字节的方式写数据到文件中,同样适合所有类型的文件。
它的常用方法继承自抽象类InputStream与OutputStream,前面已经介绍过了,不再赘述,这里补充一个OutputStream下的flush()
方法,在使用write()
方法后数据不会立即写到磁盘中,而是将要写入的数据暂存到了内存,只有调用了flush()
后,数据才会写进磁盘。
🍦通过文件字节流实现一个拷贝图片的Demo~
public class Demo {
// IO流要声明异常,这里先都直接抛出,正确的做法是使用try...catch
public static void main(String[] args) throws IOException {
// 创建文件字节输入流对象
FileInputStream fis = new FileInputStream("E:/a/a.jpeg");
// 创建文件字节输出流对象
FileOutputStream fos = new FileOutputStream("E:/b/b.jpeg");
// 实现拷贝过程
int temp = 0;
while ((temp = fis.read()) != -1) {
fos.write(temp);
}
// 将数据从内存中写入到磁盘中
fos.flush();
// 关闭流
fis.close();
fos.close();
}
}
⭐看下效果(看来没翻车)
🍋文件字符流
文件字符流以字符为单位进行操作,如果我们处理的是文本文件,可以使用文件字符流。
🍦实现一个拷贝.txt文件的Demo~
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo {
public static void main(String[] args) {
// 字符流同字节流大同小异,步骤基本相同
// 代码规范,这次使用try...catch捕获异常
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("E:/a/a.txt");
fw = new FileWriter("E:/b/b.txt");
int temp = 0;
while ((temp = fr.read()) != -1) {
fw.write(temp);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fr != null)
fr.close();
if (fw != null)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
⭐看下效果:
🥝字符输出流
在Java的IO流中专门提供了用于字符输出的流对象PrintWriter。该对象具有自动行刷新缓冲字符输出流(不需要再调用flush()
方法),特点是可以按行写出字符串,并且可以通过println()
方法实现自动换行。
🍦向test.txt
中写入三行文字,每次直接写入一行~
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class Demo {
public static void main(String[] args) {
// 创建待写入字符串
String str1 = "你好";
String str2 = "Hello,World";
String str3 = "世界!";
PrintWriter pw = null;
try {
// 创建PrintWrite对象
pw = new PrintWriter("E:/test.txt");
// 写入字符,每次写入一行
pw.println(str1);
pw.println(str2);
pw.println(str3);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
// 关闭IO流
if (pw != null)
pw.close();
}
}
}
⭐看下效果:
🍓字节数组流
ByteArrayInputStream和ByteArrayOutputStream经常用在需要流和数组之间转化的情况。
字节数组输入流:
FileInputStream的数据源是文件,而ByteArrayInputStream是把内存中的“字节数组对象”当作数据源。
🍦从字符串数组中读取内容的Demo~
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) {
byte[] bytes = "Hello,World!".getBytes();
ByteArrayInputStream bis = null;
// 使用StringBuilder接收读取的内容
StringBuilder sb = new StringBuilder();
try {
// ByteArrayInputStream构造方法不需要声明异常
bis = new ByteArrayInputStream(bytes);
int temp = 0;
while ((temp = bis.read()) != -1) {
sb.append((char) temp);
}
} finally {
if (bis != null) {
// 构造方法不需要声明异常,但是close()方法需要
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 打印StringBuilder
System.out.println(sb);
}
}
⭐运行结果:
字节数组输出流:
将流中的数据写入到字节数组中。
🍦将'a'
、'b'
、'c'
三个字符写入到数组中的小Demo~
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
ByteArrayOutputStream bos = null;
byte[] bytes = null;
try {
// 创建字节数组输出流对象
bos = new ByteArrayOutputStream();
// 写入三个字符
// write()方法参数为int型变量,直接使用字符Java可以自动转换
bos.write('a');
bos.write('b');
bos.write('c');
// 写入的内容会缓存,使用toByteArray方法返回一个数组,将缓存内容输出
bytes = bos.toByteArray();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 输出数组看一下结果
System.out.println(Arrays.toString(bytes));
}
}
⭐运行结果:
🍍🍍🍍
创作不易,如果觉得本文对你有所帮助,欢迎点赞、关注、收藏。🙇🏻♀️
🍉🍉🍉
@作者:Mymel_晗,计算机专业练习时长两年半的Java练习生~🏃🏻♂️🏀
相关文章
- java基础—IO流——字节流的操作演示
- Java IO: FileInputStream
- Java IO: 其他字符流(下)
- Java IO: 其他字节流(上)
- 并发编程--JAVA AQS源代码简析
- 37 Java基础 总结 完结篇 知识串讲 Java语言初识 基础语法 流程控制 方法 数组 面向对象 内部类 异常 常用类 集合框架 IO流 多线程 网络编程 GUI 注解
- 第七节:详细讲解Java中的日期,java.util.date
- Tomcat 奔溃:java.lang.OutOfMemoryError: Java heap space
- 基于Java+MySQL实现(Web)企业仓库存储管理系统【100010160】
- Java日期时间使用总结
- Java判断Object对象是否为数组,Java判断Object对象是否为集合,Java判断数组是否包含某个值
- IO的详细解释:It's all about buffers: zero-copy, mmap and Java NIO
- Java学习-077-多线程10:线程资源同步问题实例演示
- 分布式技术EJB3_分库架构 - 【动力节点官网】北京Java …
- 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space
- Java_tomcat thread dump 分析
- Java编程常用数据转换:String与int互转、Date与String互转、BigDecimal与int比较(报错operator > cannot be applied to java.math.BigDecimal,int)
- Java操作Mongodb 保存/读取java对象到/从mongodb
- Java中RSA非对称密钥加解密使用示例
- Java transient关键字使用小记
- Java中IO流知识点总结
- [java][db]JAVA分布式事务原理及应用
- java定义和实现接口
- JAVA学习第三十三课(经常使用对象API) —迭代器
- “could not open `C:Program FilesJavajre7libamd64jvm.cfg”问题解决办法
- 获取Java正在执行的方法
- 【Java I/O 流】文件的操作——java.io.File 类详解
- Java IO字符流