Java-IO流

一、流
参考: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、字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了。
按功能不同分为 节点流、处理流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的精简博客系统,源码+数据库+毕业论文+视频演示 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前企业对于博客信息的管理和控制,采用人工登记的方式保存相关数据,这种以人力为主的管理模式已然落后。本人结合使用主的程序开发技术,设计了一款基于Springboot开发的精简博客系统,可以较大地减少人力、财力的损耗,方便相关人员及时更新和保存信息。本系统主要使用B/S开发模式,在idea开发平台上,运用Java语言设计相关的系统功能模块,MySQL数据库管理相关的系统数据信息,SpringBoot框架设计和开发系统功能架构,最后通过使用Tomcat服务器,在浏览器中发布设计的系统,并且完成系统与数据库的交互工作。本文对系统的需求分析、可行性分析、技术支持、功能设计、数据库设计、功能测试等内容做了较为详细的介绍,并且在本文中也展示了系统主要的功能模块设计界面和操作界面,并对其做出了必要的解释说明,方便用户对系统进行操作和使用,以及后期的相关人员对系统进行更新和维护。本系统的实现可以极大地提高企业的工作效率,提升用户的使用体验,因此在现实生活中运用本系统具有很大的使用价。 关键词:博客管理;Java语言;B/S结构;MySQL数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值