java基础io流

字节缓冲区流的概述和使用

字节缓冲区流
字节流一次读写一个数组的速度比一次读写一个字节的速度快很多,  这是加入了数组这样的缓冲区效果,java本身在设计的时候,也是考虑到了这样的设计思想,所以提供了字节缓冲区流
字节缓冲输出流
BufferedOutputStream
字节缓冲输入流
BufferedInputStream
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*BufferedOutputStream(OutputStream out)
 *使用这种构造方法,它提供了一种默认的缓冲区大小,所以我们一般使用默认的就好了
 *字节缓冲区流仅仅提供缓冲区,而真正的底层的读写数据还得需要基本的流对象进行操作*/
public class BufferedStreamDemo {
	public static void main(String[] args) throws IOException {
 		//BufferedOutputStream(OutputStream out)
 		//FileOutputStream fos = new FileOutput("a.txt");
 		//BufferedOutputString bos = new BufferedOutStream(fos);
 		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
 		bos.write("hello".getBytes());
 		bos.close();
 		//BufferedInputStream(InputStream in)
 		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
 		//方式1:一次读取一个字节
 		int by;
 		while((by=bis.read())!=-1){
 			System.out.print((char)by);
 		//方式2:一次读取一个数组
 		byte[] bys = new byte[1024];
 		int len;
 		while((len=bis.read(bys))!=-1) {
 			System.out.print(new String(bys, 0, len));
 		}
	}
}

字节流四种方式复制AVI并测试效率

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputSream;
import java.io.IOException;
/*
 *把d:\\xxx.avi复制到当前项目目录下的copy.avi中
 *数据源:d:\\xxx.avi
 *目的地:copy.avi
 *四种方式比较复制效率
 *基本字节流一次读写一个字节
 *基本字节流一次读写一个字节数组
 *缓冲字节流一次读写一个字节
 *缓冲字节流一次读写一个字节数组
 *提示:
 *复制文件的时间计算可以采用System类的方法实现
 *public static long currentTimeMillis():返回以毫秒为单位的当前时间
 */
public class CopyAviTest {
	public static void main(String[] args) {
		//记录开始时间
		long start = System.currentTimeMillis();
		method1();
		method2();
		method3();
		method4();
		//记录结束时间
		long end = System.currentTimeMillis();
		System.out.println("共耗时:"+(end-start)+"毫秒");
	}
	//基本字节流一次读写一个字节数组
	private static void method2() throws IOException {
		//封装数据源
		FileInputStream fis = new FileInputStream("d:\\复制图片.avi");
		//封装目的地
		FileOutputStream fos = new FileOutputStream("copy.avi");
		byte[] bys = new byte[1024];
		int len;
		while((len=fis.read(bys))!=-1){
			fos.write(bys,0,len);
		}
	}
	//基本字节流一次读写一个字节
	private static void method1() throws IOException{
		//封装数据源
		FileInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片"))
		//封装目的地
		FileOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
		int by;
		while((by=fis.read())!=-1){
			fos.write(by);
		}
		fos.close();
		fis.close();
	}
	//缓冲字节流一次读写一个字节
	private static void method3() throws IOException {
		//封装数据源
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
		//封装目的地
		BufferedOutStream bos = new BufferedOutStream(new FileOutputStream("copy.avi"));
		int by;
		while((by=bis.read())!=-1){
			bos.write(by);
		}
		bos.close();
		bis.close();
	}
	//缓冲字节流读写一个字节数组
	private static void method4() throws IOException {
		//封装数据源
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
		//封装目的地的
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutStream("copy.avi"));
		byte[] bys = new byte[1024];
		int len;
		while((len=bis.read(bys))!=-1){
		bos.write(bys,0,len);
		}
		bos.close();
		bis.close();
	}
	private static void method3() throws IOException {
		//封装数据源
		FileInputStream fis = new FileInputStream("d:\\复制图片.avi");
		//封装目的地
		FileOutputStream fos = new FileOutputStream("copy.avi");
		byte[] bys = new byte[1024];
		int len;
		while((len=fis.read(bys))!=-1){
			for.write(bys,0,len);
		}
		fos.close();
		fis.close();
	}
} 	

转换流出现的原因

由于字节流操作中文不是特别方便,所以,java就提供了转换流。
转换流 = 字节流+编码表

String类中的编码和解码问题

/*
 *编码
 *把看得的懂的变成看不懂的
 *public byte[] getBytes(String charseName) throws UnsupportedEncodingException
 *使用指定的字符集将此String 编码为byte序列,并将结果存储到一个新的byte数组中
 *解码
 *把看不懂的变成看得懂的
 *public String(byte[] bytes,String charsetName)
 *通过使用指定的charset解码指定的byte数组,构成一个新的String
 */
public class StringDemo {
	public static void main(String[] args){
		//定义一个字符串
		String s = "你好"//编码
		byte[] bys = s.getBytes();
		//默认编码GBK
		//[-60,-29,-70,-61]
		//byte[] bys = s.getBytes("GBK");
		//[-60,-29,-70,-61]
		//byte[] bys = s.getBytes("UTF-8");
		//[-28,-67,-96,-27,-91,-61]
		System.out.println(Arrays.toString(bys));
		//解码
		//String ss = new String(bys);
		String ss = new String(bys,"GBK");
		System.out.println(ss);
	}
}

转换流中的编码和解码问题

/*
 *import java.io.FileNotFoundException;
 *import java.io.FileOutputStream;
 *import java.io.OutputStreamWriter;
 *转换流其实就是一个字节流
 *OutputStreamWrite 字符输出流
 *public OutputStreamWrite(OutputStream out):根据默认编码把字节流的数据转换为字符流
 *public OutputStreamWrite(OutputStream out,String charsetName):根据指定编码把字节流转换为字符流
 *InputStreamReader字符输入流
 *public InputStreamReader(InputStream in):用默认的编码
 *public InputStreamReader(InputStream in,String charsetName):用指定的编码读数据
 */
public class ConversionStreamDemo{
	public static void main(String[] args) throws IOException {
		OutputStreamWrite osw = new OutputStreamWrite(new FileOutputStream("osw.txt"),"UTF-8");
		//调用写数据的方法
		osw.write("你好")//释放资源
		osw.close();
		System.out.println("-------")
	
		InputStreamReader isr = new InputStreamReader(new FileInputStream("osw.txt"),"UTF-8");
		int ch;
		while((ch=isr.read())!=-1){
			System.out.print((char)ch);
		}
		//释放资源
		isr.close();
	}
}

OutputStream写数据的5种方式

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/*
 *OutputStreamWrite写数据方法;
 *public void write(int c):写一个字符
 *public void write(char[] cbuf):写一个字符数组
 *public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
 *public void write(String str):写一个字符串
 *public void write(String str,int off,int len):写一个字符串的一部分
 */
public class OutputStreamWriteDemo {
	public static void main(String[] args) throws IOException {
		//创建字符输出流对象
		OutputStreamWrite osw = new OutputStreamWriter(new FileOutputStream("b.txt"));
		//public void write(int c):写一个字符
		osw.write(97);
		osw.write('a');
		//1字符=2字节
		//文件的数据存储单位是字节
		//public void write(char[] cbuf):写一个字符数组
		char[] chs = {'a','b','c','d','e'};
		//osw.write(chs,1,3);
		//osw.write("hello");
		//void flush():刷新该流的缓冲
		//osw.flush();
		osw.close();
	}
}

InputStreamRead读数据的2种方式

/*
 *InputStreamReader读数据方法
 *public int read():一次读一个字符
 *public int read(char[] cbuf):一次读取一个字符数据
*/
public class InputStreamReaderDemo {
	public static void main(String[] args) throws IOException {
		//创建字符输入流对象
		InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
		InputStreamReader isr = new InputStreamReader("OutputStream");
		//public int read():一次读取一个字符
		int ch;
		which((ch=isr.read())!=-1){
			System.out.print((char)ch);
		}
		//public int read(char[] cbuf):一次读取一个字符数组
		char[] chs = new char[1024];
		int len;
		while((len=isr.read(chs))!=-1) }
			System.out.print(new String(chs,0,len));
		}
		//释放资源
		isr.close();
	}
}

字符流的练习之复制java文件

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/*
 *把当前项目目录下的StringDemo.java内容复制到当前项目目录下的Copy.java
 *数据源:StringDemo.java --- 读数据 --- 字符流 --- InputStreamReader
 *目的地:Copy.java --- 写数据 --- 字符流 --- OutputStreamWriter
*/
public class CopyJavaTest {
	public static void main(String[] args) throws IOException {
		//封装数据源
		InputStreamReader isr = new InputStreamReader(new FileInputStream("StringDemo.java"));
		//封装目的地
		OutputStreamWrite osw = new OutputStreamWriter(new FileOutputStream("Copy.java"));
		//读写数据
		//方式1:一次读写一个字符
		int ch;
		while((ch=isr.read())!=-1){
			osw.write(ch);
		}
		//方式2:一次读写一个字符数组
		char[] chs = new char[1024];
		int len;
		while((len=isr.read(chs))!=-1){
			osw.write(chs,0,len);
		}
		//释放资源
		osw.close();
		isr.close();
	}
}

改进版

/*
 *把当前项目目录下的StringDemo.java内容复制到当前项目目录下的Copy.java中
 *准换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简单我们的书写,转换流提供了对应的子类。
 *FileWriter:用来写入字符文件的便捷性:OutputStreamWriter
 *FileReader:用来读取字符文件的便捷性:InputStreamReader
 *OutputStreamWriter = FileOutputStream + 编码表(GBK)
 *FileWriter = FileOutputStream + 编码表
 *FileWriter(String fileName)
 *
 *InputStreamReader = FileInputStream + 编码表
 *FileRead = FileInputStream + 编码表
 *FileReader(String fileName)
 *
 *数据源:StringDemo.java --- 读数据 --- 字符流 ---InputStreamReader --- FileReader
 *目的地:Copy.java --- 写数据 --- 字符流 --- OutputStreamWriter --- FileWriter
*/
public class CopyJavaTest2 {
	public static void main(String[] args) throws IOException {
		//封装数据源
		FileReader fr = new FileReader("StringDemo.java");
		//封装目的地
		FileWriter fw = new FileWriter("Copy.java");
		//读写数据
		//一次读写一个字符
		int ch;
		while((ch=fr.read())!=-1){
			fw.write(chs,0,len);
		}
		//释放资源
		fw.close();
		fr.close();
	}
}

字符缓冲区流的概述和使用

import java.io.BufferedWriter;
import java.io.FileWriter;
/*
 *字符缓冲区流:
 *BufferedWriter:
 *将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
 *构造方法:BufferedWriter(Writer out)

 *BufferedReader;
 *从字符输入流读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
 *构造方法:BufferedReader(Reader in)
*/
	public static void main(String[] args) throws IOException {
		//创建字符缓冲输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
		//调用写数据的方法
		bw.write("hello");
		//释放资源
		bw.close();

		//创建字符缓冲输入流对象
		BufferedReader br = new BufferedReader(new FileReader("BufferedStreamDemo.java"));
		//方式1:一次读取一个字符
		int ch;
		while((ch=br.read())!=-1) {
			System.out.print((char)ch);
		}	
		//方式2:一次读取一个字符数组
		char[] chs = new char[1024];
		int len;
		while((len=br.read(chs))!=-1) {
			System.out.print(new String(chs,0,len));
		}
		//释放资源
		br.close();
	}
}

字符缓冲区流的练习之复制文本文件

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWrite;
import java.io.IOException;
/*
 *把项目目录下的a.txt内容复制到项目目录下的b.txt中
 *数据源:a.txt---读数据---字符流---InputStreamReader---FileReader---BufferedReader
 *目的地:b.txt---写数据---字符流---OutputStreamWriter---FileWriter---BufferedWriter
*/
public class CopyText {
	public static void main(String[] args) throws IOException{
		//封装数据源
		BufferedReader br = new BufferedReader(new FileReader("a.txt"));
		//封装目的地
		BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
		//读写数据
		//一次读写一个字符数组
		char[] chs = new char[1024];
		int len;
		while((len=br.read(chs))!=-1) {
			bw.write(chs,0,len);
		}
		//释放资源
		bw.close();
		br.close();
	}
}

字符缓冲区流的特殊功能

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/*
 *特殊功能
 *BuffereredWriter
 *void newLine():写入一个行分隔符,这个行分隔符是由系统确定的
 *BufferedReader
 *String readLine()
 */
public class BufferedStreamDemo {
	public static void main(String[] args) throws IOException {
		//创建字符缓冲输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
		//写数据
		for(int x=0;x<3;x++) {
			bw.write("hello9");
			
		}
		//释放资源
		bw.close();
		//创建字符缓冲输入流对象
		BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
		//读取一次
		String line = br.readLione();
		System.out.println(line);
		//最终代码
		String line;
		while((line=br.readLine())!=null) {
			System.out.println(line);
		}
		br.close();
	}	
}

字符缓冲区流的特殊功能复制java文件,文本文件

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
 *字符缓冲流特殊功能复制java文件
 *数据源:
 *BufferedStreamDemo.java --- BufferedReader
 *目的地:
 *Copy.java---BufferedWriter
/*
public class CopyJavaTest {
	public static void main(String[] args) throws IOException {
		//封装数据源
		BufferedReader br = new BufferedReader(new FileReader("BufferedStreamDemo.java"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
		//读写数据
		String line;
		while((line=br.readLine())!=null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		//释放资源
		bw.close();
		br.close();
	}
}
/*
 *需求:5种方式复制文本文件
 *数据源:d:\\xxx.txt
 *目的地:yyy.txt
 *5种方式:
 *基本字符流一次读写一个字符
 *基本字符流一次读写一个数组
 *缓冲字符流一次读写一个字符
 *缓冲字节流一次读取一个字符数组
 *缓冲字符串一次读写一个字符串
 */
public class CopyFileTest {
	public static void main(String[] args) {
		method1();
		method2();
		method3();
		method4();
		method5();
	}
	//基本字符流一次读取一个字节
	private static void method1() throws IOExeption {
		FileReader fr = new FileReader("d:\\xxx.txt");
		FileWriter fw = new FileWriter("yyy.txt");
		int ch;
		while((ch=fr.read())!=-1){
			fw.write(ch);
		}
		fw.close();
		fr.close();
	}
	//基本字符流一次读取一个字符数组
	private static void method2() throws IOException {
		FileReader fr = new FileReader("d:\\xxx.txt");
		FileWriter fw = new FileWriter("yyy.txt");
		char[] chs = new char[1024];
		int len;
		while((len=fr.read(chs))!=-1){
			fw.write(chs,0,len);
		}
		fw.close();
		fr.close();
	}
	//缓冲字符流一次读取一个字符
	private static void method3() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("d:\\xxx.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));
		int ch;
		while((ch=br.read())!=-1) {
			bw.write(ch);
		}
		bw.close();
		br.close();
	}
	//缓冲字符流一次读写一个字符数组
	private static void method4() throws IOException {
		FileReader br = new FileReader("d:\\xxx.txt");
		FileWriter bw = new FileWriter("yyy.txt");
		char[] chs = new char[1024];
		int len;
		while((len=fr.read(chs))!=-1){
			bw.write(chs,0,len);
		}
		bw.close();
		br.close();
	}
	//缓冲字符流读写一个字符串
	private static void method5() throws IOException {
		FileReader br = new FileReader("d:\\xxx.txt");
		FileWriter bw = new FileWriter("yyy.txt");
		char[] chs = new char[1024];
		int len;
		while((len=fr.read(chs))!=-1){
			bw.write(chs,0,len);
		}
		bw.close();
		br.close();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值