java字节流、字符流与转换流过程

 更新时间:2024年10月06日 15:04:33   作者:海波booy  
输入输出流(IO流)是数据传输的抽象概念,用于表示数据在设备间的传输过程,IO流按数据类型分为字符流和字节流,按数据流向分为输入流和输出流,字节流操作单个字节,字符流操作字符,在实际应用中,非文本文件多用字节流操作

IO流概述

IO流: 输入输出流(Input/Output)

  • 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流
  • 流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

IO流的分类

  • 根据处理数据类型的不同分为:字符流和字节流
  • 根据数据流向不同分为:输入流(读文件)和输出流(写文件)

字节流

字节输出流

OutputStream类定义

public abstract class OutputStream extends Object implements Closeable,Flushable

此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到InputSream类某个接收器要向文件中输出,使用FileOutputStream类

字节输入流

InputSream类定义

public abstract class InputStream extends Object implements Closeable

此抽象类便是字节输入流的所有类的超类。

FileInputStream从文件系统中的某个文件中获取输入字节

实例代码:

package com.booy;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ByteStreamDemo {
	//读文件
	public static void In() {
		//确定要写入的目标文件
		File file = new File("D:\\test\\test.txt");
		//构建一个文件输入流对象
		try {
			InputStream in = new FileInputStream(file);
			
			//把文件内容读出到程序中
			byte[] bytes = new byte[1024];
			StringBuilder buf = new StringBuilder();
			int len = -1;//表示每次读取的字节长度
			//把数据读入到数组中,并返回读取的字节数,当不等于-1时,表示读取到数据,等于-1表示文件已经读完
			while((len=in.read(bytes))!=-1) {
				//根据读取到的字节数组,再转换为字符串内容,添加到StringBuilder中
				buf.append(new String(bytes));
			}	
			//测试打印
			System.out.println("文件读入成功:"+buf);
			//关闭流
			in.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//写文件
	public static void Out() {
		//确定要输出的目标文件
		File file = new File("D:\\test\\test.txt");
		
		//构建一个文件输出流对象
		try {
			OutputStream out = new FileOutputStream(file,true);//true不写为替换
			//输出的内容
			String info = "小桥流水人家\r\t";
			//把内容写入到文件中
			out.write(info.getBytes());
			//关闭流
			out.close();
			System.out.println("文件写入成功!");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		Out();
		In();		
	}
}
/**
运行结果:
文件写入成功!
文件读入成功: 小桥流水人家
	小桥流水人家
*/

原理:

  • 输入/输出字节流操作原理,每次只会操作一个字节(从文件中读取或写入)
  • 字节操作流:默认每次执行写入操作会把数据直接写入文件

字符流

Writer

  • 写入字符流的抽象类。子类必须实现的方法仅有write(char[],int,int)、flush()和close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
  • 与OutputString一样,对文件的操作使用:FileWrite类完成。

Reader

  • 用于读取字符流的抽象类。子类必须实现的方法只有read(char[],int,int)和close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
  • 使用FileReader类进行实例化操作。

文件字符流会自带缓存,默认大小为1024字节,在缓存满后,或手动刷新缓存,或关闭流时会把数据写入文件中

如何选择使用字节流还是字符流:

  • 一般情况操作非文本文件时,使用字节流,操作文本文件使用字符流
  • 字符流的内部实现还是字节流

实例代码:

package com.booy;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

public class CharStreamtDemo {

	public static void main(String[] args) {
		Out();
		In();
	}
	private static void In() {
		File file = new File("D:\\test\\test.txt");
		try {
			Reader in = new FileReader(file);
			
			char[] cs = new char[1];
			StringBuilder sbl = new StringBuilder();
			int len = -1;
			while((len=in.read(cs))!=-1) {
				sbl.append(cs, 0, cs.length);
			}
			System.out.println(sbl);
			in.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private static void Out() {
		File file = new File("D:\\test\\test.txt");
		try {
			Writer out = new FileWriter(file,true);
			out.write(",古道西风瘦马");
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
/**
运行结果:
 小桥流水人家,古道西风瘦马
*/

代码实例:

指定一个盘符下的文件,将该文件复制到到指定的目录下

文件的复制:从一个输入流读取数据,然后通过输出流写入目标位置

package com.booy;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyFileDemo {
	public static void main(String[] args) {
		copy("D:\\test\\1.jpg","D:\\test\\my\\1.jpg");
	}
	private static void copy(String src,String target) {
		File srcFile = new File(src);
		File targetFile = new File(target);
		InputStream in =null;
		OutputStream out =null;
		try {
			in =new FileInputStream(srcFile);
			out =new FileOutputStream(targetFile);
			
			byte[] bytes = new byte[1024];
			int len = -1;
			while((len=in.read(bytes))!=-1) {
				out.write(bytes, 0, len);
			}			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally {
			try {
				if(in!=null)in.close();
				if(out!=null)out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

字节字符转换流

转换流,可以将一个字节流转换为字符流,也可以将一个字符流转换为字节流

  • OutputStreamWriter: 可以将输出的字符流转换为字节流的输出形式
  • InputStreamReader: 将输入的字节流转换为字符流输入形式

实例代码:

package com.booy;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.Charset;

public class ChangerStringDemo {

	public static void main(String[] args) throws FileNotFoundException {
		//InputStream in = new FileInputStream("D:\\test\\test.txt");
		//read(in);
		OutputStream out = new FileOutputStream("D:\\test\\test.txt");
		writer(out);
	}
	private static void read(InputStream in) {
		Reader reader = new InputStreamReader(in,Charset.defaultCharset());
		
		char[] cs = new char[1024];
		int len = -1;
		try {
			while((len=reader.read(cs))!=-1) {
				System.out.println(new String(cs,0,len));
			}
			cs.clone();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private static void writer(OutputStream out) {
		Writer writ = new OutputStreamWriter(out,Charset.defaultCharset());
		try {
			writ.write("夕阳西下,断肠人在天涯");
			writ.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springmvc多事务提交和回滚问题

    springmvc多事务提交和回滚问题

    本文介绍了Spring MVC中如何配置和使用多事务管理及回滚,重点内容包括配置jdbc.properties文件,使用Spring Framework 5.3版本新增的CompositeTransactionManager,以及如何在相关方法上添加@Transactional注解
    2024-09-09
  • pdf2swf+flexpapers实现类似百度文库pdf在线阅读

    pdf2swf+flexpapers实现类似百度文库pdf在线阅读

    这篇文章主要介绍了pdf2swf+flexpapers实现类似百度文库pdf在线阅读的相关资料,需要的朋友可以参考下
    2014-10-10
  • spring 注解验证@NotNull等使用方法

    spring 注解验证@NotNull等使用方法

    这篇文章主要介绍了spring 注解验证@NotNull等使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • java读取resource目录下文件的方法示例

    java读取resource目录下文件的方法示例

    这篇文章主要介绍了利用java读取resource目录下文件的方法,文中给出了详细的示例代码,相信对大家具有一定的参考借鉴,需要的朋友们下面来一起看看吧。
    2017-02-02
  • Mybatis 缓存原理及失效情况解析

    Mybatis 缓存原理及失效情况解析

    这篇文章主要介绍了Mybatis 缓存原理及失效情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringBoot框架搭建教程分享

    SpringBoot框架搭建教程分享

    这篇文章主要为大家详细介绍了SpringBoot框架搭建教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • springboot登陆过滤功能的实现代码

    springboot登陆过滤功能的实现代码

    这篇文章主要介绍了springboot登陆过滤功能的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • SpringBoot实现微服务通信的多种方式

    SpringBoot实现微服务通信的多种方式

    微服务通信是指在分布式系统中,各个微服务之间进行数据交互和通信的过程,今天我们将探讨在Spring Boot中实现微服务通信的多种方式,文章通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • Java圆柱体表面积和体积计算代码实例

    Java圆柱体表面积和体积计算代码实例

    这篇文章主要介绍了Java圆柱体表面积和体积计算代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • IntelliJ IDEA(2020.2)的下载、安装步骤详细教程

    IntelliJ IDEA(2020.2)的下载、安装步骤详细教程

    这篇文章主要介绍了IntelliJ IDEA(2020.2)的下载、安装步骤详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08

最新评论