⛅⛅书接上回⛅⛅
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练习生~♂️