开发者

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

目录
  • IO流概述
  • 字节流
    • 字节输出流
    • 字节输入流
  • 字节字符转换流
    • 总结

      IO流概述

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

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

      IO流的分类

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

      字节流

      字节输出流

      OutputStream类定义

      public abstract class OutputStream extends Object implements Closeable,Flushable

      此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到Inp编程utSream类某个接收器要向文件中输出,使用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

      python
      • 用于读取字符流的抽象类。子类必须实现的方法只有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.i编程o.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)android {
      				System.out.println(new String(cs,0,pythonlen));
      			}
      			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();
      		}
      	}
      }

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜