流(IO流):inputStream outputStream 作用:实现两个设备之间的数据传输

设备:能够输入信息或者输出信息的东西:磁盘(硬盘),内存,键盘,文件,网络,控制台
网络:当前主机之外的网上资源

分类:
根据操作的方式:输入流和输出流
根据数据的类型:字节流和字符流

字节流:传输的是字节,可以操作任意类型的数据 ----音频,视频,文件,图片等
字符流:传输的是字节,不同点是在传输过程中加入编码的操作(例如在写时自动把字符串中的每个字符转成字节),让我们操作更方便--文本。

因内存作为参考
字节流:
字节输入流:InputStream
字节输出流:OutputStream

字符流的两个父类:
字符读入流(将数据输入内存[数组之类的]):Reader
字符写出流(将数据从内存取出):Writer

实例:研究字符流
以硬盘的数据存储为例,将数据写入文件
分析:操作的是文本文件。所以使用字符流
    是将数据从内存写入硬盘,所以是字符写出流

IO流1

IO流1

 

import java.io.*;
public class Demo4 {

	public static void main(String[] args) throws IOException {
		//1创建FileWriter对象,并关联文件
		//只写名字,不写具体路径的话:默认路径为当前的工程
		//如果文件不存在的话FileWriter会自己创建一个文件
		//当该文件已经存在,会清空并覆盖原文件
		//可以创建自己的路径,但是一定要保证路径是真实存在的
		//只能创建文件,不能创建路径
		//否则报异常:FileNotFoundException这是一个典型的编译异常
		FileWriter fw=new FileWriter("temp1.txt");
		//2进行写操作
		//在执行write方法时,临时将内容写入了流的字节数组中(内存),这里会
		//自动去查编码表,得到字节数组
		fw.write("bingbing");
		//刷新---会将真正的内容写入磁盘
		fw.flush();//这句可以不写
		fw.close();//这里的close有两个功能:刷新,关闭
		
		//注意:流使用完必须关闭
		//当流关闭后,不能再进行写操作,否则报异常
	}

}
package day21;

import java.io.*;

/*实现读入操作
 * 分析:文件---字节流
 * 读入操作---字节读入流---FileReader
 * 
 */
public class Demo5 {

	public static void main(String[] args) throws IOException {
		//1创建对象关联文件
		FileReader fr=new FileReader("temp1.txt");
		/*
		 * 进行读操作
		 * read()一次读一个字符
		 * read(数组)一次读多个字符,读到的字符会临时存放在临时数组(字符数组)中
		 */
		
		//read()一次读一个字符
		//a:会将当前的字符读入,b会将指针指向下一个字符
		//方法的返回值就是读到的字符,当将所有的字符读完的时候返回-1
		int num=0;
		while((num=fr.read())!=-1)
			System.out.println(num);
		
		fr.close();
		}

	}

package day21;

import java.io.*;

public class Demo6 {
	public static void main(String[] args) throws IOException {
	//read(数组)
	//数组是临时存数据的地方,数组的大小决定了我们一次读到的字符个数
	//一般这个数组的大小在1kb左右
	//返回值代表:当次读到的真实字符的个数
	//如果返回值是-1代表读完了
		FileReader fr=new FileReader("temp1.txt");
		int len=0;
		char[] arr=new char[2];
		while((len=fr.read(arr))!=-1) 
		{
			System.out.print(new String(arr,0,len));
			//左闭右开
		}
		fr.close();
	}
}
package day21;

import java.io.*;

public class Demo7 {
/*
 * 关于\
 * \代表转义字符,它会把它后面紧跟着的字符转义,成为一个字符
 * \t横向跳格
 *\\才是\
 * 在表示目录的时候\\和/都可以
 * 
 * 关于绝对路径和相对路径
 * 绝对路径:从根目录开始,到当前的文件
 * 相对路径:从路径中的某一个部位开始一直到当前的文件
 * 
 */
	public static void main(String[] args) throws IOException {
	/*
	 * 实例:完成文件的复制
	 * 要求:将Demo1.java复制到temp2.txt它的路径是当前的工程
	 */
		//读入
		FileReader fr=new FileReader("D:\\eclipseWorkSpace\\se1\\src\\day21\\Demo1.java");
		//也可以写成:FileReader fr=new FileReader("D:/eclipseWorkSpace/se1/src/day21/Demo1.java");
		//写出
		FileWriter fw=new FileWriter("temp2.txt");
		int len=0;
		char[] arr=new char[2];
		while((len=fr.read(arr))!=-1)//读到数组(内存)里 
		{
			fw.write(arr,0,len);//写到文件里(硬盘)
			fw.flush();
		}
		
		fw.close();
		fr.close();
	}

}
package day21;

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

/*
 * 文件的续写--FileWriter(路径,value)
 * 当value=true的时候,不会将原来的内容删掉,往后接着写
 */
public class Demo8 {

	public static void main(String[] args) {
		FileWriter fw=null;
		try {
			fw = new FileWriter("temp3.txt",true);
			fw.write("aaaaaa");
			fw.write("\r\n");//windows换行\r\n	Linux换行:\n
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(fw!=null)
//什么情况下fw会为null?路径不存在的时候,或者在过程中操作不当
//判断是因为关流会消耗资源,如果本来就是null再关流耗费了资源
				try {
					fw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		
	}

}
package day21;

import java.io.*;

/*
 * 字符缓冲流(字符缓冲区):本身没有读写的能力,可以提高读写的效率,如果要想进行读写,必须借助于字符流
 * 可以将缓冲流比作:催化剂
 * 字符缓冲流分类:
 * 字符缓冲读入流:BufferedReader--提高读的能力
 * 字符缓冲写出流:BufferedWriter--提高写的能力
 * 
 * 
 * 
 * 
 */
public class Demo9 {

	public static void main(String[] args) throws IOException {
		//使用字符缓冲写出流实现写
		//1创建字符写出流并关联文件
		//2创建字符缓冲写出流并关联字符写出流
		BufferedWriter bw=new BufferedWriter(new FileWriter("temp4.txt"));
		//3写
		bw.write("bingbing");
		//bw.write("\r\n");//windows上的换行\r\n Linux上为\n
		bw.newLine();//换行,好处是自动跨平台实现换行
		//这也是使用字符缓流的原因之一,该方法是字符缓冲写出流的。
		bw.write("abcde");
		//4关流
		bw.close();
	}

}
package day21;

import java.io.*;

//用符节缓冲流除了提高效率,是因为想用:
//readLine()
//newLine()
/*
 * 字符缓冲读入流--BufferedReader
 */
public class Demo10 {

	public static void main(String[] args) throws IOException {
		//1创建字符缓冲读入流并关联字符读入流
		BufferedReader br=new BufferedReader(new FileReader("TestDemo.txt"));
		//2读
		//一次读一个字符
		int num=0;
		while((num=br.read())!=-1)//字符对应的ascii码
		{
			System.out.print((char)num);
		}
		//一次读多个字符
		char[] arr=new char[2];
		while((num=br.read(arr))!=-1)
		{
			System.out.print(new String(arr,0,num));
		}
		//一次读一行readLine---返回值String(代表读到的内容)(BufferedReader特有的方法)
		//原理:一个字符一个字符的读(一直读到换行符),读到可变字符串中,返回
		//注意点:a这里不会将换行符(\r\n)读进来 b返回值就是读到的内容,当所有的内容读完时返回null
		String data=null;
		while((data=br.readLine())!=null) {
			System.out.print(data);
			System.out.print("\r\n");//只能用于windows系统
		}
		//3关流
		br.close();
		
		

	}

}
package day21;

import java.io.*;

/*
 * 使用字符缓冲流完成文件的复制
 */
public class Demo11 {

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

		BufferedReader br=new BufferedReader(new FileReader("D:\\eclipseWorkSpace\\se1\\src\\day21\\Demo1.java"));
		BufferedWriter bw=new BufferedWriter(new FileWriter("temp11.txt"));
		String hehe=null;
		while((hehe=br.readLine())!=null)
		{
			bw.write(hehe);
			bw.newLine();
		}
		bw.close();
		br.close();
		
	}

}
package day21;

import java.io.*;

/*
 * 特殊的缓冲流:
 * LineNumberReader:是缓冲流,父类是BufferedReader,特有功能:
 * 设置行号,获取行号
 * 
 */
public class Demo12 {

	public static void main(String[] args) throws IOException {
		LineNumberReader lnr=new LineNumberReader(new FileReader("temp1.txt"));
		//设置行号:默认行号是从i行开始设置,从i+1开始计数
		lnr.setLineNumber(5);//设置为从5开始设置,从6开始计数(第一行为6)
		//我们可以根据具体情况指定行号
		String data=null;
		while((data=lnr.readLine())!=null) {
			System.out.print(lnr.getLineNumber());
			System.out.print(data);
			System.out.println();
		}

	}

}

总结:
 

package day21;
import java.io.*;
public class TestDemo {
//总结:
//读的话每次都要存下来
//int a=fr.read() a为单个字符的ascii码
//int len=fr.read(arr) arr为字符数组,返回值是读入字符的有效长度
//fw.write(s);s为字符串
//fw.write(s,0,len);//写出[0,len-1]范围的字符串
//FileWriter fw=new FileWriter("文件名")覆盖写
//FileWriter fw=new FileWriter("文件名",true)追加写
//字符流绑定缓冲流用有的能力:	
//bw.newLine()写出换行,适用于不同平台
//br.readLine()读入一行,返回值类型为String,不会把换行如\r\n读进来,读到文件末尾返回null
//
	//用字节写出流在文件中写字符串
	static void f1() throws IOException
	{
		FileWriter fw=new FileWriter("TestDemo.txt");
		fw.write("bingbing");//可以直接写字符串
		fw.close();//1.刷新2.关闭
	}
	
	//文件读入流读入文件中的内容,每次只读一个字符
	static void f2() throws IOException
	{
		FileReader fr=new FileReader("TestDemo.txt");
		int num=0;
		while((num=fr.read())!=-1)//fr.read()返回值是int型,返回的是字符的ascii码 
		{
			System.out.println(num);
		}
		fr.close();
	}
	//文件读入文件的内容,每次读到字符数组里
	static void f3() throws IOException
	{
		FileReader fr=new FileReader("TestDemo.txt");
		int len=0;
		char[] arr=new char[2];
		//该read方法参数为char[],返回值为int为有效字符的个数
		while((len=fr.read(arr))!=-1) {
			System.out.println(new String(arr,0,len));
			//该方法左闭右开
		}
		fr.close();
	}
	
	//文件的复制
	static void f4() throws IOException   {
		FileReader fr=new FileReader("TestDemo.txt");
		FileWriter fw=new FileWriter("TestDemo.txt.swp");
		int len=0;
		char[] arr=new char[2];
		while((len=fr.read(arr))!=-1)
		{
			fw.write(arr,0,len);
			fw.flush();//刷新**
		}
		fw.close();
		fr.close();
	}
	//文件写:追加
	static void f5()
	{
		FileWriter fw=null;
		try {
			fw=new FileWriter("TestDemo.txt",true);
			fw.write("my name is juruo");
			fw.write("\r\n");
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(fw!=null)
				try {
					fw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
	//字符缓冲流写
	static void f6() throws IOException
	{
		//为true时可以追加
		BufferedWriter bw=new BufferedWriter(new FileWriter("TestDemo.txt",true));
		bw.write("today");
		bw.newLine();
		bw.write("my mind is not good");
		bw.close();//注:关字符缓冲流的时候,它会自动帮你关掉里面绑定的字符流
	}
	//字符缓冲流读,一次读一个字节
	static void f7() throws IOException
	{
		BufferedReader br=new BufferedReader(new FileReader("TestDemo.txt"));
		int num=0;
		while((num=br.read())!=-1)
		{
			System.out.print((char)num);
		}
	}
	//字符缓冲流读,一次读一个字符数组
	static void f8() throws IOException
	{
		BufferedReader br=new BufferedReader(new FileReader("TestDemo.txt"));
		char[] arr=new char[2];
		int len=0;
		while((len=br.read(arr))!=-1) 
		{
			System.out.print(new String(arr,0,len));
		}
	}
	//字符缓冲流读,一次读一行
	static void f9() throws IOException {
		BufferedReader br=new BufferedReader(new FileReader("TestDemo.txt"));
		String data=null;
		while((data=br.readLine())!=null)
		{
			System.out.println(data);
			System.out.println("\r\n");//写到控制台的话相当于连续换了两行
		}
	}
	//使用字符缓冲流完成文件的复制
	static void f10() throws IOException
	{	
		BufferedReader br=new BufferedReader(new FileReader("TestDemo.txt"));
		BufferedWriter bw=new BufferedWriter(new FileWriter("TestDemo.txt.swp"));
		String data=null;
		while((data=br.readLine())!=null)
		{
			bw.write(data);
			bw.newLine();
		}
		bw.close();
		br.close();
	}
	//特殊的缓冲流:LineNumberReader
	static void f11() throws IOException 
	{
		LineNumberReader lnr=new LineNumberReader(new FileReader("TestDemo.txt"));
		lnr.setLineNumber(0);
		String data=null;
		while((data=lnr.readLine())!=null) {
			System.out.print(lnr.getLineNumber());
			System.out.print(data);
			System.out.println();
		}
	}
	
	

	public static void main(String[] args) throws IOException {
		//f1();
		//f2();
		//f3();
		//f4();
		//f5();
		//f6();
		//f7();
		//f8();
		//f9();
		//f10();
		f11();
	}

}

 

相关文章: