一.相对论和IO流之说
Stream
的意思是有方向性的流动的液体/电流,强调过程I/O Stream
可以看作是输入/输出方向的流体从相对论的角度看待 I/O流
如.国家水库向你家输水,国家水库相当于输出水,你家相当于输入水。
使用说I/O要有源头,要有目的,中间还有要管道。
二.汉语文学理解IO流与图解IO流
1.汉语文学理解IO流
数据源可以是图中1.程序,2.文件或数据库,3.服务器。 从图中可以理解对程序而言读取软件是input。
三.InputStream和OutPutStream
终极静态父类
InputStream
和OutputStream
InputStream
专门管理数据的读相关操作,OutputStream
专门管理数据的写相关操作。
四.FileInputStream字节流读取文件
leInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等。
public void inputFile() throws IOException {
// 要抛出异常IOException
FileInputStream fileInputStream = new FileInputStream("D:\\touch.txt");
// 1. read( )函数 :该函数的返回值为int数值,
// 表示读取的字符对应的ascii码,当返回为-1表示读取到文件末尾;
int temp = 0;
while ( (temp = fileInputStream.read()) != -1) {
System.out.print((char)temp);
}
// 关闭IO流资源,防止内存占用
fileInputStream.close();
}
五.FileOutPutStream字节流写入文件
public void inputFile() throws IOException {
// 要抛出异常IOException
FileOutputStream fileOutputStream = new FileOutputStream("D:\\touch.txt");
// getBytes()方法可以将字符串转换成数组
byte[] bytes = "fuck_PPT".getBytes();
// 使用write()方法写入
for (int i = 0; i < bytes.length; i++) {
fileOutputStream.write(bytes[i]);
}
fileOutputStream.close();
}
六.buff缓冲复制文件
public void inputFile() throws IOException {
FileInputStream fileInputStream = new FileInputStream("D:\\照片\\one.png");
FileOutputStream fileOutputStream = new FileOutputStream("D:\\照片\\two.png");
// 缓存区,以1KB的大小读,连续读取写入
// 如果没有缓冲区,会以一个字节一个字节的搬运,非常慢。
byte[] buff = new byte[1024];
int temp = 0;
// 读
while ( (temp = fileInputStream.read(buff)) != -1) {
// 写,括号内表示从零开始以1KB为单位持续搬运。
fileOutputStream.write(buff,0,temp);
}
fileInputStream.close();
fileOutputStream.close();
}
七.buffered字节缓冲流、装饰设计模式
上面说了定义缓冲区可以加快读取与写入。其实Java中已经存在带有缓冲区的字节流。可以更快的读取与写入。所以上面的复制照片有,更好的方法。
public void copyFileBase() throws IOException{
// 装饰设计模式
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("D:\\照片\\one.png"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("D:\\照片\\two.png"));
int by;
while ( (by = bufferedInputStream.read()) != -1){
bufferedOutputStream.write(by);
}
bufferedInputStream.close();
bufferedOutputStream.close();
}
八.FileReader和FileWriter,俩专门来搞定txt文件
上面说的是字节流,可以读取与写入任何文件。下面的字符流,只能读取与写入txt文件。
FileReader
类从InputStreamReader
类继承而来。该类按字符读取流中数据FileWriter
类从OutputStreamWriter
类继承而来。该类按字符向流中写入数据@Test
public void fileReaderTest() throws IOException{
FileReader fileReader = new FileReader("D:\\1.txt");
int ch;
while ( (ch = fileReader.read()) != -1){
System.out.print((char) ch);
}
fileReader.close();
}
@Test
public void fileWriteTest() throws IOException{
FileWriter fileWriter = new FileWriter("D:\\2.txt");
fileWriter.write("your fuck");
fileWriter.close();
}
查看源码其实就可以知道,字符流的本质就是调用字节流。所以他们的字符缓存流与字符缓存流调用方法一样。
九.BufferedReader、BufferedWriter
@Test
public void bufferedWriterTest() throws IOException{
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("D:\\3.txt"));
bufferedWriter.write("one");
// 换行newLine()方法
bufferedWriter.newLine();
bufferedWriter.write("two");
bufferedWriter.close();
}
@Test
public void bufferedReaderTest() throws IOException{
BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\3.txt"));
// 字符流,所以使用String接收更合理
String ch;
// 使用readLine()方法取,可以一行一行的读,
// 使用的是String,所以不能为空
while ( (ch = bufferedReader.readLine()) != null){
System.out.println(ch);
}
bufferedReader.close();
}
十.各种流的体验
java.io (Java SE 11 & JDK 11 ) (runoob.com)
十一.Apache Common IO
引入架包:Maven Repository: commons-io » commons-io (mvnrepository.com)
package com.io;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
public class IoTest {
@Test
public void CommonsIoTest() throws IOException {
File fileB = new File("D:\\1.txt");
// 判断文件是否存在,不存在创建
if(!fileB.exists()){
fileB.createNewFile();
}
// 文件添加内容
FileUtils.writeLines(fileB,new ArrayList<>(Collections.singleton("\n you you")),true);
}
}
其他方法:Commons IO 官方文档-阿里云开发者社区 (aliyun.com)