字符流和字节流区别:

字符流和字节流,一个属性范围小,一个属性范围大,字符流只能是字符这一种类型,但是字节流中可以是字符可以是二进制文件,可以是音频,可以是各种各样的类型,只要符合字节形式存储的都可以接字节流,而字符流只能接字符。

关流顺序为:先开后关,后开先关

一、字符流:(之前的是字节流)

字符输出流写数据时,必须要运行一个功能,刷新功能。
flush()

//文件读操作

//文件读操作
import java.io.*;
//字符流:(之前的是字节流)
public class Demo05 {
    public static void main(String[] args)throws IOException {
        File file = new File(".\\path0\\a.txt");
        //字符流:(之前的是字节流)
        FileReader fr=new FileReader(file);
        FileReader fr2=new FileReader(".\\path0\\a.txt");
        int b;
        //字符流基本单位:
        /*while ((b = fr.read())!=-1){
            System.out.println(b);//注意编码方式UTF-8
            System.out.println((char)b);
        }*/
        //读取数组信息
        char [] cache=new char[10];
        fr.read(cache);
        int result = fr.read(cache);
        System.out.println(result);
        //先开后关,后开先关
        fr.close();
    }
}

//文件写操作

//文件写操作
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

//字符流:(之前的是字节流)
public class Demo06 {
    public static void main(String[] args)throws IOException {
        File file = new File(".\\path0\\a.txt");
        //字符流:(之前的是字节流)
        FileWriter fw=new FileWriter(file);
        FileWriter fw2=new FileWriter(".\\path0\\a.txt");
        //fw.write(10);//字符操作的基本单位是字符,写数字时
        fw.write(97);
        fw.write("天王盖地虎");
        fw.write("宝塔镇河妖",1,2);//01234,从1开始取12
        //先开后关,后开先关
        fw.close();
    }
}

 课堂练习:

/**
  * FileReader以字符为单位,读取文件中的内容
  * @throws IOException 
  */
 @Test
 public void test1() throws IOException{
  //创建并实例化FileReader对象
  FileReader fr = new FileReader("D:\\HelloWorld.txt");
  int i = 0; 
  String msg = "";
  while((i = fr.read()) != -1){ //读取文件内容,每次读取1个字符,保存到i里
//   msg = msg + (char) i;
   msg += (char) i; //将读取到的字符i累加(拼接)到字符串msg中
  }
  System.out.println(msg);
  fr.close(); //关流
 }


/**
  * FileWriter类以字符为单位,向文件中写入内容
  * @throws IOException 
  */
 @Test
 public void test2() throws IOException{
  //创建一个FileWriter对象,以字符为数据单元向文件中写入内容
  FileWriter fw = new FileWriter("D:\\HelloWorld.txt");
  //通过write方法,写入内容
  fw.write("淳淳在努力!");
  //关流
  fw.close();
 }

练习题:实现用户注册与登录功能

注册:将用户信息保存到磁盘
登录:将用户信息从磁盘中读取出来,并输出到控制台

方法一:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class TestUserinfo {

	public static void main(String[] args) throws IOException {
		File f=new File("D:\\TestUserinfo.txt");
		if(!f.exists()){
			f.createNewFile();
		}
		FileReader fr=new FileReader(f);
		FileWriter fw=new FileWriter(f,true);
		Scanner sc=new Scanner(System.in);
		boolean isRun=true;
		while(isRun){
			System.out.println("请输入功能:(1注册    2登录    3退出)");
			int xuan=sc.nextInt();
			switch (xuan) {
			case 1:
				System.out.println("*******注册*******");
				System.out.println("请输入用户姓名");
				String name =sc.next();
				System.out.println("请输入用户密码");
				String password =sc.next();
				String str=name+"\n"+password+"\n";
				fw.write(str);
				fw.flush();
				System.out.println("注册成功");
				break;
			case 2:
				System.out.println("*******登录*******");
				System.out.println("请输入用户姓名");
				String name2 =sc.next();
				System.out.println("请输入用户密码");
				String password2 =sc.next();
				int i=0;
				String msg="";
				while((i=fr.read())!=-1){
					msg+=(char)i;
				}
				String[] strs=msg.split("\n");
				boolean isName=false;
				for (int j = 0; j < strs.length; j+=2) {
					if(strs[j].equals(name2)){
						if(strs[j+1].equals(password2)){
							System.out.println("登陆成功");
						}
						else{
							System.out.println("密码错误");
						}
						isName=true;
					}
				}
				if(isName==false){
					System.out.println("用户名不存在");
				}
				break;
			case 3:
				isRun=false;
				break;
			default:
				System.out.println("您输入的数字有问题!");
				break;
			}
		}
		fw.close();
		fr.close();
		System.out.println("退出成功");
	}
}

方法二:

public static void main(String[] args) throws IOException {
		boolean flag = true;
		while (flag) {
			Scanner sc = new Scanner(System.in);
			System.out.println("请输入功能:(1注册    2登录    3退出)");
			int c = sc.nextInt();
			File file = new File(".\\Userinfo");
			if (!file.exists()) {
				file.mkdir();
			}
			switch (c) {
			case 1: // 注册
				System.out.print("请输入用户名:");
				String uname = sc.next();
				System.out.print("请输入密码:");
				String pwd = sc.next();
				File f = new File(".\\Userinfo\\" + uname + ".txt");
				if (!f.exists()) {
					f.createNewFile();
				}
				// 创建并实例化FileWriter对象
				FileWriter fw = new FileWriter(f);
				fw.write(pwd);
				// 关流
				fw.close();
				break;
			case 2: // 登录
				File fi = new File(file.getAbsolutePath());
				File[] fs = fi.listFiles(); // 获得这个文件夹下所有的文件
				System.out.println("请输入用户名:");
				String uname1 = sc.next();
				System.out.println("请输入密码:");
				String pwd1 = sc.next();
				boolean isOk = false;
				// 遍历该文件夹下的所有文件
				for (File f1 : fs) {
					if ((uname1 + ".txt").equals(f1.getName())) {
						isOk = true;
					}
				}
				if (isOk) {
					// 创建并实例化FileReader对象
					FileReader fr = new FileReader(".\\Userinfo\\" + uname1 + ".txt");
					int i = 0;
					String msg = "";
					while ((i = fr.read()) != -1) {
						msg += (char) i;
					}
					// 关流
					fr.close();
					if (pwd1.equals(msg)) {
						System.out.println("登录成功!");
					} else {
						System.out.println("密码错误!登录失败!");
					}
				} else {
					System.out.println("系统中没有该用户,请先注册!!!");
				}

				break;
			case 3: // 退出
				flag = false;
				break;

			default:
				System.out.println("输入有误,请重新输入!!!");
				break;
			}
		}
		System.out.println("退出成功");
	}

二、缓冲流

定义:

缓冲处理流是以提高读写性能为目的的,具备缓冲区的处理流

BufferedlnputStream 字节缓冲输入流
BufferedOutputStream 字节缓冲输出流
BufferedReader 字符缓冲输入流
BufferedWriter 字符缓冲输出流

/**
	 * 字节缓冲输入流BufferedInputStream
	 */
	@Test
	public void test1() throws IOException{
		//创建FileInputStream对象,以字节为单位读取文件内容
		FileInputStream fis = new FileInputStream("C:\\Users\\qin\\Documents\\hello\\三国演义第1回.txt");
		//创建字节缓冲输入流对象BufferedInputStream,作用添加缓冲区,为字节输入流提速(提高读取效率)
		BufferedInputStream bis = new BufferedInputStream(fis, 1024); //添加缓冲区
		
		//读取内容
		int i;
		String msg = ""; //用于保存文件的内容
		while((i = bis.read()) != -1){
			msg += (char) i;
		}
		System.out.println(msg);
		//关流
		bis.close();
		fis.close();
	}
	
	/**
	 * 字节缓冲输出流BufferedOutputStream
	 */
	@Test
	public void test2() throws IOException{
		//创建字节输出流对象FileOutputStream,向文件输出内容
		FileOutputStream fos = new FileOutputStream("C:\\Users\\qin\\Documents\\hello\\三国演义第1回.txt");
		//创建字节缓冲输出流对象BufferedOutputStream,作用添加缓冲区,为字节输出流提速(提高写的效率)
		BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
		//写内容
		bos.write("hahahahaha".getBytes());
		//关流
		bos.close();
		fos.close();
		System.out.println("写完了!");
	}
	
	/**
	 * 字符缓冲输入流BufferedReader
	 */
	@Test
	public void test3() throws IOException{
		//创建字符输入流对象FileReader
		FileReader fr = new FileReader("C:\\Users\\qin\\Documents\\hello\\三国演义第3回.txt");
		//创建字符缓冲输入流对象BufferedReader,作用添加缓冲区,为字符输入流提速(提高读的效率)
		BufferedReader br = new BufferedReader(fr, 1024);
		
		String msg = "";
		String i = "";
		while((i = br.readLine()) != null){
			msg += i;
		}
		System.out.println(msg);
		
		//关流
		br.close();
		fr.close();
	}
	
	/**
	 * 字符缓冲输出流BufferedWritter
	 */
	@Test
	public void test4() throws IOException{
		//创建字符输出流对象FileWriter
		FileWriter fw = new FileWriter("C:\\Users\\qin\\Documents\\hello\\三国演义第5回.txt");
		//创建字符缓冲输出流对象BufferedWriter,作用添加缓冲区,为字符输出流提速(提高写的效率)
		BufferedWriter bw = new BufferedWriter(fw, 1024);
		
		bw.write("既生瑜何生亮");
//		bw.write("\r\n");
		bw.newLine(); //在文件中写入换行符
		bw.write("然后就吐血了");
		
		//关流
		bw.close();
		fw.close();
	}

练习题:

1.案例题目描述:

IO流+集合完成功能

2.案例完成思路要求:

1、通过输入流读取文件test.txt(20分)

文件内容:

张三,20,男

李四,21,女

王五,22,男

2、自定义类Employee(15分)

3、拆分字符串,封装Employee对象(15分)

4、创建ArrayList集合,把对象加入集合,遍历集合打印Employee对象。 (20分)

5、把集合中的内容保存到d:\\emp.txt文件。(20分)

3.其他

6、要求代码每个方法都有注释。(10分)

package pm;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class TestLianXi {

	public static void main(String[] args) throws IOException {
		//创建字符输入流对象FileReader
		FileReader fr = new FileReader(".\\Test.txt");
		//创建字符缓冲输入流对象BufferedReader,作用添加缓冲区,为字符输入流提速(提高读的效率)
		BufferedReader br = new BufferedReader(fr, 1024);
		String i = "";
		//ArrayList集合,把对象加入集合,遍历集合打印Employee
		List<Employee> ems=new ArrayList<Employee>();
		while((i = br.readLine()) != null){//直接一行一读,不用下面的for
			String[] str1=i.split(",");
			Employee em=new Employee(str1[0],Integer.parseInt(str1[1]),str1[2]);
			System.out.println(em.toString());
			ems.add(em);
		}
		/*
		for (int j = 0; j < str1.length-2; j+=2) {
			if(j==0){
				Employee em=new Employee(str1[j],Integer.parseInt(str1[j+1]),str1[j+2].substring(0,1));
				System.out.println(em.toString());
				ems.add(em);
			}else{
				Employee em=new Employee(str1[j].substring(1),Integer.parseInt(str1[j+1]),str1[j+2].substring(0,1));
				System.out.println(em.toString());
				ems.add(em);
			}
		}*/
		//关流
		br.close();
		fr.close();
		//把集合中的内容保存到d:\\emp.txt文件
		//创建字符输出流对象FileWriter
		File f=new File("D:\\emp.txt");
		if(!f.exists()){
			f.createNewFile();
		}
		FileWriter fw = new FileWriter(f);
		//创建字符缓冲输出流对象BufferedWriter,作用添加缓冲区,为字符输出流提速(提高写的效率)
		BufferedWriter bw = new BufferedWriter(fw, 1024);
		for (Employee e : ems) {
			bw.write(e.getName()+","+e.getAge()+","+e.getSex());
			bw.newLine(); //在文件中写入换行符
	    }
		//关流
		bw.close();
		fw.close();
	}
}

  运行结果:

java guanliu java 关流顺序_System

java guanliu java 关流顺序_java guanliu_02