javase day19

IO流
本质就是数据传输的一种机制 InputStream OutputStream 输入流输出流

在这里插入图片描述

根据数据传输的方向:往内存传输数据----输入流 往内存外传输数据----输出流
根据数据传输的方式:字符流、字节流
javaIO流的四大基本流

字符流字节流
输出流字符输出流(Writer)字节输出流 (OutputStream)
输入流字符输入流 (Reader)字节输入流(InputStream)

四大基本流对应的类都是抽象类

数据存储/获取的位置(数据传输的场景):硬盘、内存、网络、外设设备

硬盘

字符:
往硬盘上一个txt文件写入数据 字符输出流 文件----FileWriter
从一个硬盘的txt文件读取数据 字符输入流 文件----FileReader

字节:
往硬盘上一个txt文件写入数据 字节输出流文件-----FileOutputStream
从一个硬盘的txt文件读取数据 字节输入流文件------FileInputStream

缓冲流(用于提供缓冲区)
BufferReader:给字符输入流提供缓冲区
BufferWriter:给字符输出流提供一个更大的缓冲区,newLine换行

转换流
OutputStreamWriter------字符流转成字节流
InputStreamReader------字节流转成字符流

系统流:
System.out System.err System.in

系统流都是静态的不能关流

模式:遇到同类问题,提供统一的解决方法
设计模式:在软件开发中,遇到一类问题,提供统一的解决方案
装饰者设计模式:通过同类对象给本类对象增强功能或者完善功能
在这里插入图片描述

异常的处理:
1、在try块外进行声明对象,在try块里进行对象的初始化
2、保证对象已经进行正常的初始化才能进行关流操作
3、不管是关流成功还是失败都要对对象进行置为无用对象的操作,然后垃圾回收
4、流关闭失败可能是在自动冲刷缓冲区之前,保证数据不会滞留在缓冲区中,自己进行手动冲刷缓冲区

往硬盘上一个txt文件写入数据 字符输出流 文件----FileWriter

public class WriterDemo1 {
	public static void main(String[] args) throws IOException {
		//创建FileWriter对象
		//检测路径正确与否
		//如果路径正确但是没有具体的文件就会创建一个空文件
		//如果文件已经存在就会再创建一个空文件覆盖之前的文件
		//保证在写数据之前有一个空文件
		FileWriter writer=new FileWriter("D:\\1.txt");
		//写数据
		//底层基于缓存区进行数据传输
		//默认要求缓存区数据装满才能进行传输
		//下面的数据没有装满,缓存区就没有进行传输
		writer.write("您好...");
		//冲刷缓存区
		//不管缓存区数据有没有存满都要进行传输
		//防止数据滞留在缓存区产生数据丢失
		writer.flush();
		
		//关闭连接通道----关流
		//在关闭通道之前会自动进行冲刷缓存区
		writer.close();
		
		//强制对象值为null
		//把对象置为无用对象,在某个时间进行垃圾回收
		writer=null;
	}
}

在这里插入图片描述

public class FileWriterDemo2 {
	public static void main(String[] args) {
		//创建FileWriter对象
		//1、声明FileWriter对象
		FileWriter writer=null;
		try {
			//对象真实赋值
			 writer=new FileWriter("D:\\a.txt");
			 //写出数据
			 writer.write("123");
			 //4、手动冲刷缓冲区
			 writer.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {//不管try块里的代码正确与否都要关流
			
			//2、保证对象初始化成功有值才能正确调用关流方法
			//为null的对象不用处理
			if(writer!=null) {
				try {
					writer.close();//关流可能失败
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally {
					//3、对象置为无用对象----垃圾回收
					writer=null;
				}
			}
			
		
		}
	}
}

jdk1.7新特性

public class FileWriterDemo3 {
	public static void main(String[] args) {
		//jdk1.7提供了try-with-resources
		//自动冲刷缓冲区、关流
		try(FileWriter writer=new FileWriter("D:\\3.txt")) {
			writer.write("555");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}

从一个硬盘的txt文件读取数据 字符输入流 文件----FileReader

public class FileReaderDemo1 {
	public static void main(String[] args) throws IOException {
		//创建FileReader对象
		FileReader reader=new FileReader("D:\\3.txt");
		//读取数据
		//返回的是读取到字符的编码值
		//读取结束的标志就是返回-1
		/*System.out.println((char)reader.read());
		System.out.println((char)reader.read());
		System.out.println((char)reader.read());
		System.out.println(reader.read());*/
		int len=-1;//提供变量供给读取数据覆盖
		while((len=reader.read())!=-1) {//避免读取两次情况高永杰
			System.out.println(len);
		}
		//关流---输入流没有缓存区
		reader.close();
	}
}

public class FileReaderDemo2 {
	public static void main(String[] args) throws IOException {
		//创建FileReader对象
		FileReader reader=new FileReader("D:\\a.txt");
		//读取数据
		//自建缓冲区---数组----字符流---字符数组
		char[] cs=new char[3];
		int len=-1;
		//reader.read(字符数组)---返回的值就是每次读取到的字符的个数
		while ((len=reader.read(cs))!=-1) {//读取到的数据存放到数组
			//System.out.println(new String(cs));
			System.out.println(new String(cs,0,len));
		}
		//关流
		reader.close();
		
	}
}

在这里插入图片描述

在这里插入图片描述

实现文件的复制

package cn.tedu.io.reader;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
*@author 作者:
*@version 创建时间:2020年10月28日下午9:26:06
*@description 描述:实现文件的复制
*/
public class FileCopyText1 {
	public static void main(String[] args) {
		//声明IO流
		FileReader reader=null;
		FileWriter writer=null;
		
			//对象的初始化---指明两个文件的路径
			try {
				reader=new FileReader("D:\\1.txt");
				writer=new FileWriter("D:\\a\\1.txt");
				//获取数据
				//自建数组缓冲区
				char[] cs=new char[1024*1024*10];//读取1M
				int len=-1;//接受每次返回的字符的个数
				while ((len=reader.read())!=-1) {
					//写出数据
					writer.write(cs,0,len);
					//writer.write(new String(cs,0,len));
					//冲刷缓冲区
					writer.flush();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally {
				if(reader!=null) {
					try {
						reader.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}finally {
						reader=null;
					}
				}
				if(writer!=null) {
					try {
						writer.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}finally {
						writer=null;
					}
				}
			}
			
	}
}

缓冲流buffer

public class BufferReaderDemo1 {
	public static void main(String[] args) throws IOException {
		//创建缓冲对象
		//真正读取内容的流对象是FileReader,字符输入流
		//缓冲流对象只是给字符输入流提供了一个缓冲区
		BufferedReader br=new BufferedReader(new FileReader("D:\\3.txt"));
		//读一行---结束标志位null
		//System.out.println(br.readLine());
		//System.out.println(br.readLine());
		String str="";
		while((str=br.readLine())!=null) {
			System.out.println(str);
		}
	}
}

输出.Java文件有多少行代码

package cn.tedu.javacounttext;

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

/**
*@author 作者:
*@version 创建时间:2020年10月26日下午9:46:24
*@description 描述:统计工作空间下所有.java文件里代码的总行数
*/
public class CountJavaLine {
	//
	static int count;
	public static void main(String[] args) throws IOException {
		//
		File file=new File("D:\\yy2");
		countJavaLine(file);
		System.out.println(count);
	}
	public static void countJavaLine(File file) throws IOException {
		if(file.isDirectory()) {
			File[] fs=file.listFiles();
			for (File f : fs) {
				countJavaLine(f);
			}
		}else if(file.getName().endsWith(".java")) {
			BufferedReader br=new BufferedReader(new FileReader(file));
			while (br.readLine()!=null) {
				count++;
			}
		}
	}
}

public class BufferWriterDemo1 {
	public static void main(String[] args) throws IOException {
		//
		BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\b.txt"));
		//写出数据
		bw.write("abc");
		//换行
		//不同操作系统下的换行符不一样
		//window-----\r\n   linux----\n
		bw.newLine();
		bw.write("123");
		//关流---冲刷缓冲区
		bw.close();
	}
}
public class FileOutPutStreamDemo1 {
	public static void main(String[] args) throws IOException {
		//创建字节输出流对象----没有缓冲区   true表明文件可追加
		FileOutputStream os=new FileOutputStream("D:\\c.txt",true);
		//写出数据
		//os.write("abc中".getBytes());//获取字节数组
		os.write("中".getBytes("utf-8"));
		//关流
		os.close();
	}
}

public class FileInputStreamDemo1 {
	public static void main(String[] args) throws IOException {
		//字节输入流对象
		FileInputStream is=new FileInputStream("D:\\c.txt");
		//读取数据  结束标志是-1
		//System.out.println((char)is.read());
		//自建缓冲区
		byte[] bs=new byte[10];
		int len=-1;
		while ((len=is.read(bs))!=-1) {
			System.out.println(new String(bs,0,len));
		}
		//关流
		is.close();
	}
}

针对内存的IO流

public class StringReaderDemo1 {
	public static void main(String[] args) throws IOException {
		//字符串----内存中
		String str="abc";
		//创建IO流对象
		StringReader sr=new StringReader(str);
		//读取数据
		char[] cs=new char[10];
		int len=-1;
		while ((len=sr.read(cs))!=-1) {
			System.out.println(new String(cs,0,len));
		}
	}
}

字符流与字节流的转换

public class OutputStreamWriterDemo1 {
	public static void main(String[] args) throws IOException {
		//底层真正做传输的是字节输出流
		//要写出的数是字符
		//字符输出流----字节输出流
		OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:\\c.txt"));
		//写出数据----字符串----字符
		osw.write("abc玉如推荐");
		//关流
		osw.close();
	}
}

public class InputStreamReaderDemo1 {
	public static void main(String[] args) throws IOException {
		//底层从文件读取的是字节输入流
		//展示的时候使用字符输入流
		//字节流----字符流
		InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\c.txt"));
		//读取数据----字符数组----字符----字符流
		char[] cs=new char[10];
		int len=-1;
		while ((len=isr.read(cs))!=-1) {
			System.out.println(new String(cs,0,len));
		}
		isr.close();
	}
}

系统流

public class SystemDemo {
	public static void main(String[] args) {
		/*//out----字节输出流的对象
		//黑色---表明输出结果
		System.out.println("good");
		//err-----字节输出流的对象
		//红色--表明输出的错误/异常
		System.err.println("err");
		//in---字节输入流
		//new Scanner(System.in);
		*/	
		//
		Scanner sc1=new Scanner(System.in);
		String str1=sc1.nextLine();
		//关流----NotSuchElementException
		//sc1.close();
		Scanner sc2=new Scanner(System.in);
		String str2=sc2.nextLine();
		sc1.close();//可以
		System.out.println(str1);
		System.out.println(str2);
	}
}

根据字节流实现硬盘上文件的复制

public class CopyFileText {
	public static void main(String[] args) throws IOException {
		//创建字节流对象
		FileInputStream fis=new FileInputStream("D:\\c.jpg");
		FileOutputStream fos=new FileOutputStream("D:\\a\\c.jpg");
		//缓冲区
		byte[] cs=new byte[1024*1024];
		int len=-1;
		while ((len=fis.read(cs))!=-1) {
			//写出数据
			fos.write(cs, 0, len);
		}
		//关流
		fis.close();
		fos.close();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值