练习1:
文本之间的复制(五种方法):
方法1、2:
package com.westos.BufferedDome; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class CopyDome { public static void main(String[] args) throws Exception { InputStreamReader isr=new InputStreamReader(new FileInputStream( "file.txt")); OutputStreamWriter isw=new OutputStreamWriter(new FileOutputStream( "c.txt")); /*//方式1:基本的字符流一次读取一个字节 int len=0; while((len=isr.read())!=-1) { isw.write(len); }*/ //方式2:一次读取一个数组 char[] ch=new char[1024]; int len =0; while((len=isr.read(ch))!=-1) { isw.write(ch,0, len); } //关闭资源 isr.close(); isw.close(); } }
方式3、4:
package com.westos.BufferedDome; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; public class CopyDome2 { public static void main(String[] args) throws Exception { //创建字符缓冲输入输出流对象 BufferedReader br=new BufferedReader(new FileReader("File.txt")); BufferedWriter bw=new BufferedWriter(new FileWriter("d.txt")); /*//方式3:一次读取一个数据 int len=0; while((len=br.read())!=-1) { bw.write(len); bw.flush(); }*/ //方式4:一次读取一个数组 char[] ch=new char[1024]; int len=0; while((len=br.read(ch))!=-1) { bw.write(ch,0,len); bw.flush(); } //关闭资源 br.close(); bw.close(); } }
方式5:
package com.westos.BufferedDome; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; public class CopyDome3 { public static void main(String[] args) throws Exception { //创建字符缓冲输入输出流对象 BufferedReader br=new BufferedReader(new FileReader("File.txt")); BufferedWriter bw=new BufferedWriter(new FileWriter("d.txt")); //方式5:一次获取一行 String str = null; while((str=br.readLine())!=null) { bw.write(str); bw.newLine(); bw.flush(); } //关闭资源 br.close(); bw.close(); } }
练习2:
将ArrayList集合中的元素写在文本中:
package com.westos.BufferedDome; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; //需求:把ArrayList集合中的字符串数据存储到文本文件 public class ArrayListToFileDome { public static void main(String[] args) throws IOException { //创建一个ArrayList集合对象 ArrayList<String> list=new ArrayList<String>(); //创建字符缓冲输出流对象 BufferedWriter bw=new BufferedWriter(new FileWriter("e.txt")); //向集合中添加元素 list.add("两只老虎,"); list.add("两只老虎,"); list.add("跑的块,"); list.add("跑的块"); //遍历集合 for(String s:list) { bw.write(s); bw.newLine(); bw.flush(); } bw.close(); } }
将文本中的数据添加到ArrayList集合中:
package com.westos.BufferedDome; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; //需求:有一个文本文本,需要将文本文件中的内容放到ArrayList集合中,遍历集合获取元素 public class FileToArrayListDome { public static void main(String[] args) throws IOException { //创建一个ArrayList集合对象 ArrayList <String> list=new ArrayList <String>(); //创建一个字符缓冲输出流 BufferedReader br=new BufferedReader(new FileReader("e.txt")); //一次读取一行 String st=null; while((st=br.readLine())!=null) { list.add(st); } //关闭资源 br.close(); //循环遍历 for(String s:list) { System.out.println(s); } } }
练习3:
需要将一个文本中的元素随机的读取一个出来(就是随机点一个人的名字)
思路:
1)封装一个文本文件:使用字符缓冲输入流读文件
2)创建一个ArrayList<String>
3)使用字符缓冲输入流readLine(),一次读取一行,就将该行数据添加到集合中
4)创建Random类对象
5)Random类对象.nextInt(集合对象.size()) ;
6)通过角标get(int index ):获取内容
例如:
package com.westos.test; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Random; public class TestDome { public static void main(String[] args) throws IOException { //创建一个字符缓冲输入流对象 BufferedReader br=new BufferedReader(new FileReader("a.txt")); //创建一个ArrayList集合对象 ArrayList<String> list=new ArrayList<String>(); //一次读取一行 String str=null; while((str=br.readLine())!=null) { list.add(str); } //关闭资源 br.close(); //创建Random类对象 Random r=new Random(); int index = r.nextInt(list.size()); String s = list.get(index); System.out.println("被抽取到的人是:"+s); } }
练习4:
运用流的方式 :写一个程序实现在测试类中将一个猜数字小游戏的程序只能用5次 ,超过5次提示:游戏试玩已结束,请付费。
例如:
package com.westos.PropertiesTest; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; /** * 需求: * 我有一个猜数字小游戏的程序,请写一个程序实现在测试类中只能用5次, * 超过5次提示:游戏试玩已结束,请付费。 * 思路: * 1)创建一个file文本,里面有键值对cou=0(代表玩的次数为0) * 2)创建字符输入流对象,来读取文本的内容 * 3)创建属性集合类对象(作用是通过load()方法可以将文本的内容传入到集合类中) * 4)因为Properties是继承hashtable集合,所以可以调用Map集合中的方法,遍历集合中键值对,判断次数超过五次与五次内的输出 * 5)创建字符输出流,将集合类中的元素传入到文本中 */ 猜字小游戏的程序: package com.westos.PropertiesTest; import java.util.Scanner; public class GuessNumber { //创建该类的私有无参构造 private GuessNumber() { } //创建猜字小游戏方法 public static void GuessNumberGame() { //初始化要猜的次数为0 int count=0; //获取一百以内的随机数,运用Math类中的Random()方法,需要进行强制转换成int类型 int num=(int)(Math.random()*100+1); while(true) { //键盘录入要猜的数字 Scanner sc=new Scanner(System.in); System.out.println("请输入您要猜测的数字..."); int number = sc.nextInt(); //每键盘输入一次,count+1 count++; //进行判断 if(number>num) { System.out.println("您猜的有点偏大哦..."); }else if(number<num) { System.out.println("您猜的有点偏小哦..."); }else { System.out.println("恭喜您在猜了"+count+"次后猜对了..."); break; } } } }
测试类:
public class PropertiesTestDome { public static void main(String[] args) throws IOException { //创建字符输入流对象 FileReader fr=new FileReader("a.txt"); //创建一个属性集合类对象 Properties pro=new Properties(); //将文本内容添加到集合类中 pro.load(fr); //关闭资源 fr.close(); //获取集合类中的值,键就是文本中(count=0)初始化的count,值就是0但是不确定还在改变 String str = pro.getProperty("count"); //需要将number的String类型转变成int类型 int number = Integer.parseInt(str); //判断次数是否超过了五次 if(number>5) { System.out.println("游戏试玩结束,请充值..."); //直接退出 System.exit(0); }else { //每玩一次,次数+1 number++; //这时number的值发生了改变,需要将改变的值添加到集合类中 //因为Properties类中的setProperty()方法添加的元素被系统强制定为String类型,所以需要再将number的int类型转变成String类型 String s = String.valueOf(number); pro.setProperty("count", s); //创建字符输出流 FileWriter fw=new FileWriter("a.txt"); //用Properties类中store方法将集合类中元素添加到文本中 pro.store(fw, "game'content"); //关闭资源 fw.close(); //调用猜字小游戏 GuessNumber.GuessNumberGame(); } } }
练习5:用IO流的方式去模拟用户注册、登录
先创建一个用户实体类:
package com.westos.regist_login.entity; /** * @author 杰哥 *这里是用户类 */ public class User { /*//私有化该类的无参构造 private User() { }*/ //定义属性 private String username; private String password; public User() { super(); } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User(String username, String password) { super(); this.username = username; this.password = password; } }
再创建一个接口去写入登录和注册方法
package com.westos.regist_login.Dao; import com.westos.regist_login.entity.User; /** * @author 杰哥 *这里是用户接口的注册和登录方法 */ public interface UserDao { //注册方法 public abstract void regist(User user); //登录方法 public abstract boolean login(String username,String password); }
再创建一个子实现类去实现接口中的注册、登录方法
package com.westos.regist_login.Dao_impl; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import com.westos.regist_login.Dao.UserDao; import com.westos.regist_login.entity.User; /** * @author 杰哥 *该类是为了实现UserDao接口中的方法 */ public class UserDaoImpl implements UserDao { //创建一个文本 private static File file=new File("user.txt"); //静态代码块 static{ if(file!=null) { try { file.createNewFile(); } catch (IOException e) { // e.printStackTrace(); System.out.println("文本创建失败了..."); } } } /** *实现注册方法 */ @Override public void regist(User user) { BufferedWriter bw=null; //创建一个字符输出流对象,向文本中写入注册时的用户名和密码 try { bw=new BufferedWriter(new FileWriter(file,true)); bw.write(user.getUsername()+"="+user.getPassword()); bw.newLine(); bw.flush(); } catch (IOException e) { // e.printStackTrace(); System.out.println("注册失败..."); }finally { if(bw!=null) { try { bw.close(); } catch (IOException e) { // e.printStackTrace(); System.out.println("注册时释放资源失败..."); } } } } /** * 实现登录方法 */ @Override public boolean login(String username, String password) { //初始化登录失败 boolean flag=false; BufferedReader br=null; //创建字符缓冲输出流对象 try { br=new BufferedReader(new FileReader(file)); //一次读取一行 String str=null; while((str=br.readLine())!=null) { //split方法返回的是字符串数组 String[] split = str.split("="); //判断 if(split[0].equals(username)&&split[1].equals(password)) { flag=true; break; } } } catch (FileNotFoundException e) { // e.printStackTrace(); System.out.println("读取文本失败..."); } catch (IOException e) { // e.printStackTrace(); System.out.println("登录失败..."); }finally { if(br!=null) { try { br.close(); } catch (IOException e) { // e.printStackTrace(); System.out.println("登录时释放资源失败..."); } } } return flag; } }
最后写一个测试类去运行
package com.westos.Test; import java.util.Scanner; import com.westos.regist_login.Dao.UserDao; import com.westos.regist_login.Dao_impl.UserDaoImpl; import com.westos.regist_login.entity.User; public class UserTest { public static void main(String[] args) { //通过多态创建接口子实现类的对象 UserDao ud=new UserDaoImpl(); //创建键盘录入 Scanner sc=new Scanner(System.in); while(true) { System.out.println("欢迎光临,请选择以下选项"); System.out.println("1:注册"); System.out.println("2:登录"); System.out.println("3:退出"); String number = sc.nextLine(); switch(number) { case "1": System.out.println("------------------欢迎进入注册页面--------------------"); System.out.println("请输入您的用户名:"); String name=sc.nextLine(); System.out.println("请输入您的密码:"); String word = sc.nextLine(); //创建User类对象,并将键盘录入的元素添加到User类中 User user=new User(name,word); //调用接口中的注册方法 ud.regist(user); System.out.println("恭喜您,注册成功..."); break; case "2": System.out.println("--------------------欢迎进入登录页面--------------------"); System.out.println("请输入您的用户名:"); String name2=sc.nextLine(); System.out.println("请输入您的密码:"); String word2 = sc.nextLine(); //调用接口中的登录方法 boolean login = ud.login(name2, word2); if(login) { System.out.println("恭喜您,登录成功..."); System.exit(0); }else { System.out.println("您输入的信息有误,请重新输入..."); } break; case "3": default: System.out.println("欢迎您下次再来..."); System.exit(0); } } } }