第1关:文件读取 - 打印时刻表
任务描述
小明从网上下载了一份火车时刻表的文本文件,但是性格怪异的小明偏偏不想用记事本打开这个文档,而是想通过Java读取这个文件,再输出在显示器上,下面请你来帮他完成这项工作。
相关知识
FileReader类
该类用于从文件中读取数据,它的对象用关键字new
来创建。在创建该对象之前,我们还需先使用File()
方法来创建一个文件对象。
下面是创建这两个对象的示例,注意创建对象前要导入包:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
File file = new File("src/Hello World.txt");
FileReader fileReader = new FileReader(file);
对象创建好之后,我们用read()
方法读取文件中的数据。该方法会返回一个整数值,为所读取的字符在Unicode中的值,例如如果读到的字符是A
,则返回值是65
;当读取到文件末尾时,返回-1
。因此我们需要使用(char)
方法对返回值进行类型转换(除返回值为-1
之外),还原原本的字符A
。
下面是一个读取文件内容并输出在显示器上的示例(假设所需对象已经创建好):
int read = fileReader.read();
while (read != -1) { //循环读取,直到read的值为-1,表示文件读到末尾
System.out.print((char)read); //输出读取的数据,使用(char)方法对read的值进行类型转换
read = fileReader.read(); //读取下一个字符
}
当读取文件完毕后,记得要关闭文件流:
fileReader.close();
除了FileReader
类之外,还有很多类也可以实现从文件中读取数据,例如FileInputStream
类 。该类的对象创建和使用的语法与FileReader
类基本一致,但是该类的对象在读取中文字符时会出现乱码。
在此,我们只要求同学们掌握FileReader
类的使用。
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
- 读取火车时刻表,文件路径为"src/step1/Time_Table.txt";
- 将时刻表中的文件完整地打印出来。
评测说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
本题没有测试样例,平台将比对文件内容与同学们的程序输出的内容。
人生的坚持,学习的坚持,尽管遭遇困苦,但是我们却能在一次次的苦难中成长,重新爬起来。这就是奋斗的人生。就是挥洒自己青春,汗水的有意义,有价值的生活。而,我虽然在平凡的人群中不起眼,可是每个人却闪耀着自己独到的光辉灿烂,挥洒着自己的热血,散发着光芒的人生值得每个人去深思。
package step1;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class TimeTable {
public static void main(String[] args) throws IOException {
/********** Begin *********/
File file = new File("src/step1/Time_Table.txt");
FileReader fileReader = new FileReader(file);
int read = fileReader.read();
while(read!=-1){
System.out.print((char)read);
read = fileReader.read();
}
fileReader.close();
/********** End *********/
}
}
第2关:文件写入 - 添加时刻表
任务描述
小明成功的打开了上道题中的火车时刻表,但是小明发现这份时刻表是错误的,于是他从网上查询了相应资料,准备重写这份时刻表。那么,如何通过Java程序来向文本文档中写入数据呢?请你来帮他完成这项工作。
相关知识
FileWriter类
该类用于向文件中写入数据,它的对象用关键字new
来创建。在创建该对象之前,我们同样需先使用File()
方法来创建一个文件对象。
下面是创建这两个对象的示例,注意创建对象前要导入包:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
File file = new File("src/Hello World.txt");
FileWriter fileWriter = new FileWriter(file, true);
注意最后一条语句中调用构造方法FileWriter()
时的传递值true
,它表示当fileWriter
对象对文件再次写入时,会在文件的末尾追加数据,而不是将文件覆盖。如果想将原文件数据覆盖,传递false
。
对象创建好之后,我们用write()
方法向文件写入数据,write()
方法的小括号中直接添加需要写入文件的字符串类型数据。如果我们需要写入一个换行符,我们可以先定义一个LINE_SEPARATOR
常量,然后用write()
方法向文件写入该常量。
下面是一个向文件写入两行字符串数据的示例(假设所需对象已经创建好):
private static final String LINE_SEPARATOR = System.getProperty("line.separator"); //定义LINE_SEPARATOR常量,表示换行符
String string1 = "Hello";
String string2 = "World";
fileWriter.write(string1 + LINE_SEPARATOR + string2 + LINE_SEPARATOR);
fileWriter.close();
写入文件完毕后,同样要记得关闭文件流:
fileWriter.close();
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
time1
和time2
变量为需要向文件src/step2/Time_Table.txt
写入的两行时刻表数据。- 在恰当的位置添加换行符(养成在文件末尾添加一个换行符的习惯)。
- 文件写入类型为覆盖原文件数据后写入新的数据。
评测说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
本题没有测试样例,平台将比对添加数据之后的文件内容与标准答案。
人生,对于我们谁都有许多想法,但由于迟迟没有付诸行动,结果多少光阴过去,却只能停留在计划中,要想拥有成功,就需要赋予人生足够的速度,这是成功者的姿态,也是胜利者的姿态。
package step2;
import java.io.File;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;
public class AddTimeTable {
private static final String LINE_SEPARATOR = System.getProperty("line.separator"); //定义LINE_SEPARATOR常量,表示换行符
public static void start(String time1, String time2) throws IOException {
/********** Begin *********/
File file = new File("src/step2/Time_Table.txt");
FileWriter fileWriter = new FileWriter(file,false);
fileWriter.write(time1+LINE_SEPARATOR+time2+LINE_SEPARATOR);
fileWriter.close();
/********** End *********/
}
}
第3关:Java文件操作综合运用
任务描述
本关的任务是综合运用所学知识,完成编程要求中提出的各项要求。
相关知识
文件创建
使用文件对象的createNewFile()
方法创建文件,该方法会返回一个布尔值,若成功创建文件,返回true
;否则返回false
:
File file = new File("src/step1/Hello World.txt"); file对象指向src文件夹下的step1文件夹下的Hello World.txt文件(此时此文件不存在)
if (!file.exists()) { //如果文件不存在
System.out.println(file.createNewFile()); //创建文件,并输出布尔值
}
文件或文件夹删除
删除文件或文件夹使用文件对象的delete()
方法,该方法会返回一个布尔值,若成功删除文件,返回true
;否则返回false
:
File file = new File("src/step1/Hello World.txt"); //file对象指向src文件夹下的step1文件夹下的Hello World.txt文件
if (file.exists()) { //如果文件存在
System.out.println(file.delete()); //删除该文件,并输出布尔值
}
File file = new File("src/step1"); //file对象指向src文件夹下的step1文件夹
if (file.exists()) { //如果文件夹存在
System.out.println(file.delete()); //删除该文件夹,并输出布尔值
}
操作完毕后同样要记得关闭文件流。
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
- 读取
readme.txt
文件中的内容,文件路径为:src/step3/readme.txt
。 - 在相同的文件路径下创建
readmeCopy.txt
文件,将readme.txt
文件中的内容写入readmeCopy.txt
。 - 删除
readme.txt
文件。
提示:
- 可以使用
StringBuilder
类的对象保存读取到的readme.txt
文件中的内容,该对象已为同学们创建好,使用append()
方法向对象添加数据。 - 向文件写入
StringBuilder
类的对象时,为了保持数据的一致性,需要先使用toString()
方法将数据对象转换为String类型后再写入。
评测说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
本题没有测试样例,平台将比对同学们的程序输出的内容与标准答案。
package step3;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class DeleteFiles {
public static void start() throws IOException {
StringBuilder data = new StringBuilder();
/********** Begin *********/
//读取readme.txt文件
FileReader fileReader = new FileReader("src/step3/readme.txt");
//写入readmeCopy.txt文件
File file = new File("src/step3/readmeCopy.txt");
if (!file.exists()) { //如果文件不存在
System.out.println(file.createNewFile()); //创建文件,并输出布尔值
}
FileWriter fileWriter = new FileWriter("src/step3/readmeCopy.txt");
int read = fileReader.read();
while(read!=-1){
System.out.print((char)read);
fileWriter.write((char)read);
read=fileReader.read();
}
fileReader.close();
//删除readme.txt文件
File file1 = new File("readme.txt");
if (file1.exists()) { //如果文件存在
System.out.println(file1.delete()); //删除该文件,并输出布尔值
}
/********** End *********/
}
}