一、流
参考:https://blog.csdn.net/sinat_37064286/article/details/86537354
https://blog.csdn.net/yudianxiaoxiao/article/details/113602542
一、字节流传输
1、直接用字节流输入输出
2、中间用字节流缓冲区输入输出
1.1.1、按功能分
-
节点流:以从或向一个特定的地方(节点)读写数据。如FileInputStream、OutputStream、FileReader、FileWriter
-
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedInputStream、BufferedOutputStreamBufferedReader、BufferedWriter、InputStreamReader、OutputStreamWriter。
处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装.
1.1.2、按有无缓冲分
还有一种流是缓冲流,区别于没有缓冲的流。
因为程序和内存交互很快,而程序和磁盘交互是很慢的,这样会导致程序出现性能问题。
为了减少程序与磁盘的交互,是提升程序效率,引入了缓冲流。
普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互。这样,在总数据量不变的情况下,通过提高每次交互的数据量,减少了交互次数。
有缓冲的流,类名前缀是带有Buffer的,比如BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
package sunyard.fuza.month_2005;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 复制图片
* @author
*
*/
public class Sream1 {
public static void main(String[] args) throws Exception {
FileInputStream file = new FileInputStream("D:/jpg/WordCount的流程分析.png");//字节输入流:从哪个目录下读
FileInputStream files = new FileInputStream("D:/jpg/WordCount的流程分析.png");
outputStream(file);//普通流复制文件
outputStreamBuffered(files);//缓冲流复制文件
}
//直接输出指定图片到指定文件夹
private static void outputStream(FileInputStream file) throws Exception{
FileOutputStream fileout = new FileOutputStream("D:/jpg/word.png"); //字节输出流:输出到哪个目录
int len = 0;
byte bytes[] =new byte[1024];
while((len = file.read(bytes)) !=-1){//这个是读取一个文件中的数存入bytes中在将bytes中的每一个分别赋值给len。
System.out.println(bytes); //如果还有值,那么len就不等于-1,那么就会循环的继续读取,直到读取完值为止。
//读取完了返回-1.退出循环
fileout.write(bytes); //从bytes数组里 往字节输出流里写数据
}
file.close();
fileout.close();
}
//1、创建一个字节输入流 in(指定从哪个目录下去读哪个文件)
//2、创建字节输出流out(指定输出数据写到哪个文件)
//3、从字节输入流in中读取数据存到数组bytes[]中
//4、将bytes[]数组数据写到write字节输出流out中
//5、关闭流
//利用缓冲区输出指定图片到指定文件夹
private static void outputStreamBuffered(FileInputStream files) throws Exception{
BufferedInputStream bi = new BufferedInputStream(files); //从指定文件读数据到 字节输入流 缓冲区
FileOutputStream fileout = new FileOutputStream("D:/jpg/wordBuffered.png"); //字节输出流:指定一个带目录文件的 输出流
BufferedOutputStream bs = new BufferedOutputStream(fileout);//从字节输出流缓冲区
byte[] bytes = new byte[1024];
int len = 0;
while((len = bi.read(bytes)) !=-1){//从字节输入流缓冲区读数据,存入bytes数组
System.out.println(bytes);
bs.write(bytes); //将bytes数组数据 写入字节缓冲区
bs.flush();
}
files.close();
bi.close();
fileout.close();
bs.close();
//1、创建字节输入流in
//2、创建字节输入流缓冲区buferedIn:从输入流in 读取数据到缓冲区(自动)
//3、创建字节输出流out
//4、创建字节输出流BufferedOut:将字节输出流缓冲区的数据输出到字节输出流中(自动)
//5、读取read字节输入流缓冲区数据buferedIn存入到bytes[]数组,返回len=-1时,读取到最后一行。
//6、将数组bytes[]数据,写入write到字节输出流缓冲区。
}
}
二、字节流和字符流转换、
1、以字节流输入输出
2、以字符流输入输出
package sunyard.fuza.month_2005;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Stream2 {
public static void main(String[] args) throws Exception{
FileInputStream f = new FileInputStream("D:/luck.txt"); //文件输入字节流
inputSteamRead(f);
FileReader r = new FileReader("D:/luck.txt");//文件输入字符流
readerWrite(r);
}
private static void inputSteamRead(FileInputStream f) throws Exception{
InputStreamReader ir = new InputStreamReader(f,"UTF-8");//输入字节流转字符流,格式:UTF-8,GBK中文出现乱码
BufferedReader br = new BufferedReader(ir); //字符流缓冲区
//可以合并:BufferedReader br = new BufferedReader(new InputStreamReader(f,"UTF-8"));
FileOutputStream o = new FileOutputStream("D:/words.txt"); //输出字节流到指定文件
OutputStreamWriter ow = new OutputStreamWriter(o,"UTF-8");//输出字符流转字节流:格式:UTF-8
BufferedWriter bw = new BufferedWriter(ow);//输出字符流缓冲区
String line = null;
while((line = br.readLine())!=null){//按行读取数据,最后一行读完返回null
System.out.println(line);
bw.write(line);
bw.write("\n");//换行
bw.flush();
}
f.close();
ir.close();
br.close();
o.close();
ow.close();
bw.close();
}
//1、创建文件输入字节流(从哪个目录下的文件读数据):FileInputStream
//2、将字节文件输入流按指定格式转为输入流:InputStreamReader
//3、根据字符输入流创建字符输入流缓冲区:BufferedReader存储字符输入流数据
//4、创建文件字节输出流(数据写如到哪个目录下的文件里):FileOutputStream
//5、将字符文件输出流按指定格式转为字节文件输出流:OutputStreamWriter
//6、创建字符输出流流缓冲区,存储从字符输入流缓冲区读write取的字符数据,并送到字符输出流
//7、读取字符输入流缓冲区数据到字符输出流缓冲区:write
//流动(像水流一样):1-2-3-7-6-5-4
private static void readerWrite(FileReader r) throws IOException{
BufferedReader br = new BufferedReader(r);//字符文件
FileWriter w = new FileWriter("D:/hello.txt");
BufferedWriter bw = new BufferedWriter(w);
String line = null;
while((line = br.readLine())!= null){
System.out.println(line);
bw.write(line);
bw.flush();
}
br.close();
w.close();
bw.close();
}
//1、创建文件字符输入流(读取指定文件数据):FileReader
//2、创建字符输入流缓冲区(存储字符输入流数据):BufferedReader
//3、创建字符输出流(输出数据到哪个文件):FileWriter
//4、创建字符输出流缓冲区(存储获取到的字符数据,输入到字符输出流):BufferedWriter
//5、读取字符输入流缓冲区数据:br.readLine()
//6、将从字符输入流缓冲区读到数据写入到字符出流缓冲区
//流动:1-2-3-6-5-4
}
package sunyard.fuza.month_2005;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
public class Stream {
public static void main(String[] args) throws Exception {
FileInputStream file = new FileInputStream("D:/luck.txt");//字节输入流||读
//InputStreamReader ir = new InputStreamReader(file,"Utf-8");
//BufferedReader br = new BufferedReader(ir);
BufferedReader br = new BufferedReader(new InputStreamReader(file,"UTF-8"));//字节转字符输入缓冲 ||读
//BufferedReader br = new BufferedReader(new InputStreamReader(file));//字节转字符输入缓冲 ||读
FileOutputStream outfile= new FileOutputStream("D:/hello.txt");//字节输出流||写
BufferedWriter bw = new BufferedWriter(new FileWriter("D:/words.txt"));//字符输出流||写
String line=null;
byte words[]= new byte[1024];
while((line = br.readLine()) != null ){
System.out.println(line);
bw.write(line);
bw.write("\n");
bw.flush();
words=line.getBytes();
outfile.write(words);
//outfile.write("\n");
}
file.close();
br.close();
outfile.close();
bw.close();
//1、创建文件输入字节输出流
//2、将字节文件输入流转换为字符输出流,在创建一个字符输入流缓冲区
//3、创建一个字节输出流:以字节形式数据写入目标文件
//4、new一个字符输出流(带指定输出文件)、作为字符输出流缓冲区的参数
//5、读取字符输出流缓冲区数据到字符:line = br.readLine()
//6、字符输出流缓冲区将数据写入指定文件
//7、将读取到字符数line转化为bytes[]数组,并写入字节输出流文件中
//流动:1-2-5-6-4-3 1-2-5-7
}
}
总结:字节流和字符流的其他区别:
1、字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。
用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。
2、字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了。
按功能不同分为 节点流、处理流