1.IO流的概述
流:就是一个动态的运行过程
起点和终点—在编程过程中,整个的传输过程中不能中断,如果出现中断会重新开始传输
分类:
顶级父类:
输出流:OutputStream
输入流:InputStream
流的传输处理过程:IPO
在Java的api中有许多的流:
1.字节流(低级流,基本流):通过字节为单位进行传输—byte
2.高级流(缓冲流):使用高级流的时候必须传入一个低级流—高级流的构造函数中必须传入一个低级流的参数
比如:
文件传输:文件流
对象传输:对象流
图像传输:图片流
———-
具体通过api进行查询使用
底层都是byte
2.FileWriter流(输出流)
FileWriter是一个文件传输流,用于在文件中写数据
构造方法:FileWriter(String fileName)传入一个文件的路径
输出流的使用步骤:(死记)—后面使用其他的流都是这样的套路
1.创建输出流对象
2.调用输出流对象的书写数据的方法
3.关闭流—释放资源
package com.igeek_01;
/**
* @author Lynn
* @create 2020-11-26-14:07
*/
import java.io.FileWriter;//io包中提供了许多的流
import java.io.IOException;
/**
* FileWriter是一个文件传输流,用于在文件中写数据
*
* 需求:
* 向文件中写入数据
* 写数据--输出流--FileWriter
*
* 构造方法:FileWriter(String fileName)传入一个文件的路径
*
* 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路
* 1.创建输出流对象
* 2.调用输出流对象的书写数据的方法
* 3.关闭流--释放资源
*
*/
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//创建输出流对象--定义的路径会自动生成一个文件
FileWriter fw=new FileWriter("f:\\a.txt");
/**
* 创建输出流做了几件事情:
* 1.调用了系统中的资源创建一个对象
* 2.创建输出流对象--只要流不关闭就一直存在
* 3.把输出流对象指向文件
*/
//调用输出流对象的书写数据的方法
fw.write("你好io");//写一个字符串
//flush();表示刷新缓存区,需要调用这个方法将缓存中的数据全部刷新到文件中
fw.flush();
//关闭流--释放资源
fw.close();
}
}
结果:
运行代码
在f盘中自动生成a.txt文件
计算机中的路径问题:
- (1)绝对路径—以盘符开始的路径—定位
(2)相对路径—相当于当前项目而言,在项目的根目录下—某一个参照物来进行处理的
close和flash方法的区别:
(1)flash方法:刷新缓存区,流对象还是可以继续使用的
- (2)close方法:先刷新缓存区,然后通知系统来释放资源,流对象就不存在了 ```java package com.igeek_02;
/**
- @author Lynn
- @create 2020-11-26-14:07 */
import java.io.FileWriter; import java.io.IOException;
/**
- FileWriter是一个文件传输流,用于在文件中写数据 *
- 需求:
- 向文件中写入数据
- 写数据—输出流—FileWriter *
- 构造方法:FileWriter(String fileName)传入一个文件的路径 *
- 输出流的使用步骤:(死记)—后面使用其他的流都是这样的套路
- 1.创建输出流对象
- 2.调用输出流对象的书写数据的方法
- 3.关闭流—释放资源 *
- 计算机中的路径问题:
- (1)绝对路径—以盘符开始的路径—定位
- (2)相对路径—相当于当前项目而言,在项目的根目录下—某一个参照物来进行处理的 *
- close和flash方法的区别:
- (1)flash方法:刷新缓存区,流对象还是可以继续使用的
(2)close方法:先刷新缓存区,然后通知系统来释放资源,流对象就不存在了 */ public class FileWriterDemo2 { public static void main(String[] args) throws IOException {
//创建输出流对象--定义的路径会自动生成一个文件
// FileWriter fw=new FileWriter(“f:\a.txt”);
FileWriter fw=new FileWriter("a.txt");//相对路径--当前项目的根目录
/**
* 创建输出流做了几件事情:
* 1.调用了系统中的资源创建一个对象
* 2.创建输出流对象--只要流不关闭就一直存在
* 3.把输出流对象指向文件
*/
//调用输出流对象的书写数据的方法
fw.write("你好io");//写一个字符串
//flush();表示刷新缓存区,需要调用这个方法将缓存中的数据全部刷新到文件中
fw.flush();
//关闭流--释放资源
fw.close();
} } 结果: 运行代码 在工程中自动生成该文件a.txt ```
FileWriter其他方法的使用:
- 1.void write(String str):写一个字符串数据
- 2.void write(String str,int index,int length):写一个字符串中的部分数据—从index开始,写length个数据
- 3.void write(int ch):写一个字符数据
—这里的int类型的好处是既可以写char类型也可以写char类型所对应的值
- 4.void write(int ch,int index,int length):写一个数组数据的一部分数据—从index开始,写length个数据 ```java package com.igeek_03;
/**
- @author Lynn
- @create 2020-11-26-14:37 */
import java.io.FileWriter; import java.io.IOException;
/**
- FileWriter其他方法的使用:
- 1.void write(String str):写一个字符串数据
- 2.void write(String str,int index,int length):写一个字符串中的部分数据
- 3.void write(int ch):写一个字符数据—这里的int类型的好处是
- 既可以写char类型也可以写char类型所对应的值
4.void write(int ch,int index,int length):写一个数组数据的一部分数据 */ public class FileWriterDemo3 { public static void main(String[] args)throws IOException {
char c='中';
System.out.println(c);//中
int a='中';
System.out.println(a);//20013
int b='A';
System.out.println(b);//65
int d='琳';
System.out.println(d);//王:29579,琳:29747
//创建一个对象
FileWriter fw=new FileWriter("b.txt");//相对路径
//数据操作
fw.write("画画的北北,画画的北北,压坏了小野马和带刺的玫瑰",0,7);
fw.write("\t\n");
fw.write(65);//A
fw.write("\t\n");
fw.write('A');//A
fw.write("\t\n");
fw.write("a");//a
fw.write("\t\n");
fw.write(20013);//中
char[] ch={'a','b','c','d'};
fw.write(ch);
fw.write(ch,2,2);//参数1表示截取的写入个数
//为了防止忘记关闭流
fw.close();
FileWriter实现换行和追加:
换行:\n可以实现换行,但是在某些版本的windows下的记事本中没有效果
如果没有效果,我们可以使用\r\n
在Windows系统中使用换行这个功能的时候,为了代码的健壮性,推荐使用\r\n,保证不出问题
追加:FileWriter(String fileName,boolean append):默认值是false ```java package com.igeek_01;
/**
- @author Lynn
- @create 2020-11-26-15:09 */
import java.io.FileWriter; import java.io.IOException;
/**
- FileWriter实现换行和追加: *
- 换行:\n可以实现换行,但是在某些版本的windows下的记事本中没有效果
- 如果没有效果,我们可以使用\r\n
- 在Windows系统中使用换行这个功能的时候,为了代码的健壮性,推荐使用\r\n,保证不出问题 *
- 追加:FileWriter(String fileName,boolean append):默认值是false
*/
public class FileWriterDemo4 {
public static void main(String[] args) throws IOException {
//创建一个对象--true表示默认追加
FileWriter fw=new FileWriter("c.txt",true);//相对路径
//追加字符串
for (int i = 0; i <5 ; i++) {
fw.write("hello");
fw.write("\r\n");//换行
}
fw.write(65);
fw.write("\r\n");
fw.write("a");
fw.write("\r\n");
//为了防止忘记关闭流
fw.close();
}
}
<a name="mvfOC"></a>
# 3.FileReader(输入流)
<a name="ADKgf"></a>
### 从文件中读取数据在控制台显示
- 需求:
- 从文件中读取数据在控制台显示
- 读数据--输入流--FileReader
- <br />
- FileReader构造函数:
- FileReader(String fileName):传入一个文件的路径--保证存在的
- <br />
- 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路
- 1.创建输入流对象
- 2.调用输入流对象的书写数据的方法
- 3.关闭流--释放资源
- <br />
- 注意:
- 进行读取的时候不许保证文件存在,如果不存在会报错
- Exception in thread "main" java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)
```java
package com.igeek_02;
/**
* @author Lynn
* @create 2020-11-26-15:21
*/
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* 从文件中读取数据在控制台显示
*
* 需求:
* 从文件中读取数据在控制台显示
* 读数据--输入流--FileReader
*
* FileReader构造函数:
* FileReader(String fileName):传入一个文件的路径--保证存在的
*
* 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路
* 1.创建输入流对象
* 2.调用输入流对象的书写数据的方法
* 3.关闭流--释放资源
*
* 注意:
* 进行读取的时候不许保证文件存在,如果不存在会报错
* Exception in thread "main" java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)
*/
public class FileReaderDemo1 {
public static void main(String[] args) throws IOException {
//创建一个输入流
FileReader fr=new FileReader("b.txt");
//调用输入流的方法
//通过循环的方式进行读取--当出现-1的时候表示该文件已经读取结束
int ch;//设定一个初始值
//遍历
while ((ch=fr.read()) != -1){//说明文件读取没有结束
//读
System.out.println((char)ch);//强制类型转换--把int转换为char
}
//释放资源
fr.close();
}
}
读取数据
批量读取—其实就是将多个字符打包成一个数组,read()方法在读取的时候直接一次性读取一个数组
package com.igeek_02;
/**
* @author Lynn
* @create 2020-11-26-15:21
*/
import java.io.FileReader;
import java.io.IOException;
/**
* 从文件中读取数据在控制台显示
*
* 需求:
* 从文件中读取数据在控制台显示
* 读数据--输入流--FileReader
*
* FileReader构造函数:
* FileReader(String fileName):传入一个文件的路径--保证存在的
*
* 输出流的使用步骤:(死记)--后面使用其他的流都是这样的套路
* 1.创建输入流对象
* 2.调用输入流对象的书写数据的方法
* 3.关闭流--释放资源
*
* 注意:
* 进行读取的时候不许保证文件存在,如果不存在会报错
* Exception in thread "main" java.io.FileNotFoundException: fr.txt (系统找不到指定的文件。)
*/
public class FileReaderDemo2 {
public static void main(String[] args) throws IOException {
//创建一个输入流
FileReader fr=new FileReader("b.txt");
//调用read方法--输入流中的方法
//int read();--一次读取一个字符
//第一次读取
int ch=fr.read();
System.out.println(ch);//30011
System.out.println((char)ch);//画
//第二次读取
ch=fr.read();
System.out.println(ch);//30011
System.out.println((char)ch);//画
//批量读取--其实就是将多个字符打包成一个数组,read()方法在读取的时候直接一次性读取一个数组
int len;//数组长度
char[] chs=new char[5];//一次性读取5个字符(5个5个的读取)
while ((len= fr.read(chs)) != -1){//表示文件正在读取
//一次性读取的是5个字符--多个字符其实就是字符串
System.out.print(new String(chs,0,len));
}
//释放资源
fr.close();
}
}
4.文件的复制
文件的拷贝复制
- 源文件,目标文件
- 需求:
- 把项目中的根路径下的c.txt中的内容复制到项目根路径下的Copy.java中
- 文件的复制也是一个套路—操作步骤是一样的
- 数据源:c.txt—读取文件—FileReader
- 目的地:Copy.java—写入数据—FileWriter ```java package com.igeek_03;
/**
- @author Lynn
- @create 2020-11-26-16:16 */
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;
/**
- 文件的拷贝复制 *
- 源文件,目标文件
- 需求:
- 把项目中的根路径下的c.txt中的内容复制到项目根路径下的Copy.java中
- 文件的复制也是一个套路—操作步骤是一样的 *
- 数据源:c.txt—读取文件—FileReader
目的地:Copy.java—写入数据—FileWriter */ public class CopyFileDemo1 { public static void main(String[] args) throws IOException {
//创建文件的输入流对象
FileReader fr=new FileReader("c.txt");//保证源文件存在
//创建文件的输出流对象
FileWriter fw=new FileWriter("Copy.java");//程序自动创建
//读取源文件数据
//一次复制一个字符
int ch;
while ((ch=fr.read()) != -1){//读取
//写入数据到目标文件
fw.write(ch);
}
//释放资源--关闭流
fr.close();
fw.close();
} }
/**
- @author Lynn
- @create 2020-11-26-16:16 */
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;
/**
- 文件的拷贝复制 *
- 源文件,目标文件
- 需求:
- 把项目中的根路径下的c.txt中的内容复制到项目根路径下的Copy.java中
- 文件的复制也是一个套路—操作步骤是一样的 *
- 数据源:c.txt—读取文件—FileReader
目的地:Copy.java—写入数据—FileWriter */ public class CopyFileDemo2 { public static void main(String[] args) throws IOException {
//创建文件的输入流对象
FileReader fr=new FileReader("c.txt");//保证源文件存在
//创建文件的输出流对象
FileWriter fw=new FileWriter("Copy.java");//程序自动创建
//读取源文件数据
//一次复制1024个字符
int len;
char[] chs=new char[1024];
while ((len=fr.read(chs)) != -1){//读取
//写入数据到目标文件
fw.write(chs,0,len);
}
//释放资源--关闭流
fr.close();
fw.close();
5.BufferedStream
BufferedStream是一个缓冲流
- 包括:
- BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而实现单个字符,数组,字符串的高效写入
- BufferedReader:从字符流中读取文本,缓冲各个字符,从而实现字符,数组和行的高效读取
- 缓冲流属于高级流,在构造函数中必须传入一个低级流才可以使用
- FileWriter就是一个低级流—因为它支持单个字符的写入 ```java package com.igeek_04;
/**
- @author Lynn
- @create 2020-11-26-16:32 */
import java.io.*;
/**
- BufferedStream是一个缓冲流 *
- 包括:
- BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而实现单个字符,数组,字符串的高效写入
- BufferedReader:从字符流中读取文本,缓冲各个字符,从而实现字符,数组和行的高效读取 *
- 缓冲流属于高级流,在构造函数中必须传入一个低级流才可以使用
FileWriter就是一个低级流—因为它支持单个字符的写入 */ public class BufferedStreamDemo { public static void main(String[] args) throws IOException {
//创建输入缓冲流对象--要输入一个低级流
BufferedReader br=new BufferedReader(new FileReader("c.txt"));
//读取
char[] chs=new char[1024];
int len;
while ((len=br.read(chs)) != -1){
System.out.print(new String(chs,0,len));
}
//释放资源--直接关闭高级流的同时,低级流自己关闭了
br.close();
//创建缓冲输出流
BufferedWriter bw=new BufferedWriter(new FileWriter("bw.txt"));
//写入
bw.write("我是一颗");
//关闭
bw.close();
缓冲流实现复制
```java package com.igeek_04;
/**
- @author Lynn
- @create 2020-11-26-16:16 */
import java.io.*;
/**
- 文件的拷贝复制
- 利用缓冲流复制文件
- 源文件,目标文件
- 需求:
- 把项目中的根路径下的c.txt中的内容复制到项目根路径下的Copy.java中
- 文件的复制也是一个套路—操作步骤是一样的 *
- 数据源:c.txt—读取文件—BufferedReader
目的地:Copy.java—写入数据—BufferedWriter */ public class CopyBufferedDemo2 { public static void main(String[] args) throws IOException {
//创建文件的输入流对象
BufferedReader br=new BufferedReader(new FileReader("c.txt"));
// FileReader fr=new FileReader(“c.txt”);//保证源文件存在
//创建文件的输出流对象
BufferedWriter bw=new BufferedWriter(new FileWriter("Copy1.java"));
// FileWriter fw=new FileWriter(“Copy.java”);//程序自动创建
//读取源文件数据
//一次复制1024个字符
int len;
char[] chs=new char[1024];
while ((len=br.read(chs)) != -1){//读取
//写入数据到目标文件
bw.write(chs,0,len);
}
//释放资源--关闭流
br.close();
bw.close();
BufferedStream的特殊功能
- 特殊功能:
- BufferedWriter中
- void newLine()方法:写一个换行符,这个换行符由系统决定的
- BufferedReader中
- String readLine()方法:一次读取一行数据,但是不读取换行符 ```java package com.igeek_05;
/**
- @author Lynn
- @create 2020-11-27-9:36 */
import java.io.*;
/**
- BufferedStream的特殊功能 *
- 特殊功能:
- BufferedWriter中
- void newLine()方法:写一个换行符,这个换行符由系统决定的 *
- BufferedReader中
String readLine()方法:一次读取一行数据,但是不读取换行符 / public class BufferedStreamDemo { public static void main(String[] args) throws IOException {
/**
* BufferedWriter中
* void newLine()方法:写一个换行符,这个换行符由系统决定的
*/
//创建一个缓冲输出流
BufferedWriter bw=new BufferedWriter(new FileWriter("bw2.txt",true));//文件自动生成
//验证
for (int i = 0; i <10 ; i++) {
bw.write("hello"+i);
// bw.write(“\t\n”);//手动添加
bw.newLine();
bw.flush();//刷新缓冲流。在循环中,我们可以尽量调用这个刷新缓存区的方法,循环一次就刷新缓存区
}
//释放资源
bw.close();
/**
* BufferedReader中
* String readLine()方法:一次读取一行数据,但是不读取换行符
*/
//创建输入流
BufferedReader br=new BufferedReader(new FileReader("bw2.txt"));
//先尝试读取一行
/*String line=br.readLine();
System.out.println(line);//hello0*/
//用循环读取
String line;//初始变量
while ((line=br.readLine()) != null){
System.out.println(line);
}
br.close();
汇总5种文件复制的方法
第一种方式:基本流—一次读写一个字符
第二种方式:基本流—一次读写一个字符数组
第三种方式:缓冲流—一次读写一个字符
第四种方式:缓冲流—一次读写一个字符数组
第五种方式:缓冲流—一次读写一行 ```java package com.Copy_01;
/**
- @author Lynn
- @create 2020-11-27-10:23 */
import java.io.*;
/**
汇总5种文件复制的方法 */ public class CopyFileTest { public static void main(String[] args) throws IOException {
//设置目标文件和源文件
String srcFile="b.txt";
String destFile="copyn.java";
method1(srcFile,destFile);
method2(srcFile,destFile);
method3(srcFile,destFile);
method4(srcFile,destFile);
method5(srcFile,destFile);
}
//第一种方式:基本流—一次读写一个字符 public static void method1(String srcFile,String destFile) throws IOException {
//创建基本流
FileReader fr=new FileReader(srcFile);
FileWriter fw=new FileWriter(destFile);
//一次读写一个字符
int ch;
while ((ch=fr.read()) != -1){
fw.write(ch);
}
//释放资源
fr.close();
fw.close();
}
//第二种方式:基本流—一次读写一个字符数组 public static void method2(String srcFile,String destFile) throws IOException {
//创建基本流
FileReader fr=new FileReader(srcFile);
FileWriter fw=new FileWriter(destFile);
//一次读写一个字符数组
char[] chs=new char[1024];
int len;
while ((len=fr.read(chs)) != -1){
fw.write(chs,0,len);
}
//释放资源
fr.close();
fw.close();
}
//第三种方式:缓冲流—一次读写一个字符 public static void method3(String srcFile,String destFile) throws IOException {
//
BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));
BufferedReader br=new BufferedReader(new FileReader(destFile));
//一次读写一个字符
int ch;
while ((ch=br.read()) != -1){
bw.write(ch);
}
//释放资源
br.close();
bw.close();
}
//第四种方式:缓冲流—一次读写一个字符数组 public static void method4(String srcFile,String destFile) throws IOException {
//
BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));
BufferedReader br=new BufferedReader(new FileReader(destFile));
//一次读写一个字符数组
char[] chs=new char[1024];
int len;
while ((len=br.read(chs)) != -1){
bw.write(chs,0,len);
}
//释放资源
br.close();
bw.close();
}
//第五种方式:缓冲流—一次读写一行 public static void method5(String srcFile,String destFile) throws IOException {
//
BufferedWriter bw=new BufferedWriter(new FileWriter(srcFile));
BufferedReader br=new BufferedReader(new FileReader(destFile));
//一次读写一行
String line;
while ((line=br.readLine()) != null){
bw.write(line);
}
//释放资源
br.close();
bw.close();
当前案例用于实现数据持久化
```java package com.practice_01;
/**
- @author Lynn
- @create 2020-11-26-9:31 */
/**
这是一个学生的实体类 */ public class Student { //属性—为了方便获取字符串的信息,统一设置为字符串类型 private String id; private String name; private String age; private String address;
public Student() {
}
public Student(String id, String name, String age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }
/**
- @author Lynn
- @create 2020-11-27-10:58 */
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;
/**
- 当前案例用于实现数据持久化 *
- 学生信息添加到文件中—-要求封装一个方法实现 *
- 需求分析:
- 1.键盘录入3个学生的信息(学号,姓名,年龄,居住地)存入到集合中,要求学生的学号不能重复
- 2.遍历集合,把每个学生的信息存入到文件中—student.txt
- 3.把每一个学生的信息作为一行数据,每行数据都是:学号,姓名,年龄,居住地 *
- 步骤:
- 1.定义一个学生类
- 2.创建集合对象
- 3.写方法实现键盘录入,并且把学生信息作为元素保存到集合中
- 4.创建缓冲输出流
- 5.遍历集合的同时,按照一定的格式把学生的信息保存到文件中—举例:1001,王嘉尔,27,香港
6.释放资源 */ public class ArrayListToFileDemo { public static void main(String[] args) throws IOException {
//创建集合对象
ArrayList<Student> array=new ArrayList<Student>();
//封装一个方法--直接调用
addStudent(array);
addStudent(array);
addStudent(array);
//写出到文件中
BufferedWriter bw=new BufferedWriter(new FileWriter("student.txt"));
//
for (int i = 0; i < array.size() ; i++) {
//
Student s= array.get(i);
//
StringBuilder sb=new StringBuilder();
sb.append(s.getId()).append(",");//id
sb.append(s.getName()).append(",");//name
sb.append(s.getAge()).append(",");//age
sb.append(s.getAddress()).append(",");//address
//写出到文件
bw.write(sb.toString());//将可追加的字符串转换为字符串
bw.newLine();//换行
bw.flush();
}
}
//封装一个方法,添加学生—为了封装的彻底性直接使用私有方法—因为这个方法就在本类中使用 private static void addStudent(ArrayList
array){ Scanner sc=new Scanner(System.in);
//判断学号是不是重复
String id;
while (true){
System.out.println("请输入学号:");
id= sc.nextLine();
//判断
//定义一个标记
boolean flag=false;
for (int i = 0; i < array.size() ; i++) {
Student s= array.get(i);
//获取学生学号与键盘录入的id比较
if(s.getId().equals(id)){
flag=true;
break;//如果已经存在就跳出
}
}
if(flag){
System.out.println("你输入的学号已经存在,请重新输入!");
}else {
//直接添加
break;
}
}
//继续下面的添加操作
System.out.println("请输入学生姓名:");
String name=sc.nextLine();
System.out.println("请输入学生年龄:");
String age=sc.nextLine();
System.out.println("请输入学生居住地:");
String address=sc.nextLine();
//封装成一个学生对象--直接利用构造函数
Student s=new Student(id,name,age,address);
//把学生对象保存到集合中
array.add(s);
读取文件中的数据
```java package com.practice_01;
/**
- @author Lynn
- @create 2020-11-27-14:35 */
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Member; import java.util.ArrayList;
/**
- 把上一个案例中的student.txt文件中的内容读取出来 *
- 步骤:
- 1.定义一个学生类
- 2.创建集合对象
- 3.创建缓冲输入流对象
- 4.读取文件,并且按照一定的格式保存到集合中
- 5.释放资源
6.遍历集合 */ public class FileToArrayListDemo { public static void main(String[] args) throws IOException {
//创建集合对象
ArrayList<Student> array=new ArrayList<Student>();
//创建缓冲输入流对象
BufferedReader br=new BufferedReader(new FileReader("student.txt"));
//读取文件,并且按照一定的格式进行分割
String line;
while ((line=br.readLine()) != null){
//分割字符串--返回的是字符串类型的数组--下标--根据下标进行取值
String[] strArray=line.split(",");
//创建学生对象并且赋值
Student s=new Student();
s.setId(strArray[0]);
s.setName(strArray[1]);
s.setAge(strArray[2]);
s.setAddress(strArray[3]);
//把学生对象作为元素保存到集合中
array.add(s);
}
//释放资源
br.close();
//遍历集合,并且输出到控制台
System.out.println("学号\t姓名\t年龄\t居住地");
for (int i = 0; i < array.size() ; i++) {
Student s= array.get(i);
System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getAddress());
}
学生管理系统
学生管理系统
步骤:
1.创建一个学生类 ```java package StudentManagement;
/**
- @author Lynn
- @create 2020-11-26-9:31 */
/**
这是一个学生的实体类 */ public class Student { //属性—为了方便获取字符串的信息,统一设置为字符串类型 private String id; private String name; private String age; private String address;
public Student() {
}
public Student(String id, String name, String age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }
2.学生管理系统主界面的编写(原始的学生管理系统,只能键盘录入)<br />3.学生管理系统的查看所有学生的信息<br />4.添加学生信息<br />5.删除学生信息<br />6.修改学生信息
java package practice03;
/**
- @author Lynn
- @create 2020-11-26-9:28 */
import java.util.ArrayList; import java.util.Scanner;
/**
- 这是一个学生管理系统
- 步骤:
- 1.定义一个学生类
- 2.学生管理系统主界面的编写
- 3.学生管理系统的查看所有学生的信息
- 4.添加学生信息
- 5.删除学生信息
6.修改学生信息 */ public class StudentMangerTest { public static void main(String[] args) {
//定义一个学生类型集合
ArrayList<Student> array=new ArrayList<Student>();
//为了用户体验度,设计一个界面
//利用循环的方式可以重复的展示界面,直到退出程序就结束循环
while(true){
//主界面的欢迎词
System.out.println("---------------------欢迎来到学生管理系统------------------------");
System.out.print("1 查看所有学生"+"\t");
System.out.print("2 添加学生"+"\t");
System.out.print("3 删除学生"+"\t");
System.out.print("4 修改学生"+"\t");
System.out.print("5 退出系统"+"\t");
System.out.println();
//键盘录入获取
Scanner sc=new Scanner(System.in);
String choiceString=sc.nextLine();
//用开关键--switch···case
switch (choiceString){
case "1":
//查看所有学生
findAllAtudent(array);
break;
case "2":
//添加学生
addStudent(array);
break;
case "3":
//删除学生
deleteStudent(array);
break;
case "4":
//修改学生
updateStudent(array);
break;
case "5":
//退出系统
default:
System.out.println("谢谢使用,欢迎下次再来!");
System.exit(0);//Java中提供的
break;
}
}
} //封装一个方法用于查询学生的所有信息 public static void findAllAtudent(ArrayList
array){ //首先来判断集合中是否有数据,如果没有数据,就给出提示,并让该方法不继续往下执行
if(array.size()==0){
System.out.println("抱歉!目前没有学生信息可供查询,请回去重新选择你的操作");
return;//将当前的方法直接结束
}
//有学生的情况下--遍历查询
//\t表示一个Tab键--制表符
System.out.println("学号\t姓名\t年龄\t居住地");
for (int i = 0; i < array.size() ; i++) {
Student s= array.get(i);
//输出属性
System.out.println(s.getId()+"\t"+
s.getName()+"\t"+
s.getAge()+"\t"+
s.getAddress());
}
}
//封装一个方法用于添加学生信息 public static void addStudent(ArrayList
array){ //键盘录入对象
Scanner sc=new Scanner(System.in);
//所有的对学生的操作都是基于id,所以我们把id属性放到循环的外面
String id;
//能够实现重复添加学生的信息,所以使用循环
while (true){
//判断一下这个学号是不是已经存在
System.out.println("请输入学号:");
id=sc.nextLine();
//定义一个标记--假设不存在
boolean flag=false;
//遍历学号--就是遍历数组
for (int i = 0; i < array.size() ; i++) {
Student s= array.get(i);
//获取学号
if(s.getId().equals(id)){
flag=true;//学号存在
break;
}
}
//这个时候flag就是true
if(flag){
System.out.println("你的学号已经被占用,请重新输入!");
}else {
break;
}
}
//通过验证可以添加学生
System.out.println("请输入学生姓名:");
String name=sc.nextLine();
System.out.println("请输入学生年龄:");
String age=sc.nextLine();
System.out.println("请输入学生住址:");
String address=sc.nextLine();
//创建学生对象
Student s=new Student();
//赋值
s.setId(id);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//把学生保存到集合中
array.add(s);
//给出提示
System.out.println("添加学生成功!");
}
//封装一个方法用于删除学生信息 public static void deleteStudent(ArrayList
array) { //删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生
//创建键盘录入对象
Scanner sc=new Scanner(System.in);
System.out.println("请输入你要删除的学生的学号:");
String id=sc.nextLine();
//遍历集合看看这个id所对应的学生是不是存在--设置一个索引
int index=-1;
for (int i = 0; i < array.size() ; i++) {
//获取每一个学生
Student s= array.get(i);
//判断学生的学号和键盘录入的id进行比较
if(s.getId().equals(id)){//要删除的对象存在
index=i;
break;
}
}
if(index==-1){
System.out.println("抱歉!你要删除的学号对应的学生信息不存在,请回去重新你的选择");
}else {
array.remove(index);
System.out.println("删除成功!");
}
}
//封装一个方法用于修改学生信息 public static void updateStudent(ArrayList
array){ //删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生
//创建键盘录入对象
Scanner sc=new Scanner(System.in);
System.out.println("请输入你要修改的学生的学号:");
String id=sc.nextLine();
//遍历集合看看这个id所对应的学生是不是存在--设置一个索引
int index=-1;
for (int i = 0; i < array.size() ; i++) {
//获取每一个学生
Student s= array.get(i);
//判断学生的学号和键盘录入的id进行比较
if(s.getId().equals(id)){//要修改的对象存在
index=i;
break;
}
}
if(index==-1){
System.out.println("抱歉!你要修改的学号对应的学生信息不存在,请回去重新你的选择");
}else {
//开始进行修改
System.out.println("请输入新的学生姓名:");
String name=sc.nextLine();
System.out.println("请输入新的学生年龄:");
String age=sc.nextLine();
System.out.println("请输入新的学生住址:");
String address=sc.nextLine();
//创建一个新的对象
Student s=new Student();
s.setId(id);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//修改集合中的学生对象--实际上就是把原来的信息替换
array.set(index,s);
System.out.println("修改成功!");
}
} }
<a name="8Le8t"></a>
#### 学生管理系统IO版:
A:在学生管理系统案例的基础上,添加新需求<br />B:查看所有的学生的数据需要从students.txt(提供好的)中读取出来 <br />C:增删改都需要先从students.txt中读出学生的数据然后再把改后的<br /><br />**注意:**<br />****1.创建集合对象要写在封装的各个方法中****<br />****2.每个封装的方法中首先要创建缓存输入流,用来读取文件****<br />****3.在添加、删除、修改的封装方法中还要创建输出流,将修改后的数据保存到文件中****<br />1.查看学生信息<br />①创建缓存输入流(BufferedReader)--读取文件<br />②创建集合对象
```java
//1封装一个方法用于查询学生的所有信息
public static void findAllAtudent() throws IOException {
BufferedReader br=new BufferedReader(new FileReader("student.txt"));
String line;
while ((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
}
2.添加学生信息
①创建缓存输入流(BufferedReader)—读取文件
②创建集合对象
③添加学生信息
④创建缓存输出流(BufferedWriter)—添加学生后将集合写入文件中
//2封装一个方法用于添加学生信息
public static void addStudent() throws IOException {
//创建集合
ArrayList<Student> array = new ArrayList<Student>();
BufferedReader br=new BufferedReader(new FileReader("student.txt"));
String line;
while ((line=br.readLine()) != null){
String[] strArr=line.split(",");
Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
array.add(s);
}
//键盘录入对象
Scanner sc = new Scanner(System.in);
//所有的对学生的操作都是基于id,所以我们把id属性放到循环的外面
String id;
//能够实现重复添加学生的信息,所以使用循环
while (true) {
//判断一下这个学号是不是已经存在
System.out.println("请输入学号:");
id = sc.nextLine();
//定义一个标记--假设不存在
boolean flag = false;
//遍历学号--就是遍历数组
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
//获取学号
if (s.getId().equals(id)) {
flag = true;//学号存在
break;
}
}
//这个时候flag就是true
if (flag) {
System.out.println("你的学号已经被占用,请重新输入!");
} else {
break;
}
}
//通过验证可以添加学生
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
System.out.println("请输入学生年龄:");
String age = sc.nextLine();
System.out.println("请输入学生住址:");
String address = sc.nextLine();
//创建学生对象
Student s = new Student();
//赋值
s.setId(id);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//把学生保存到集合中
array.add(s);
//把集合中的数据写入文件
BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt",true));
String line1=s.getId()+","+s.getName()+","+s.getAge()+","+s.getAddress();
bw.write(line1);
bw.newLine();
bw.flush();
bw.close();
br.close();
//给出提示
System.out.println("添加学生成功!");
}
3.删除学生
①创建缓存输入流(BufferedReader)—读取文件
②创建集合对象
③删除学生
④创建缓存输出流(BufferedWriter)—添加学生后将集合写入文件中
//3封装一个方法用于删除学生信息
public static void deleteStudent() throws IOException {
BufferedReader br=new BufferedReader(new FileReader("student.txt"));
//创建集合
ArrayList<Student> array = new ArrayList<Student>();
String line;
while ((line=br.readLine()) != null){
String[] strArr=line.split(",");
Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
array.add(s);
}
//删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要删除的学生的学号:");
String id = sc.nextLine();
//遍历集合看看这个id所对应的学生是不是存在--设置一个索引
int index = -1;
for (int i = 0; i < array.size(); i++) {
//获取每一个学生
Student s = array.get(i);
//判断学生的学号和键盘录入的id进行比较
if (s.getId().equals(id)) {//要删除的对象存在
index = i;
break;
}
}
if (index == -1) {
System.out.println("抱歉!你要删除的学号对应的学生信息不存在,请回去重新你的选择");
} else {
array.remove(index);
System.out.println("删除成功!");
}
BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));
for (int i = 0; i <array.size(); i++) {
String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();
bw.write(s);
bw.newLine();
}
bw.close();
br.close();
}
4.修改学生
①创建缓存输入流(BufferedReader)—读取文件
②创建集合对象
③修改学生
④创建缓存输出流(BufferedWriter)—添加学生后将集合写入文件中
//4封装一个方法用于修改学生信息
public static void updateStudent() throws IOException {
BufferedReader br=new BufferedReader(new FileReader("student.txt"));
//创建集合
ArrayList<Student> array = new ArrayList<Student>();
String line;
while ((line=br.readLine()) != null){
String[] strArr=line.split(",");
Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
array.add(s);
}
//修改学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要修改的学生的学号:");
String id = sc.nextLine();
//遍历集合看看这个id所对应的学生是不是存在--设置一个索引
int index = -1;
for (int i = 0; i < array.size(); i++) {
//获取每一个学生
Student s = array.get(i);
//判断学生的学号和键盘录入的id进行比较
if (s.getId().equals(id)) {//要修改的对象存在
index = i;
break;
}
}
if (index == -1) {
System.out.println("抱歉!你要修改的学号对应的学生信息不存在,请回去重新你的选择");
} else {
//开始进行修改
System.out.println("请输入新的学生姓名:");
String name = sc.nextLine();
System.out.println("请输入新的学生年龄:");
String age = sc.nextLine();
System.out.println("请输入新的学生住址:");
String address = sc.nextLine();
//创建一个新的对象
Student s = new Student();
s.setId(id);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//修改集合中的学生对象--实际上就是把原来的信息替换
array.set(index, s);
System.out.println("修改成功!");
}
BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));
for (int i = 0; i <array.size(); i++) {
String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();
bw.write(s);
bw.newLine();
}
bw.close();
br.close();
}
完整代码
package StudentManagement;
/**
* @author Lynn
* @create 2020-11-27-15:12
*/
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.TreeMap;
/**
*这是一个学生管理系统
* 步骤:
* 1.定义一个学生类
* 2.学生管理系统主界面的编写
* 3.学生管理系统的查看所有学生的信息
* 4.添加学生信息
* 5.删除学生信息
* 6.修改学生信息
*/
public class StudentManagerTest {
public static void main(String[] args) throws IOException {
//设计界面,利用循环
while (true) {
System.out.println("---------------------欢迎来到学生管理系统------------------------");
System.out.print("1 查看所有学生" + "\t");
System.out.print("2 添加学生" + "\t");
System.out.print("3 删除学生" + "\t");
System.out.print("4 修改学生" + "\t");
System.out.print("5 退出系统" + "\t");
System.out.println();
//键盘录入获取
Scanner sc = new Scanner(System.in);
String choiceString = sc.nextLine();
//用开关键--switch···case
switch (choiceString) {
case "1":
//查看所有学生
findAllAtudent();
break;
case "2":
//添加学生
addStudent();
break;
case "3":
//删除学生
deleteStudent();
break;
case "4":
//修改学生
updateStudent();
break;
case "5":
//退出系统
System.out.println("谢谢使用,欢迎下次再来!");
System.exit(0);//Java中提供的
break;
default:
System.out.println("输入格式错误");
break;
}
}
}
//1封装一个方法用于查询学生的所有信息
public static void findAllAtudent() throws IOException {
BufferedReader br=new BufferedReader(new FileReader("student.txt"));
String line;
while ((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
}
//2封装一个方法用于添加学生信息
public static void addStudent() throws IOException {
//创建集合
ArrayList<Student> array = new ArrayList<Student>();
BufferedReader br=new BufferedReader(new FileReader("student.txt"));
String line;
while ((line=br.readLine()) != null){
String[] strArr=line.split(",");
Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
array.add(s);
}
//键盘录入对象
Scanner sc = new Scanner(System.in);
//所有的对学生的操作都是基于id,所以我们把id属性放到循环的外面
String id;
//能够实现重复添加学生的信息,所以使用循环
while (true) {
//判断一下这个学号是不是已经存在
System.out.println("请输入学号:");
id = sc.nextLine();
//定义一个标记--假设不存在
boolean flag = false;
//遍历学号--就是遍历数组
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
//获取学号
if (s.getId().equals(id)) {
flag = true;//学号存在
break;
}
}
//这个时候flag就是true
if (flag) {
System.out.println("你的学号已经被占用,请重新输入!");
} else {
break;
}
}
//通过验证可以添加学生
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
System.out.println("请输入学生年龄:");
String age = sc.nextLine();
System.out.println("请输入学生住址:");
String address = sc.nextLine();
//创建学生对象
Student s = new Student();
//赋值
s.setId(id);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//把学生保存到集合中
array.add(s);
//把集合中的数据写入文件
BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt",true));
String line1=s.getId()+","+s.getName()+","+s.getAge()+","+s.getAddress();
bw.write(line1);
bw.newLine();
bw.flush();
bw.close();
br.close();
//给出提示
System.out.println("添加学生成功!");
}
//3封装一个方法用于删除学生信息
public static void deleteStudent() throws IOException {
BufferedReader br=new BufferedReader(new FileReader("student.txt"));
//创建集合
ArrayList<Student> array = new ArrayList<Student>();
String line;
while ((line=br.readLine()) != null){
String[] strArr=line.split(",");
Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
array.add(s);
}
//删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要删除的学生的学号:");
String id = sc.nextLine();
//遍历集合看看这个id所对应的学生是不是存在--设置一个索引
int index = -1;
for (int i = 0; i < array.size(); i++) {
//获取每一个学生
Student s = array.get(i);
//判断学生的学号和键盘录入的id进行比较
if (s.getId().equals(id)) {//要删除的对象存在
index = i;
break;
}
}
if (index == -1) {
System.out.println("抱歉!你要删除的学号对应的学生信息不存在,请回去重新你的选择");
} else {
array.remove(index);
System.out.println("删除成功!");
}
BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));
for (int i = 0; i <array.size(); i++) {
String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();
bw.write(s);
bw.newLine();
}
bw.close();
br.close();
}
//4封装一个方法用于修改学生信息
public static void updateStudent() throws IOException {
BufferedReader br=new BufferedReader(new FileReader("student.txt"));
//创建集合
ArrayList<Student> array = new ArrayList<Student>();
String line;
while ((line=br.readLine()) != null){
String[] strArr=line.split(",");
Student s=new Student(strArr[0], strArr[1],strArr[2],strArr[3]);
array.add(s);
}
//修改学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要修改的学生的学号:");
String id = sc.nextLine();
//遍历集合看看这个id所对应的学生是不是存在--设置一个索引
int index = -1;
for (int i = 0; i < array.size(); i++) {
//获取每一个学生
Student s = array.get(i);
//判断学生的学号和键盘录入的id进行比较
if (s.getId().equals(id)) {//要修改的对象存在
index = i;
break;
}
}
if (index == -1) {
System.out.println("抱歉!你要修改的学号对应的学生信息不存在,请回去重新你的选择");
} else {
//开始进行修改
System.out.println("请输入新的学生姓名:");
String name = sc.nextLine();
System.out.println("请输入新的学生年龄:");
String age = sc.nextLine();
System.out.println("请输入新的学生住址:");
String address = sc.nextLine();
//创建一个新的对象
Student s = new Student();
s.setId(id);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//修改集合中的学生对象--实际上就是把原来的信息替换
array.set(index, s);
System.out.println("修改成功!");
}
BufferedWriter bw = new BufferedWriter(new FileWriter("student.txt"));
for (int i = 0; i <array.size(); i++) {
String s=array.get(i).getId()+","+array.get(i).getName()+","+array.get(i).getAge()+","+array.get(i).getAddress();
bw.write(s);
bw.newLine();
}
bw.close();
br.close();
}
}