File I/O and GUI with JavaFX
文件输入/输出与JavaFX图形用户界面
一、Overview
1. File I/O
(1) learning Java File I/O mechanism
(2) writing into and reading from a file 使用文件I/O进行数据读取和写入。
2. GUI with JavaFX
(1)drawing shapes and creating graphical user interface 使用JavaFX创建图形界面,绘制形状
(2) practicing OOP with JavaFX
Learning Outcomes
• 能够开发可以通过图形表示或文本菜单与用户交互的程序。
graphical representation, or text-based menus.
• 使用Java编程表示、显示和操作数据作为对象,同时注意相关的风险/安全,确保计算和信息系统的安全操作。
being cognizant of associated risk/safety for safe operation of computing and information systems.
二、 File I/O (文件输入/输出)
1. File and File Class (文件和文件类)
(1) 程序结束时(terminates),存储在变量中的数据将丢失,因此我们需要将数据保存在文件中,并将文件存储在存储设备上(storage device)。
(2) 绝对路径(Absolute file name):操作系统(OS)相关,例如在Windows中:
C:\Users\teng.ma\Documents\NetBeansProjects\Lecture10Demo\data\text1.txt
(3) 相对路径(Relative file name): relative to the current working directory,例如:data\text1.txt
(4) 使用Java中的File对象来表示文件。
File file =new File("C:\\Users\\teng.ma\\Documents\\NetBeansProjects\\Lecture10Demo\\data\\text1.txt");
2. File Object
(1)Since OS may vary, do not use absolute file name when creating File objects
(2) Use relative file name in Java (with forward slash) :
File file = new File("data/text1.txt");
(3) creating a File object does not actually create a file on the computer!
3. File Methods (文件方法)
File类包含用于获取(obtain)文件属性的方法,以及重命名和删除文件的方法。
(1) obtain the property of a file/directory
exists(), isFile(), length(), canRead(), canWrite()
File file = new File("data/text1.txt");
file.exists();
file.isFile();
file.isDirectory();
file.isHidden();
file.length(); //in bytes
file.canRead();
file.canWrite();
file.getAbsolutePath();
(2) rename and delete a file/directory
delete(), renameTo(File), mkdir()
• exists():检查文件或目录是否存在。
• isFile():检查是否为普通文件。(不是目录)
• isDirectory():检查是否为目录。
• isHidden():检查文件或目录是否为隐藏文件。(隐藏文件用于存储系统配置或操作系统的内部文件,这些文件不应该被普通用户直接访问或修改)
• length():获取文件大小,单位为字节,如果是目录,通常返回 0 或未定义
• canRead():检查文件是否可读。
• canWrite():检查文件是否可写。
• getAbsolutePath():获取文件的绝对路径。
File file = new File("example.txt");
System.out.println("文件的绝对路径:" + file.getAbsolutePath());
• delete():删除文件或目录。(如果是目录,目录必须为空才能删除)
//如果文件或目录成功删除,返回 true;否则返回 false
file.delete()
• renameTo(File):重命名文件或移动文件。
File oldFile = new File("oldName.txt");
File newFile = new File("newName.txt");
if (oldFile.renameTo(newFile)) {
System.out.println("文件重命名成功。");
} else {
System.out.println("文件重命名失败。");
}
• mkdir():创建新目录。
File directory = new File("newDirectory");
if (directory.mkdir()) {
System.out.println("目录创建成功。");
} else {
System.out.println("目录创建失败。");
}
(3) PrintWriter类用于创建文件并将数据写入文本文件(text file)
Key methods in PrintWriter
• flush() 方法的作用是强制将缓冲区中的内容立刻写入到文件。通常,PrintWriter 类会将写入的内容暂时存储在内存中的缓冲区,直到缓冲区满或者文件关闭时,才会将内容实际写入文件。
• print():写入文本,不自动换行;适用于在同一行写入多个文本内容。
• write():写入原始数据,不做格式处理;适合于写入字符、字节等低级数据。
• println(): Prints data followed by a new line.
• close(): Closes the writer and releases the associated resources.
printf(String format, Object... args):允许格式化输出。如:output.printf("Hello, %s!", "World");
PrintWriter writer = new PrintWriter("example.txt");
writer.print("Hello, ");
writer.print("world!"); //输出结果 Hello, world!
writer.flush(); // 强制将内容写入文件
writer.close(); // 关闭流
create a file
File newFile = new File("data/text2.txt");
if (newFile.exists()) {
System.out.println("File already exists!");
System.exit(0); //exit the program
}
try {
PrintWriter output = new PrintWriter(newFile);
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
write data into a text file
File file = new File("data/text1.txt");
try {
PrintWriter output = new PrintWriter(file);
output.println(“CPT111");
output.println(“is");
output.println(“so hard");
output.close();
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
when you’re trying to create a file (e.g., text1.txt) within a folder (e.g., data), you must ensure that the folder (data) already exists.(because Java doesn’t automatically create parent directories for a file unless explicitly told to do so File folder = new File("data");)
• 在创建文件前,检查文件是否已存在,避免覆盖。(overwriting)
默认情况下,PrintWriter 在每次创建时会 覆盖 文件,这意味着 不会添加更多行,而是 替换 文件中的内容。
(4)BufferedWriter to Improve Efficiency
• BufferedWriter将字符串先缓存到内存中,再写入文件,能提高效率。
• 使用flush()方法强制将缓冲区内容(buffered content)写入文件。
在 Windows 上,\n 代表换行,但标准换行符是 \r\n,而在 Linux/macOS 上,\n 就是标准的换行符。
• buffer.newLine() 方法是为了跨平台的兼容性,它会自动根据操作系统的要求插入正确的换行符。
try {
FileWriter file = new FileWriter("data/text1.txt");
BufferedWriter buffer = new BufferedWriter(file);
buffer.write(“CPT111");
buffer.newLine();
buffer.write(“is");
buffer.newLine();
buffer.flush(); //otherwise write until buffer is full or closed
buffer.write(“so hard");
buffer.newLine();
buffer.close();
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
• BufferedWriter 主要用于高效写入字符流,提供了一个缓冲机制,它不会自动添加换行符,除非显式调用 newLine() 方法。
• BufferedReader一次性(in one)将文件内容读取到内存中,之后可以高效地访问。
• PrintWriter 提供了更多便捷的写入方法,例如 println()、printf() 等。它不仅可以写入普通文本,还能格式化输出并自动添加换行符。
(5)Reading text Data Using Scanner
• 使用Scanner逐行(line by line)读取文本文件内容。
• nextLine():读取整行输入,包括空格,直到遇到换行符。
• next():读取下一个词,遇到空格或者换行符会停止。
• nextInt():读取一个整数,输入必须是合法的整数字符串。
• nextDouble():读取一个双精度浮点数。
• hasNext():检查是否有更多的输入数据(一个词)。
• hasNextInt():检查是否有下一个整数。
• hasNextDouble():检查是否有下一个双精度浮点数。
File file = new File("data/text1.txt");
try {
Scanner input = new Scanner(file);
while (input.hasNextLine()) {
String line = input.nextLine();
System.out.println(line);
}
input.close();
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
(6)Reading csv data using Scanner
• 从CSV(comma-separated values)文件中读取数据,使用split(",")来分割(extract)每行的内容。
create a Scanner for the file, extract the values by first splitting them
File file = new File("data/cpt111.csv");
try {
Scanner input = new Scanner(file);
while (input.hasNextLine()) {
String line = input.nextLine();
String[] values = line.split(",");
String module = values[0];
int grade = Integer.parseInt(values[1]);
System.out.println(“Component: " + module + " Grade: " +
grade);
}
input.close();
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
• split 方法: String 类中的 split 方法用于根据指定的分隔符(这里是 ",")将字符串拆分为子字符串,并返回一个字符串数组。
• 没有修饰符的情况:在方法内部定义的局部变量(local variables)不需要修饰符。它们的生命周期仅限于方法内部。
Part 2: GUI with JavaFX (图形用户界面与JavaFX)
JavaFX Basics (JavaFX基础)
• JavaFX是替代Swing和AWT的图形用户界面框架。
JavaFX is the new GUI framework that replaces Swing and AWT.
• JavaFX的优势:支持面向对象的编程,使用Stage、Scene和Node组织图形界面。
JavaFX offers advantages in OOP with different layers: Stage (top-level container), Scene (holds nodes), and Node (visual components).
JavaFX Program Example (JavaFX程序示例)
• JavaFX程序的基本结构:
The basic structure of a JavaFX program.
public class JavaFXTesting extends Application {
@Override
public void start(Stage primaryStage) {
Button helloButton = new Button("Hello World!");
Scene scene = new Scene(helloButton, 200, 250);
primaryStage.setTitle("My First JavaFX Program");
primaryStage.setScene(scene);
primaryStage.show();
}
}
Stage and Scene (Stage与Scene)
• Stage是窗口对象,Scene包含要显示的内容。
Stage is the window object, and Scene holds the content to be displayed.
• Scene通过构造函数创建,并设置宽高和节点。
The Scene is created with a constructor specifying width, height, and nodes.
Layouts and Nodes (布局和节点)
• 使用Pane来设置节点的位置和大小。
Use Pane to set the location and size of nodes.
• Group用于将多个节点组合成一个整体。
Group is used to group multiple nodes together.
Shapes and Text (形状与文本)
• JavaFX支持绘制各种形状:圆形、矩形、线条等。
JavaFX supports drawing various shapes: circles, rectangles, lines, etc.
• Text用于在特定位置显示字符串。
Text is used to display strings at a starting point (x, y).
Conclusion (总结)
• 本次讲座介绍了如何使用JavaFX创建图形界面,绘制形状,并使用文件I/O进行数据读取和写入。