java学习日志day19

2019年7月23日

关于IO流------InPut OutPut Stream 输入输出流

IO流的本质,就是数据传输的一套机制

根据数据传输的方向:往内存传输数据—输入流

内存向外传输数据-----输出流

根据数据传输的方式:字符流、字节流

javaIO流的四大基本流

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

四大基本类都是抽象类

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

硬盘:
向硬盘上的一个txt文件写入数据;–FileWriter

从一个硬盘的txt文件读取数据; —FileReader

Buffereader缓冲区

字符输出流 文件—FileWriter

输入流没有缓冲区

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

public class LiuIO {
public static void main(String[] args) throws IOException {
//	创建FileWriter对象
//	检测路径正确与否
//	如果路径正确,没有具体的文件,就会创建一个空文件
//	如果文件已经存在,就会创建一个空文件覆盖之前的文件
//	保证写入数据之前,这个文件一定是一个空文件。
	FileWriter writer = new FileWriter("E:\\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块里一定能赋值
			try {
				//对象真实赋值
				writer=new FileWriter("D:\\2.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;
					}
			}
		}


	}







	public class FileWriterDemo3 {

		public static void main(String[] args) {
			//jdk1.7提供  try-with-resources
			//自动冲刷缓冲区、关流
			try(FileWriter writer=new FileWriter("D:\\3.txt")){
				writer.write("456");
			} 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:\\2.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,0,len));
		}

		//关流
		reader.close();

	}

}

4.字节
往硬盘上一个txt文件写入数据 字节输出流 文件—FileOutputStream
public class FileOutPutStreamDemo {

	public static void main(String[] args) throws IOException {
		//创建字节输出流对象---没有缓冲区  true表明文件可追加
		FileOutputStream os=new FileOutputStream("D:\\c.txt",true);
		//写出数据
		os.write("中".getBytes());//获取字节数组
		//关流
		os.close();
	}

}

从一个硬盘的txt文件读取数据

 字节输入流  文件---FileInputStream

public class FileInputStreamDemo {
	public static void main(String[] args) throws IOException {
		//字节输入流对象
		FileInputStream is=new FileInputStream("D:\\1.txt");
		//读取数据  结束标志是-1
		//System.out.println(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();
	}
}

5.缓冲流(用于提供缓冲区)

		BufferedReader:给字符输入流提供缓冲区  readLine读取一行
		public class BufferedReaderDemo {

			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());
				System.out.println(br.readLine());
				System.out.println(br.readLine());*/
				String str="";
				while((str=br.readLine())!=null){
					//
					System.out.println(str);
				}

			}

		}

		BufferedWriter:给字符输出流提供一个更大的缓冲区  newLine换行
		public class BufferedWriterDemo {
			public static void main(String[] args) throws IOException {
				//
				BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\b.txt"));
				//写出数据
				bw.write("abc");
				//换行---不管具体什么的操作系统
				//不同操作系统的换行符不一样
				//Windows---\r\n  linux---\n
				bw.newLine();
				bw.write("123");

				//关流--冲刷缓冲区
				bw.close();
			}
		}

6.转换流

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

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

}

7.系统流(都是字节流)

System.out 、System.err、System.in

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

ublic static void main(String[] args) {
		//
		Scanner sc1=new Scanner(System.in);
		String s1=sc1.nextLine();
		//关流
		sc1.close();
		//系统流都是静态的不能关流
		/*Scanner sc2=new Scanner(System.in);
		String s2=sc2.nextLine();
		System.out.println(s1);
		System.out.println(s2);*/
	}

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

08-03 08:00