Java IO流实战:用户信息录入与文件保存全解析
一、原题完整代码呈现
以下是计算机二级Java考试中关于IO流操作、输入验证及异常处理的典型题型,主要考察缓冲流创建、方法参数传递、文件写入及异常捕获,包含6处需要填写的空白(标记为//*********Found**********
):
import java.io.*;
import java.util.Vector;
public class Java_2{
public static void main(String s[]){
Vector v=new Vector();
try{
//*********Found**********
BufferedReader in = new ____________________(new InputStreamReader(System.in)); //键盘输入
String str = "";
System.out.println("请输入用户和密码信息,中间用空格隔开,输入quit退出:");
while (!(str.equals("quit")||str.equals("QUIT"))){
str = in.readLine();
//*********Found**********
if(isValid(______________________)) //验证输入是否有空格
v.add(str);
else{
if(!(str.equals("quit")||str.equals("QUIT")))
System.out.println("The string is NOT valid!");
}
}
System.out.println("请输入保存到的文件名:");
//*********Found**********
str=_______________.readLine();
String curDir = System.getProperty("user.dir");
File savedfile=new File(curDir+"\\"+str);
//*********Found**********
BufferedWriter out = new BufferedWriter(new FileWriter(___________________));
for(int i=0; i<v.size(); i++){
String tmp=(String)v.elementAt(i);
out.write(tmp);
//*********Found**********
out.write(____________________); //换行
}
out.close();
}
//*********Found**********
________________(Exception e){
System.out.print("ERROR:"+e.getMessage());
}
}
/**
* 判定输入的字符串是否符合规范
* @param s 输入的待校验的字符串
* @return 校验的结果,正确则返回为真
*/
public static boolean isValid(String s){
if(s.indexOf(" ")>0) return true;
else return false;
}
}
二、空白处逐一解析与解答
1. 第一处空白:创建BufferedReader对象
答案:BufferedReader
//*********Found**********
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
解析: BufferedReader
是带缓冲区的字符输入流,需通过构造方法传入Reader
类型的对象(此处为InputStreamReader
,用于将字节流转换为字符流)。创建BufferedReader
实例需显式指定类名,因此填写BufferedReader
。
2. 第二处空白:isValid方法的参数
答案:str
//*********Found**********
if(isValid(str)) //验证输入是否有空格
解析: isValid
方法的定义为public static boolean isValid(String s)
,需传入字符串参数。程序中str
存储了用户输入的内容(待验证的“用户和密码信息”),因此需将str
作为参数传入,填写str
。
3. 第三处空白:读取文件名的输入流对象
答案:in
//*********Found**********
str=in.readLine();
解析: in
是前面创建的BufferedReader
对象,用于从键盘读取输入。此处需要读取用户输入的文件名,仍使用同一个输入流对象in
的readLine()
方法,因此填写in
。
4. 第四处空白:FileWriter的构造参数
答案:savedfile
//*********Found**********
BufferedWriter out = new BufferedWriter(new FileWriter(savedfile));
解析: FileWriter
用于写入字符文件,其构造方法可接收File
对象作为参数。前面已通过new File(curDir+"\\"+str)
创建了savedfile
(目标文件对象),因此此处需传入savedfile
,填写该变量名。
5. 第五处空白:写入换行符
答案:"\n"
//*********Found**********
out.write("\n"); //换行
解析: BufferedWriter
的write(String s)
方法可写入字符串,此处需要在每个用户信息后换行,"\n"
是换行符的转义字符串,因此填写"\n"
。
6. 第六处空白:异常捕获关键字
答案:catch
//*********Found**********
catch(Exception e){
解析: try
块后的代码用于捕获异常,Java中异常捕获需使用catch
关键字,后跟异常类型和参数。此处需捕获Exception
类型的异常,因此填写catch
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序实现从键盘录入用户信息(要求包含空格分隔的“用户和密码”),验证输入格式后保存到指定文件,核心功能包括:
- 键盘输入:通过
BufferedReader
接收用户输入的信息和文件名 - 输入验证:通过
isValid
方法检查输入是否包含空格(确保格式为“用户 密码”) - 循环控制:输入“quit”或“QUIT”时终止录入
- 文件保存:将所有有效信息写入用户指定的文件(存储在当前工作目录)
- 异常处理:捕获并提示可能的IO异常(如文件无法写入)
运行说明
录入流程:
- 程序启动后提示:
请输入用户和密码信息,中间用空格隔开,输入quit退出:
- 输入包含空格的字符串(如
alice 123456
):验证通过,存入Vector
- 输入不包含空格的字符串(如
bob
):提示The string is NOT valid!
,不存入 - 输入
quit
或QUIT
:退出录入循环
- 程序启动后提示:
保存流程:
- 提示
请输入保存到的文件名:
,输入文件名(如userdata.txt
) - 程序在当前工作目录创建该文件,将
Vector
中存储的有效信息逐行写入
- 提示
示例输出:
请输入用户和密码信息,中间用空格隔开,输入quit退出: tom abc123 jerry 456def mike The string is NOT valid! quit 请输入保存到的文件名: accounts.txt
最终
accounts.txt
内容为:tom abc123 jerry 456def
五、核心知识点总结
缓冲流的创建与使用
BufferedReader
:用于高效读取文本,通过new BufferedReader(Reader in)
创建,此处传入InputStreamReader(System.in)
(将标准输入流转换为字符流)BufferedWriter
:用于高效写入文本,通过new BufferedWriter(Writer out)
创建,此处传入FileWriter(savedfile)
(关联目标文件)- 优势:带缓冲区的流减少IO操作次数,提升读写效率
输入验证逻辑
isValid
方法:通过String.indexOf(" ") > 0
判断字符串是否包含空格(包含则返回true
)- 过滤规则:仅保留符合“用户 密码”格式的输入,排除无效输入(除退出命令外)
文件路径与File对象
- 当前工作目录:
System.getProperty("user.dir")
获取程序运行的目录(如D:\project
) - 文件路径拼接:
curDir + "\\" + str
构建完整路径(如D:\project\accounts.txt
) File
对象:封装文件路径信息,作为FileWriter
的参数指定写入目标
- 当前工作目录:
异常处理机制
try-catch
块:try
中包含可能抛出异常的IO操作(如readLine()
、write()
),catch
捕获Exception
类型异常并输出错误信息- 必要性:IO操作可能因文件权限、路径不存在等原因失败,异常处理确保程序不崩溃并提示错误
Vector的应用
- 作用:动态存储有效输入的信息(长度可变,适合不确定录入数量的场景)
- 操作:
v.add(str)
添加元素,v.elementAt(i)
获取指定索引元素,v.size()
获取元素数量
六、常见错误与应试技巧
常见错误分析
- 第一处空白流创建错误:写成
BufferReader
(拼写错误)或FileReader
(无法关联标准输入流) - 第二处空白方法参数错误:写成
"str"
(传入字符串字面量,非变量)或x
(未定义的变量) - 第三处空白读取对象错误:写成
out
(输出流无法读取输入)或new BufferedReader(...)
(重复创建流,浪费资源) - 第四处空白文件参数错误:写成
str
(仅文件名,未拼接路径)或curDir
(目录而非文件) - 第五处空白换行符错误:写成
\n
(缺少引号,语法错误)或"\t"
(制表符而非换行) - 第六处空白异常关键字错误:写成
catche
(拼写错误)或throw
(抛出异常而非捕获)
- 第一处空白流创建错误:写成
应试技巧
- 缓冲流创建:“缓冲流要包装,Reader/Writer做参数,BufferedReader读输入,BufferedWriter写输出”
- 输入验证:“方法参数看定义,isValid要String,用户输入存str,直接传参准没错”
- 文件操作:“File对象封装路,FileWriter关联它,读写要用同一流,资源不浪费”
- 异常处理:“IO操作有风险,try-catch来护航,catch关键字别写错,异常信息要输出”
通过本题,我们掌握了Java IO流(缓冲流)的创建与使用、输入验证逻辑、文件路径处理、动态数组(Vector)应用及异常处理的综合技能。这类题型是“数据录入→验证→持久化”经典流程的体现,对理解实际应用中数据处理的完整链路具有重要意义。