java流:字符缓冲流,装饰设计模式,适配器设计模式,字节流

字符缓冲流之缓冲写出流BufferedWriter

package com.qianfeng.test;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*
 * 字符缓冲流:又叫字符缓冲区,是为了提高读写的能力,本身没有读写的能力,要想进行读写必须依靠字符流来实现。
 * 
 * 可以将缓冲流比作催化剂或者高速的小车。
 * 
 * 字符缓冲流分类:
 * 1.字符缓冲读入流:BufferedReader		辅助读,没有读的能力
 * 2.字符缓冲写出流:BufferedWriter		辅助写,没有写的能力
 * 
 */
public class Demo2 {

	public static void main(String[] args) throws IOException {
		
		//1.创建缓冲写出流
		BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("temp1.txt"));
		
		//2.写
		bufferedWriter.write("bingbing");
		/*
		 * 换行,优点:有跨平台性。
		 */
		bufferedWriter.newLine();
		bufferedWriter.write("bingbing2");
		
		//3.关闭流。a:关闭写出流  b:刷新  c:关闭缓冲写出流
		bufferedWriter.close();
	}
	
}

字符缓冲流之缓冲读入流BufferedReader

package com.qianfeng.test;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Demo3 {

	public static void main(String[] args) throws IOException {
		
		/*
		 * 1.字符缓冲读入流:BufferedReader		辅助读,没有读的能力
		 */
		//1.创建字符缓冲读入流的对象
		BufferedReader reader = new BufferedReader(new FileReader("temp1.txt"));
		
		//2.读
		//a:一次读一个字符
//		int num;
//		while((num = reader.read())!=-1){
//			System.out.print((char)num);
//		}
		
		//b:一次读多个字符
//		int num;
//		char[] arr = new char[4];
//		while((num = reader.read(arr))!=-1){
//			System.out.print(new String(arr,0,num));
//		}
		//c:一次读一行-readLine()
		//特点:不会将当前的换行符返回;返回值就是我们读到的内容,以字符串的形式返回。当返回null的时候说明读完了。
		String data = null;
		while((data = reader.readLine())!=null){
			System.out.print(data);
			System.out.println();//打印到控制台时使用的换行符。
		}
		
		//3.关闭流
		reader.close();
	}
}

使用字符缓冲流实现文件的复制

package com.qianfeng.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/*
 * 使用字符缓冲流实现文件的复制
 * 要求:1.将Demo1.java的内容复制到Demo1copy.java
 * 2.读的方式要采用三种
 */
public class Demo4 {

	public static void main(String[] args) throws IOException {
		
		//1.创建缓冲读入流和缓冲写出流
		BufferedReader reader = new BufferedReader(new FileReader("src\\com\\qianfeng\\test\\Demo1.java"));
		BufferedWriter writer = new BufferedWriter(new FileWriter("Demo1copy.java"));
		
		//2.读写
		//a:一个字符一个字符
//		int num;
//		while((num=reader.read())!=-1){
//			writer.write(num);
//		}
		
		//b:一次读多个字符
//		int num;
//		char[] arr = new char[10];
//		while((num=reader.read(arr))!=-1){
//			writer.write(arr,0,num);
//		}
		
		//c:一次读一行
		String data = null;
		while((data = reader.readLine())!=null){
			writer.write(data);
			writer.newLine();
		}
		
		//3.关闭流
		reader.close();
		writer.close();
		
	}
}

LineNumberReader类,设置、获取行号

package com.qianfeng.test;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

/*
 * LineNumberReader:是BufferedReader的子类,不能读,但是可以提高效率,
 * 特有功能:设置行号,获取行号。
 */
public class Demo5 {

	public static void main(String[] args) throws IOException {
		
		//1.创建缓冲流
		LineNumberReader lineNumberReader = new LineNumberReader(new FileReader("src\\com\\qianfeng\\test\\Demo2.java"));
		
		//设置行号
		//注意点:默认从0开始设置,从1开始记数。
		lineNumberReader.setLineNumber(0);
		
		//2.读
		String data =null;
		while((data=lineNumberReader.readLine())!=null){
			System.out.print(lineNumberReader.getLineNumber());//获取行号
			System.out.print(data);
			System.out.println();
		}
		
		//3.关闭流
		lineNumberReader.close();
		
	}
}

装饰设计模式、适配器设计模式

package com.qianfeng.test;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/*
 * 模拟BufferedReader
 * 分析:
 * 1.要属于流的体系
 * 2.要有一个Reader类型的成员变量
 * 3.要有一个带参数的方法接收外部的流对象
 * 4.模拟readLine()方法,实现读一行的功能
 * 5.重写close()方法
 */
public class Demo6 {
	public static void main(String[] args) throws IOException {
		MyBufferedReader myBufferedReader = new MyBufferedReader(new FileReader("temp1.txt"));
		
		String data = null;
		while ((data = myBufferedReader.readLine()) != null) {
			System.out.print(data);
			System.out.println();
		}
		
		myBufferedReader.close();
	}
}
//1.要属于流的体系
class MyBufferedReader extends Reader{
	
	//2.要有一个Reader类型的成员变量
	Reader reader;
	//3.要有一个带参数的方法接收外部的流对象
	public MyBufferedReader(Reader reader) {
		this.reader = reader;
	}
	
	//4.模拟readLine()方法,实现读一行的功能
	public String readLine() throws IOException {
		//a:准备一个临时的可变字符串存储当前行的内容
		StringBuffer stringBuffer = new StringBuffer();
		//b:开始读
		int num;
		while ((num = reader.read()) != -1) {
			if (num == '\r') {//继续读
				continue;
			}else if (num == '\n') {//停止读
				return stringBuffer.toString();
			}else {
				stringBuffer.append((char)num);
			}
		}
		
		//c:当文本没有内容时的处理:
		if (stringBuffer.length() == 0) {
			return null;
		}
		
		//d:当文本只有一行,没有换行符
		return stringBuffer.toString();
		
		//e:这里写提高效率的代码
	}
	
	
	
	@Override
	public int read(char[] cbuf, int off, int len) throws IOException {
		return 0;
	}

	//5.重写close()方法
	@Override
	public void close() throws IOException {
		//关闭读入流
		this.reader.close();
		//将自己关闭
		//this.close();
	}
	
}

/*
 * 装饰设计模式:基于已经实现的功能,提供增强的功能.
 * 装饰设计模式的由来就来自于对缓冲流的实现.
 * 
 * 特点:从缓冲流的角度讲解
 * 1.使流原来的继承体更加的简单
 * 2.提高了效率
 * 3.由于是在原有的基础上提高增强的功能,所以他还要属于原来的体系
 * 
 * 演示:如果自己设计装饰设计模式,怎么处理?
 * 1.原来的类  Test
 * 2.装饰类   BTest
 * 
 * 
 * 步骤:
 * 1.让BTest 继承自Test
 * 2.在BTest内有一个Test类型的成员变量
 * 3.通过BTest内一个带参数的构造方法接收外部传入的一个Test类型的对象,交给内部的Test的属性
 * 4.在实现功能的时候,调用传入的Test类型的对象实现原有的功能,自己实现增强的功能.
 * 
 * 
  * 适配器设计模式:通常可以变相的理解成装饰设计模式
 * 实例:要求在子类中只使用play方法
 * 
 * 分析:Dog是继承了ZiMidel类,ZiMidel类实现了Inter接口
 * 当Dog类想要实现Inter接口的一个方法的时候,如果直接实现Inter接口,就必须将所有的方法都实现,
 * 如果在Dog类与Inter接口之间插入一个类,让这个类去实现Inter接口的所有方法,作为这个类的子类只需要实现自己需要的方法
 * 
 * 我们将中间的这个类就可以成为适配器类
 * 
 */


interface Inter{
	public void play();
	public void song();
	public void run();
	public void eat();
	public void jump();
}
//适配器类
class ZiMidel implements Inter{

	@Override
	public void play() {
		
	}

	@Override
	public void song() {
		
	}

	@Override
	public void run() {
		
	}

	@Override
	public void eat() {
		
	}

	@Override
	public void jump() {
		
	}
	
}


//创建狗类,我只想让她实现play方法?
class Dog extends ZiMidel{
	public void play() {
		
	}
}

class Cat extends ZiMidel{
	public void song() {
		
	}
}

字节流

package com.qianfeng.test;

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

/*
 * 字符流:传输的是字节,只能用于字符的传输
 * 		字符读入流:Reader
 * 				read()	read(数组)
 * 		字符写出流:Writer
 * 				write(int c)  write(char[] arr)  write(String s)
 * 		缓冲字符读入流:BufferedReader
 * 				readLine()
 * 		缓冲字符写出流:BufferedWriter
 * 				newLine()
 * 
 * 字节流:传输的是字节,可以传输所有的内容
 * 		字节输入流:InputStream
 * 		字节输出流:OutputStream
 * 		缓冲字节输入流:BufferedInputStream
 * 		缓冲字节输出流:BufferedOutputStream
 * 
 * 
 * 
 */
public class Demo7 {

	public static void main(String[] args) throws IOException {
		
		//写
		writeFile();
		//读1
		readFile1();
		//读2
		readFile2();
		//读3
		readFile3();
		
	}
	
	//写
	public static void writeFile() throws IOException{
		//创建字节写出流
		OutputStream outputStream = new FileOutputStream("temp2.txt");
		outputStream.write("bingbing".getBytes());//使用默认的格式编码
		outputStream.close();
	}
	
	//读1--一个字符一个字符
	public static void readFile1() throws IOException{
		FileInputStream fileInputStream = new FileInputStream("temp2.txt");
		int num;
		while((num=fileInputStream.read())!=-1){
			System.out.print((char)num);
		}
		fileInputStream.close();
	}
	
	//读2--一次多个字符
	public static void readFile2() throws IOException{
		FileInputStream fileInputStream = new FileInputStream("temp2.txt");
		int num;
		byte[] arr = new byte[4];
		while((num=fileInputStream.read(arr))!=-1){
			System.out.print(new String(arr,0,num));
		}
		fileInputStream.close();
	}
	
	//读3--一次全部读出
	public static void readFile3() throws IOException{
		FileInputStream fileInputStream = new FileInputStream("temp2.txt");
		//获取的所有的字节数
		//注意:如果文本的字节数太大不建议使用。
		int nums = fileInputStream.available();
		int num;
		byte[] arr = new byte[nums];
		num=fileInputStream.read(arr);
		System.out.print(new String(arr,0,num));
		fileInputStream.close();
	}
	
	
}

使用字节流实现图片的复制

package com.qianfeng.test;

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

/*
 * 使用字节流实现图片的复制
 */
public class Demo8 {

	
	public static void main(String[] args) throws IOException {
		
		//1.创建字节输入流,输出流
		FileInputStream fileInputStream = new FileInputStream("C:\\Users\\acer\\Desktop\\111.jpg");
		FileOutputStream outputStream = new FileOutputStream("C:\\Users\\acer\\Desktop\\222.jpg");
		
		//2.完成读写
		int num;
		while((num=fileInputStream.read())!=-1){
			outputStream.write(num);
		}
		
		//3.关闭流
		fileInputStream.close();
		outputStream.close();
		
	}
}

使用缓冲字节流实现图片的复制

package com.qianfeng.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
 * 使用缓冲字节流实现图片的复制
 */
public class Demo9 {

	public static void main(String[] args) throws IOException {
		
		//1.创建
		BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("C:\\Users\\acer\\Desktop\\111.jpg"));
		BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("C:\\Users\\acer\\Desktop\\2223.jpg"));
		
		//2.完成读写
		int num;
		while((num=bufferedInputStream.read())!=-1){
			bufferedOutputStream.write(num);
		}
		
		//3.关闭流
		bufferedInputStream.close();
		bufferedOutputStream.close();
		
	}
}

标准输入流 System. in、标准输出流System.out

package com.qianfeng.test;

import java.io.IOException;
import java.io.InputStream;

/*
 * 标准输入流:System.in:此流已经被打开,准备提供数据。这个流默认对应键盘(输入源)的输入或由主机或用户提供的输入源。
 * 标准输出流:System.out
 * 
 */
public class Demo10 {

	public static void main(String[] args) throws IOException {

		// 标准输入流 输入源:键盘 中转点:内存 输出源:控制台
		InputStream inputStream = System.in;// 这个流已经默认绑定了键盘,所以可以直接从键盘接实数据。这是字节流。
		// int num = inputStream.read();//是一个阻塞式的方法,会一直等待用户输入。
		// System.out.println(num);

		/*
		 * 实例:要求可以从键盘不断的接收字节 要求:一行一行的接收
		 */
		myReadLine(inputStream);

	}

	//
	public static void myReadLine(InputStream inputStream) throws IOException {
		StringBuffer stringBuffer = new StringBuffer();
		while (true) {
			int num = inputStream.read();
			if (num == '\r') {
				continue;
			} else if (num == '\n') {
				System.out.println(stringBuffer.toString());

				// 当输入over的时候认为是结束
				if (stringBuffer.toString().equals("over")) {
					break;
				}

				// 清除上一次的内容
				stringBuffer.delete(0, stringBuffer.length());
				
			} else {
				stringBuffer.append((char) num);
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值