字符流和字节流区别:
字符流和字节流,一个属性范围小,一个属性范围大,字符流只能是字符这一种类型,但是字节流中可以是字符可以是二进制文件,可以是音频,可以是各种各样的类型,只要符合字节形式存储的都可以接字节流,而字符流只能接字符。
关流顺序为:先开后关,后开先关
一、字符流:(之前的是字节流)
字符输出流写数据时,必须要运行一个功能,刷新功能。
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();
}
}