java基础 day17 IO流

IO流:

在这里插入图片描述

FileInputStream:
package wwl.Io;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * 读字节为单位读取文件的内容
 *
 */
public class Test02 {

	public static void main(String[] args) throws IOException {
		//1.在当前程序与指定文件之间建立流通道,读取d:/abc.txt文件的内容,通过构造方法指定要访问的文件
		//如果文件不存在就会抛出异常
		FileInputStream fis = new FileInputStream("d:/abc.txt");
		//文件内容:ABCabc
		
		//2.读写文件内容
		//read()方法从文件中读取一个字节,并把读到的字节返回,读到文件末尾返回-1
		
//		int cc = fis.read(); 	//65,A的码值
//		System.out.println(cc);
//		cc = fis.read(); 		//66,B的码值
//		System.out.println(cc);
//		cc = fis.read(); 		//67,C的码值
//		System.out.println(cc);
//		cc = fis.read(); 		//97,a的码值
//		System.out.println(cc);
//		cc = fis.read();		//98,b的码值
//		System.out.println(cc);
//		cc = fis.read(); 		//99,c的码值
//		System.out.println(cc);
//		cc = fis.read(); 		//-1,已经读到文件末尾
//		System.out.println(cc);
		
		//使用循环读取:
		int cc = fis.read(); 	//65,A的码值
		while( cc != -1) {
			//把读到的字节cc进行处理,把cc转换为字符再打印,因为当前文件中只有英文字符,有个字节对应一个字符
			System.out.print((char)cc);
			cc = fis.read();
			
		}
		//3.关闭流通道
		fis.close();
	}

}

读字节为单位读取文件的内容

在这里插入图片描述

package wwl.Io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;

/**
 * 一次读取一个字节数组
 * 读取很多字节保存到字节数组中
 * 循环读取
 *
 */
public class Test03 {

	public static void main(String[] args) throws IOException {
		//1.在程序与读取文件之间建立流通道
		FileInputStream fis = new FileInputStream("d:/abc.txt");
		//ABCabcABC
		
		byte[] bytes = new byte[4];
		
		//从流中读取很多字节,保存到字节数组中,返回读到的字节数,如果读到文件末尾,返回-1
		int len = fis.read(bytes);
		
		while(len != -1) {
			//从文件中读取了len个字节保存到bytes数组中,对len个字节进行处理
			//把读到的len个字节转换为字符串 new String(byte[] bytes , 0 , len)
			System.out.print(new String(bytes , 0 , len));
			//继续读
			len = fis.read(bytes);
		}
		
//		System.out.println(len);
//		System.out.println(Arrays.toString(bytes));
//		
//		len = fis.read(bytes);
//		System.out.println(len);
//		System.out.println(Arrays.toString(bytes));
//		
//		len = fis.read(bytes);
//		System.out.println(len);
//		System.out.println(Arrays.toString(bytes));
//		
//		len = fis.read(bytes);
//		System.out.println(len);
//		System.out.println(Arrays.toString(bytes));
//		
		fis.close();
	}

}

异常处理:
package wwl.Io;

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

/**
 * 异常处理
 *
 */
public class Test04 {

	public static void main(String[] args) {
		m1();   //一次读取一个字节,手动关闭流,异常处理
		System.out.println();
		m2();   //从文件中读取字节保存到字节数组中,异常处理,自动关闭流
	}
	
	//从JDK7开始,流可以自动关闭
	private static void m2() {
		try(       //try资源块,自动释放
				FileInputStream fis = new FileInputStream("d:/abc.txt");
				) {
			byte[] bytes = new byte[4];
			int len = fis.read(bytes);
			while(len != -1) {
				System.out.print(new String(bytes , 0 , len));
				len = fis.read(bytes);
			}
		} catch (Exception e) {
			e.printStackTrace();//打印异常
		}
	}

	//手动关闭流,异常处理
	//alt+shift+z可以捕获所选代码的异常
	private static void m1() {
		FileInputStream fis = null;
		try {
			fis = new FileInputStream("d:/abc.txt");
			
			int cc = fis.read();
			while( cc != -1) {
				System.out.print((char)cc);
				cc = fis.read();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if( fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				} //关闭流,释放系统资源
			}
		}
		
		
	}

}

Fileoutputstream:
package wwl.Io;

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

/**
 *FileOutputStream
 * 以字节为单位把数据保存到文件中
 */
public class Test05 {

	public static void main(String[] args) throws IOException {
		//1.建立流通道
		//如果访问的文件不存在,系统会创建一个新文件;如果文件已存在内容,会覆盖原文件内容
//		FileOutputStream fos = new FileOutputStream("d:/def.txt");
		
		//如果文件不存在就创建文件,如果文件已存在,把内容保存到文件后面,即以追加的方式打开文件
		FileOutputStream fos = new FileOutputStream("d:/def.txt" , true);
		
		//2.保存数据
		//一次写一个字节
		fos.write(65);  //把65对应的字符A保存到文件中
		fos.write(66);  //把66对应的字符A保存到文件中
		fos.write(67);  //把67对应的字符A保存到文件中
		
		//换行,在windows操作系统中,换行需要使用\r\n两个字符
		fos.write('\r');  //回车,13
		fos.write('\n');  //换行,10
		
		//一次写一个字节数组
		byte[] bytes = "wwlssaa".getBytes();
		fos.write(bytes);  //把bytes数组中所有的字节保存到文件中
		
		//换行
		fos.write(13);
		fos.write(10);
		
		//把字节数组的部分字节保存到文件中
		fos.write(bytes, 0, 2);
		
		//3.关闭流
		fos.close();
	}

}

以字节为单位实现文件的复制:
package wwl.Io;

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

import wwl.interfaces.swimer.fish;

/**
 * 以字节为单位实现文件的复制
public class Test06 {

	public static void main(String[] args) {
		String src = "F:/Java code/wwl/src/wwl/Io/Test06.java";
		String deString = "d:/test08.java";
		copyFile(src, deString);
	}
	
	//一次复制一个字节,异常处理,手动关闭流
	public static void copyFile(String srcFilename , String destFilename)  {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(srcFilename);
			fos = new FileOutputStream(destFilename);
			int cc = fis.read();
			//如果cc不是-1,把cc保存到目标文件中
			while(cc != -1) {
				fos.write(cc); // 把读到的字节cc保存到输出流中
				cc = fis.read();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(fos != null) {
				try {
					fos.close();
				}  catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
	}
}

以字节数组为单位实现文件的复制(效率要远远高于以字节为单位复制):
package wwl.Io;

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

import wwl.interfaces.swimer.fish;

/**
 * 以字节数组为单位实现文件的复制
 *
 */
public class Test07 {

	public static void main(String[] args) {
//		String src = "F:/Java code/wwl/src/wwl/Io/Test06.java";
//		String deString = "d:/test08.java";
		
		String src = "F:\\学习\\2017MySQL\\001_动力节点_MySQL_MySQL数据库管理系统前言\\动力节点_MySQL_001_MySQL数据库管理系统前言.avi";
		String deString = "d:/hehe.avi";
		copyFile(src, deString);
	}
	
	//一次复制一个字节数组,异常处理,自动关闭流
	public static void copyFile(String srcFilename,String destFilename) {
		try ( 
				FileInputStream fis = new FileInputStream(srcFilename);
				FileOutputStream fos = new FileOutputStream(destFilename);
				){
			byte[] bytes = new byte[1024]; // 字节数组一般是1024的偶数倍
			int len = fis.read(bytes);
			while(len != -1) {
				fos.write(bytes, 0, len);
				len = fis.read(bytes);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	} 
}

FileReader:

以字符为单位读写内容:
与字节流大同小异

package wwl.Io;

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

/**
 * FileReader/FileWriter
 * 以字符为单位读写文件内容,只能读写纯文本文件,要求文本文件的编码格式要与当前环境的编码格式兼容
 *
 */
public class Test08 {

	public static void main(String[] args) throws IOException {
		m1();//通过FileReader读取文件内容
		m2();//读取文本文件内容,一次性读取一个字符数组,异常处理,自动关闭
	}

	private static void m2() {
		try (
				FileReader fr = new FileReader("d:/abc.txt");
				){
			char[] contents = new char[1024];
			int len = fr.read(contents);
			while(len != -1) {
				//把读到的len个字符进行处理,转换为字符串打印
				System.out.println(new String(contents, 0, len));
				len = fr.read(contents);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void m1() throws IOException {
		//建立流通道
		//一般使用FileReader读取与当前环境编码一致的文件
		FileReader fr = new FileReader("d:/abc.txt");
		
		//read()一次读取一个字符,返回字符的码值,读到文件末尾返回-1
		int cc = fr.read();
		while(cc != -1) {
			//把读到的字符打印到屏幕上
			System.out.print((char)cc);
			cc = fr.read();
		}
		fr.close();
	}
	

}

FileWriter:

注意追加的方式打开

package wwl.Io;

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

/**
 * FileWriter
 * 		保存数据时,只能把数据保存到utf-8编码(当前环境是UTF8)格式的文件中
 *
 */
public class Test09 {

	public static void main(String[] args) {
		//建立流通道
		FileWriter fw = null;
		try {
			//如果文件不存在,会创建新的文件,如果文件存在会覆盖原来的内容
//			fw = new FileWriter("d:/abc.txt");
			
			//文件不存在就创建,文件已存在,以追加的方式打开
			fw = new FileWriter("d:/abc.txt",true);
			
			//把字符保存到文件中
			//一次写一个字符
			fw.write('A');
			fw.write('汉');
			
			//一次写一个字符串
			fw.write("哈师大哈师大");
			
			//换行
			fw.write("\r\n");
			
			//一次写一个字符数组
			char[] contents = "发生发生法发首发式发生,啊十分大方".toCharArray();
			fw.write(contents);
			
			//把字符数组的部分数组保存到文件中
			fw.write(contents, 0, 5);
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			//关闭
			if(fw != null) {
				try {
					fw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

文本的文件复制:
package wwl.Io;

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

/**
 * 文本文件复制
 *
 */
public class Text10 {

	public static void main(String[] args) {
		String src = "d:/abc.txt";
		String dest = "d:/abc.txt";
		copyFile1(src, dest);
		copyFile2(src, dest);
	}
	
	//以文本文件复制,一次复制一个字符,异常处理,自动关闭流
	public static void copyFile1(String srcFilename , String destFilename) {
		try (
				FileReader fr = new FileReader(srcFilename);
				FileWriter fw = new FileWriter(destFilename);
				){
			int cc = fr.read();
			while(cc != -1) {
				fw.write(cc);
				cc = fr.read();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//以文本文件复制,一次复制一个字符数组,异常处理,手动关闭流
	public static void copyFile2(String srcFilename , String destFilename) {
		FileReader fr = null;
		FileWriter fw = null;
		try {
			fr = new FileReader(srcFilename);
			fw = new FileWriter(destFilename);
			char[] contents = new char[1024];
			int len = fr.read(contents);
			while(len != -1) {
				fw.write(contents,0,len);
				len = fr.read(contents);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(fr != null) {
				try {
					fr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(fw != null) {
				try {
					fw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

转换流:
package wwl.Io;

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.UnsupportedEncodingException;

/**
 * FileReader/FileWriter只能读写与当前环境编码兼容的文本文件
 * 如果文本文件与当前环境编码不兼容,使用InputStreamReader/OutputStreamWriter转换流读写
 * 转换流采用了适配器模式
 *
 */
public class Test11 {

	public static void main(String[] args) throws IOException {
		m1();//使用InputStreamReader读取文件内容
		m2();
	}
	
	//当操作的文件编码与当前环境编码不兼容可以使用OutStreamwriter把字符以指定的编码转换为字符
	private static void m2() throws IOException {
		//把字符保存到d:/abc.txt文件,该文件是GBk编码,当前环境是utf8编码,把字符转换为GBK格式再保存
		OutputStream out = new FileOutputStream("d:/abc.txt",true);
		OutputStreamWriter osw = new OutputStreamWriter(out,"GBK");
		
		osw.write("\r\n");
		osw.write("当前文件是转换流保存到文件,工作区是utf8,文件是GBK");
		osw.close();
	}

	//当文本文件的编码与当前环境编码不兼容时,使用InputStreamReader类读取
	private static void m1() throws IOException {
		//读取d:/abc.txt文件,该文件使用GBK编码,当前环境使用UTF-8编码
		//在当前程序与指定文件之间创建字节流通道
		InputStream in = new FileInputStream("d:/abc.txt");
		//使用GBK编码,把in字节流中的数据转换为字符流
		InputStreamReader isr = new InputStreamReader(in, "GBK");
		int len = isr.read();
		while(len != -1) {
			System.out.print((char)len);
			len = isr.read();
		}
		isr.close();
	}
}

字符缓冲流:

在这里插入图片描述

package wwl.Io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;

/**
 * 字符缓冲流
 * BufferedReader/BufferedWriter 
 * 也称一种处理流,包装流
 *
 */
public class Text12 {

	public static void main(String[] args) throws IOException {
		m1();//使用BufferedReader读取文本内容
		m2();//使用BufferedWriter保存文本到文件
		m3();//从键盘上输入文本,把这些文本保存到文件中
	}

	private static void m3() throws IOException {
		BufferedWriter bw = new BufferedWriter(new FileWriter("d:/abc.txt"));
		//使用BufferedReader对键盘输入流缓存
//		System.in(字节流)是标准的输入设备,即键盘
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String line = br.readLine();
		while(line.length() > 0) {
			bw.write(line);
			bw.newLine();
			line = br.readLine();
		}
		br.close();
		bw.close();
	}

	private static void m2() throws IOException {
		Writer out = new FileWriter("d:/abc.txt",true);
		BufferedWriter bw = new BufferedWriter(out);
		
		bw.write("我送你");
		
		//bw.flush();//清空缓存区把数据保存到文件中
		bw.close();
	}

	private static void m1() throws IOException {
		Reader in = new FileReader("d:/abc.txt");
		BufferedReader br = new BufferedReader(in);
		
		//从缓冲字符流中读取一行,读到文件末尾返回null
		String Line = br.readLine();
		while(Line != null) {
			System.out.println(Line);
			Line = br.readLine();
		}
		br.close();//把包装流关闭后,被包装的流也会关闭
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值