Java中流的操作练习
文件中的学生信息
学生信息存储在TXT文件中,我们需要对信息进行基本的,增、删、改、查,全部显示操作。
1、学生类/Student
package com.yujiao.student;
public class Student {
/**学生id*/
private int id;
/**学生姓名*/
private String name;
/**学生年龄*/
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/**
* 无参构造方法
*/
public Student() {
}
/**
* 有参构造方法
*/
public Student(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
/**
* 重写的toString方法
*/
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
2、学生管理类的接口定义/StudentManagement
package com.yj.student;
import java.util.List;
public interface IStudentManager {
/** 默认文件存放位置*/
public String DEFAULT_PATH = "E:\\Test\\student.txt";
/**
* 获得所有学生信息
* @return 学生信息的List泛型集合
*/
public List<Student> list();
/**
* 根据学生id获取对应的学生对象
* @param id
* @return
*/
public Student get(int id);
/**
* 根据指定id删除学生信息
* @param id 学生id
* @return 删除成功返回true,失败返回false
*/
public boolean delete(int id);
/**
* 根据传入学生对象的信息,修改学生
* 如果传入学生对象的id能够找到对象的信息,那么就修改
* @param student 学生对象,将需要修改的信息封装在这个对象中
* @return 修改成功true,否则false
*/
public boolean update(Student student);
/**
* 传入学生对象,加入到文本信息中
* @param student 学生对象
* @return 添加成功true,否则false
*/
public boolean add(Student student);
}
3、学生管理类接口的实现类/MyStudentManagement
package com.yj.student; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List; public class StudentManagerImpl implements IStudentManager { /** 自定义文本位置的路径 */
private String Path; /**
* 默认构造方法,给到了默认路径
*/
public StudentManagerImpl() {
this.Path = DEFAULT_PATH;
} /**
* 根据传入的路径读取文本文件
*
* @param path 传入的文件路径
*/
public StudentManagerImpl(String path) {
this.Path = path;
} @Override
public List<Student> list() {
List<Student> list = new ArrayList<Student>();
BufferedReader br = null; try {
br = new BufferedReader(new FileReader(this.Path));
String str = null;
while ((str = br.readLine()) != null) {
String[] strs = str.split("\\s+");
int id = Integer.parseInt(strs[0]);
String name = strs[1];
int age = Integer.parseInt(strs[2]); Student s = new Student(id, name, age);
list.add(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return list;
} @Override
public Student get(int id) {
Student stu = null;
BufferedReader br = null; try {
br = new BufferedReader(new FileReader(this.Path));
String str = null;
while ((str = br.readLine()) != null) {
String[] strs = str.split("\\s+");
int sid = Integer.parseInt(strs[0]);
String name = strs[1];
int age = Integer.parseInt(strs[2]);
if (id == sid) {
stu = new Student(sid, name, age);
break;
} }
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return stu;
} @Override
public boolean delete(int id) {
//先把文本文档中的内容读取到内存中
List<Student> stus = list();
boolean flag = false; // 在集合中找到对象并且删除对应的学生对象
for (int i = 0; i < stus.size(); i++) {
Student s = stus.get(i);
if (s.getId() == id) {
flag = true;
stus.remove(s);
break;
}
}
// 将集合中的内容整个重新写到文本文件中
if (flag) {
PrintWriter out = null;
try {
out = new PrintWriter(Path);
for (int i = 0; i < stus.size(); i++) {
Student s = stus.get(i);
String str = s.getId()+" "+s.getName()+" "+s.getAge();
out.println(str);
} } catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
}
}
return flag;
} @Override
public boolean update(Student student) {
// 先把文本文档中的内容读取到内存中
List<Student> stus = list();
boolean flag = false; // 在集合中找到对象并且删除对应的学生对象
for (int i = 0; i < stus.size(); i++) {
Student s = stus.get(i);
if (s.getId() == student.getAge()) {
flag = true;
s.setAge(student.getAge());
s.setName(student.getName());
break;
}
}
// 将集合中的内容整个重新写到文本文件中
if (flag) {
PrintWriter out = null;
try {
out = new PrintWriter(Path);
for (int i = 0; i < stus.size(); i++) {
Student s = stus.get(i);
String str = s.getId() + " " + s.getName() + " " + s.getAge();
out.println(str);
} } catch (FileNotFoundException e) {
flag = false;
e.printStackTrace();
} finally {
try {
out.close();
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
}
}
return flag;
} @Override
public boolean add(Student student) {
// 先把文本文档中的内容读取到内存中
boolean flag = false;
PrintWriter out = null; try {
out = new PrintWriter(new FileWriter(this.Path, true));
out.println(student.getId() + " " + student.getName() + " " + student.getAge());
flag = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (Exception e2) {
e2.printStackTrace();
} }
return flag;
} public String getPath() {
return Path;
} public void setPath(String path) {
this.Path = path;
} }
/** 学生id */
Java中流的操作练习的更多相关文章
- 第57节:Java中流的操作以及编码解码
我的博客: https://huangguangda.cn/ https://huangguangda.github.io/ 前言: 编码解码:编码时将信息从一种形式变成为另一种形式,成为编码.编码为 ...
- java.io中流的操作:字节流、字符流
java.io中流的操作:字节流.字符流(1)使用File类打开一个文件(2)通过字节流或字符流的子类指定输出的位置(3)进行读/写操作(4)关闭输入/输出 1.字节流:主要是byte类型数据,以by ...
- 《精通并发与Netty》学习笔记(09 - Java中流的概念)
Java中流的概念 java程序通过流来完成输入/输出.流是生产或消费信息的抽象.流通过java的输入/输出与物理设备链接.尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式.这样,相同的输 ...
- Java Spring mvc 操作 Redis 及 Redis 集群
本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...
- Java的JDBC操作
Java的JDBC操作 [TOC] 1.JDBC入门 1.1.什么是JDBC JDBC从物理结构上来说就是java语言访问数据库的一套接口集合,本质上是java语言根数据库之间的协议.JDBC提供一组 ...
- Java读写文本文件操作
package com.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; ...
- 第26章 java进制操作
java进制操作 1.二进制 二进制只有0和1,逢二进一 二进制多用在计算机中,来自计算机硬件的开关闭合 2.位运算 分别讲解: 2.1.按位与 & 两位全为1,结果才为1 0&0=0 ...
- Java生成和操作Excel文件(转载)
Java生成和操作Excel文件 JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...
- Java使用Jdbc操作MySql数据库(一)
这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...
随机推荐
- docker使用 Flannel(etcd+flannel)网络
一.Flannel网络简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于 ...
- linux系统下nginx/mysql/php启动、停止、重启命令
/usr/local/nginx/sbin/nginx /etc/init.d/mysql start /usr/local/php/sbin/php-fpm start #nginx命令 ...
- android启动模拟器命令
参考资料:http://blog.csdn.net/sanjinxiong/article/details/6758222 启动模拟器 首先通过android list avd 查看建好的虚拟设备: ...
- Java进阶知识03 Hibernate的基础配置详解
1.Hibernate的原理/流程步骤 1.通过Configuration().configure(); 读取并解析hibernate.cfg.xml配置文件,并创建一个configuration对象 ...
- Asteroids POJ - 3041
Asteroids POJ - 3041 题目大意:N*N的地图里,存在一些小行星,Bessie有个很牛x但又很耗蓝的武器,一次可以消灭一行或者一列的所有小行星,问最少使用多少次这个武器可以消灭所有的 ...
- Qbxt 模拟题 day3(am) T3 选数字 (select)(贪心)
选数字 (select Time Limit:3000ms Memory Limit:64MB 题目描述 LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上 ...
- 玩转git和github
1.概念 git---工具,版本控制 github----网站,社交平台,开源项目,远程仓库 2.下载 msysgit是Windows版的Git,从http://msysgit.github.io/下 ...
- npm脚本编译代码
echo offset codeUrl=D:\svn\oppo_mis\OCSS_NEW\Branches\ProjectCode20190909\h5_ocssset publishUrl=D:\P ...
- AcWing:142. 前缀统计(字典树)
给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1-SNSN中有多少个字符串是T的前缀. 输入字符串的总长度不超过106106,仅包含小写字母. ...
- vscode如何使用命令面板
vscode如何使用命令面板 方法/步骤 首先找到vscode. 进入,打开页面. 找到查看. 打开找到命令面板. 选择打开,可以看到命令. 下拉还有多个,以及快捷键. ...