java基础之IO流

IO流的概述和分类:

流可分为两大类,字节流和字符流,且他们都有输入流(从屏幕、硬盘或是其他数据源读取数据放入内存中)和输出流(用来向屏幕、硬盘等目的地输出内容),字节流就是一个字节一个字节的读取或是输出(字节都是8位,0到255之间的整数),而字符流是按照文本的那种字符来读取和输出,就是直接读取数字、字母或是中文字等这些我们能够直接识别的字符;至于缓冲流,是指当输出的时候带 有缓冲功能的流(BufferOutputStream),没有缓冲功能的流当其输出时是直接存入目的地,如果有缓冲功能,则会将输出的内容先放置在内存中,等到有一定数据量的时候,或是流关闭、或调用flush()方法时,才会将相应的内容保存到硬盘或是其它目的地中

之所以有字符流缓冲区,是因为把字符流都作为缓冲处理能提高字符流的读写效率,如果没有缓存,例如FileReader对象,每次调用read()方法进行读操作时,都会直接去文件中读取字节,转换成字符并返回,这样频繁的读取文件效率很低。缓冲区实现原理就是将数组进行封装。缓冲的字符流的出现提高了对流的操作效率,缓冲的存在是为了增强流的功能,因此在建立缓冲的字符流对象时,要先有流对象的存在

IO流一览表
图片转载于: https://blog.csdn.net/qq_39588027/article/details/80243282
一、什么是IO流
IO流:IO流用来处理设备之间的数据传输,可以把数据存储到文件,也可以从文件中读取数据。
常见应用:文件复制、上传文件、下载文件等。

###二、FileWriter(输出流)
1.往文件中写数据:写数据------输出流------FileWriter
2.方法:FileWriter(String filename):传递一个文件名称
3.输出流写数据的步骤:
A.创建输出流对象
B.调用输出流对象的写数据方法
C.释放资源
练习之写一个字符串到a.txt文件中

public class FileWriterTest {
public static void main(String[] args) throws IOException {
	//创建输出流对象
	FileWriter fw=new FileWriter("d:\\a.txt");//绝对路径
	//FileWriter fw=new FileWriter("a.txt");//相对当前项目的路径
	 /* 创建输出流对象做了哪些事情:
	 * A:调用系统资源创建了一个文件
	 * B:创建输出流对象
	 * C:把输出流对象指向文件
	 */
	//调用输出流对象的写数据方法
	fw.write("hello");
	//刷新,数据没有直接写到文件,而是写到了内存缓冲区
	fw.flush();
	//先刷新,再释放资源,其实是通知系统释放和该文件相关的资源
	fw.close();
}
}

三、FileWriter写数据的方法
void write(String str);//写一个字符串数据
void write(String str,int index,int len);//写一个字符串中的一部分数据
void write(int ch);//写一个字符数据,既可以写char类型的数据,也可以char对应的int类型。‘a’-‘z’=97–122,‘A’-‘Z’=65–90.
void write(char[] chs);//写一个字符数组数据
void write(char[] chs,int index,int len);//写一个字符数组的一部分数据
四、FileWriter之换行和追加
在这里插入图片描述
windows:\r\n
linux:\n
mac:\r

true表示追加,默认是false。

五、FileReader读数据
1.从文件中读数据
读数据--------输入流-------FileReader
2.方法:FileReaderr(String filename):传递一个文件名称
3.输入流读数据的步骤:
A.创建输入流对象
B.调用输入流对象的读数据方法
C.释放资源
练习之 从a.txt文件中读数据到控制台

public class FileReaderDemo1 {
	public static void main(String[] args) throws IOException {
	FileReader fr=new FileReader("a.txt");
	//方法一:一次读取一个字符
	/*int ch;
	//所有数据全部读取完的标志是-1
	while((ch=fr.read())!=-1) {//1.fr.read() 2.ch=fr.read() 3.ch!=-1
    //System.out.println(ch);//这样输出的是int型,并且ln本身就有换行的意思。
    System.out.print((char)ch);*/
    //方法二:一次读取一个数组
    char[] ch=new char[1024];
	int len;
	while((len=fr.read(ch))!=-1){
	System.out.print(new String(ch,0,len));
	}
	fr.flush();
	fr.close();	
		}
	}

练习之复制文本文件
文件复制:
数据源:读数据-------FileReader
目的地:写数据-------FileWriter

public class CopyFileDemo {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("b.txt");
FileWriter fw=new FileWriter("a.txt");
//一次读取一个字符
	/*int ch;
	while((ch=fr.read())!=-1) {
		fw.write(ch);	*/
//一次读取一个字符数组
	char[] ch=new char[1024];
	int len;
	while((len=fr.read(ch))!=-1)
	fw.write(ch);
	fw.flush();
	fw.close();
}
}

六、字符缓冲流BufferedWriter、BufferedReader:
1.
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入。
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
2.读写数据的方式

public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
	//创建输出缓冲流
//BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));
//	bw.write("hello");
//	bw.flush();
//	bw.close();
	//创建输入缓冲流
	BufferedReader br=new BufferedReader(new FileReader("a.txt"));
	//一次读一个字符的情况
//	int ch;
//	while((ch=br.read())!=-1) {
//		System.out.print((char)ch);
//	}
//	//释放资源
//	br.close();

   //一次读一个字符数组的情况]
	char[] chs=new char[1024];
	int len;
	while((len=br.read(chs))!=-1) {
		System.out.print(new String(chs,0,len));
	}
	br.close();
}
}

3.字符缓冲流复制文本文件的俩种方式
分析:
读数据-----FileReader-----高效读取数据------BufferedReader
写数据------FileWriter------高效的写数据-------BufferedWriter

public class CopyFileDemo {
public static void main(String[] args) throws IOException {
	BufferedReader br=new BufferedReader(new FileReader("b.txt"));
	BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));
//缓冲流复制文本文件的2种方式
	//一次读取一个字符串
	/*int ch;
	while((ch=br.read())!=-1) {
		//System.out.println((char)ch);
		bw.write((char)ch);
	}*/
	//一次读取一个数组
	char[] chs =new char[1024];
	int len;
	while((len=br.read(chs))!=-1){
		bw.write(chs,0,len);
	}
	bw.close();
}
}

4.字符缓冲流的特殊功能
BufferedWriter:
void newLine();写一个换行符,这个换行符由系统决定。
newLine()的使用
BufferedReader:
String readLine();一次读取一行数据,但不读取换行符。
 readLine()的使用
七、复制文本文件的5中方式

public class thestyleofcopy {
public static void main(String[] args) throws IOException {
	String srcFileName="a.txt";
	String destFileName="b.txt";
	//method1(srcFileName,destFileName);//基本流一次读写一个字符
	//method2(srcFileName,destFileName);//基本流一次读写一个字符数组
	//method3(srcFileName,destFileName);//缓冲流一次读写一个字符
	//method4(srcFileName,destFileName);//缓冲流一次读写一个字符数组
	method5(srcFileName,destFileName);//缓冲流的特殊功能,一次读写一个字符串
}

private static void method5(String srcFileName, String destFileName) throws IOException {
	BufferedReader br=new BufferedReader(new FileReader(srcFileName));
	BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName));
	//一次读写一个字符串
	String line;
	while((line=br.readLine())!=null) {
		bw.write(line);
		bw.newLine();
		bw.flush();		
	}
	br.close();
	bw.close();
}
/*
private static void method4(String srcFileName, String destFileName) throws IOException {
	BufferedReader br=new BufferedReader(new FileReader(srcFileName));
	BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName));
	//一次读写一个字符数组
	char[] chs=new char[1024];
	int len;
	while((len=br.read(chs))!=-1) {
		bw.write(chs,0,len);
		bw.flush();
	}
	br.close();
	bw.close();
}
private static void method3(String srcFileName, String destFileName) throws IOException {
	BufferedReader br=new BufferedReader(new FileReader(srcFileName));
	BufferedWriter bw=new BufferedWriter(new FileWriter(destFileName));

	//一次读写一个字符
	int ch;
	while((ch=br.read())!=-1) {
		bw.write(ch);
		bw.flush();
	}
	br.close();
	bw.close();
}
private static void method2(String srcFileName, String destFileName) throws IOException {
	FileReader fr=new FileReader(srcFileName);	
	FileWriter fw=new FileWriter(destFileName);
	//一次读写一个字符数组
	char[] chs=new char[1024];
	int len;
	while((len=fr.read(chs))!=-1) {
		fw.write(chs,0,len);
		fw.flush();
	}
	fr.close();
	fw.close();
}

/*
private static void method1(String srcFileName, String destFileName) throws IOException {
	FileReader fr=new FileReader(srcFileName);	
	FileWriter fw=new FileWriter(destFileName);
	//一次读写一个字符
	int ch;
	while((ch=fr.read())!=-1) {
		fw.write(ch);
		fw.flush();
	}
	fr.close();
	fw.close();
}*/
}

八、把ArrayList集合中的字符串数据存储到文本文件
分析:
A创建集合对象
B往集合中添加字符串元素
C创建输出流对象
D遍历集合,得到每一个字符串元素,然后把字符串元素作为数据写进文本文件

public class ArrayToText {
	public static void main(String[] args) throws IOException {
		ArrayList<String> array=new ArrayList<String>();
		array.add("hello");
		array.add("你好");
		BufferedWriter bw=new BufferedWriter(new FileWriter("c.txt"));
		for(int i=0;i<array.size();i++) {
			String s=array.get(i);
			bw.write(s);
			bw.flush();
		}
		bw.close();
	}
	}

九、把文本文件中的数据读取到集合

/*
 * 把文本文件中的数据读取到集合
 * 1.创建读输入缓冲流2.创建集合对象3.读取数据,每次读取一行当做一个元素写到集合中4.释放资源5.遍历集合
 */
public class TextToArray {
	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new FileReader("c.txt"));
		ArrayList<String> array=new ArrayList<String>();
		String line;
		while((line=br.readLine())!=null) {
			array.add(line);
		}
		br.close();
		for(int i=0;i<array.size();i++)
		{
			String s=array.get(i);
			System.out.println(s);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值