111 - Lecture 10

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进行数据读取和写入。     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477007.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一下arr的意义(c基础)(必看)(牢记)

arr 即数组名 一般指数组首元素地址 在两种情况下不是 1:sizeof(arr) arr指整个数组简单讲解一下strlen与sizeof(c基础)_strzeof在c语言中什么意思-CSDN博客 2:printf("%p",&…

大数据基于Spring Boot的化妆品推荐系统的设计与实现

摘 要 随着大数据时代的到来,人们对于个性化服务的需求越来越高。化妆品推荐系统作为一个认知智能模型段,在为消费者提供更好的购物体验方面发挥了重要作用。本研究基于大数据技术设计了一个高效准确的化妆品推荐系统。通过对海量数据的分析和处理&…

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中,中间件(Middleware)是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑,像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用,也可以只在特定页…

在Unity环境中读取Excel配置文件(入门)

使用Excel作为配置的优势 使用Excel作为配置文件有相对普通的文本文档/json等类型的配置文件有一个更好的优点,更易于编辑,更易读.譬如上面的例子,我可以制作一个人员名单,可以记录它们的姓名,年龄等信息,每一行就是一个对象,该表就是一个List. 环境准备 GitHub - ExcelDataR…

Maven maven项目构建的生命周期 Maven安装配置 IDEA 配置 Maven

一,Maven的概述 Maven的作用:专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程(编译,测试,打包,发布……)提…

VM虚拟机装MAC后无法联网,如何解决?

✨在vm虚拟机上,给虚拟机MacOS设置网络适配器。选择NAT模式用于共享主机的IP地址 ✨在MacOS设置中设置网络 以太网 使用DHCP ✨回到本地电脑上,打开 服务,找到VMware DHCP和VMware NAT,把这两个服务打开,专一般问题就…

day06(单片机高级)PCB设计

目录 PCB设计 PCB设计流程 元器件符号设计 原理图设计 元器件封装设计 元器件库使用 PCB设计 目的:学习从画原理图到PCB设计的整个流程 PCB设计流程 元器件符号设计 元器件符号:这是电子元器件的图形表示,用于在原理图中表示特定的元器件。例…

向量数据库FAISS之一:官方简单教程

1.安装 1.conda安装 # CPU-only version --> Linux (x86_64 and arm64), OSX (arm64 only), and Windows (x86_64) $ conda install -c pytorch faiss-cpu1.8.0# GPU(CPU) version --> Linux (x86_64 only) for CUDA 11.4 and 12.1 $ conda install -c pytorch -c nvid…

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1: 本月11号官宣:针对所有人免费提供,包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后,双击默认安装即可: 一路单击下一步按钮: 等待…

java实现小程序接口返回Base64图片

文章目录 引言I java 接口返回Base64图片接口设计获取验证码图片-base64字符串获取验证码图片-二进制流arraybufferII 小程序端代码过期代码: 显示文件流图片(arraybuffer)知识扩展:微信小程序下载后端返回的文件流引言 场景: 图形验证码 背景: 接口返回arraybuffer的格式…

transformer.js(一):这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景

随着大模型的广泛应用,越来越多的开发者希望在前端直接运行机器学习模型,从而减少对后端的依赖,并提升用户体验。Transformer.js 是一个专为前端环境设计的框架,它支持运行基于 Transformer 架构的深度学习模型,尤其是…

xiaolin coding 图解网络笔记——HTTP篇

1. HTTP 是什么? HTTP 是超文本传输协议(HyperText Transfer Protocol),一个用在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的【约定和规范】。 2. HTTP 常见的状态码有哪些? …

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式?二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图: 模板方法设计模式类图 一.什么是模板方法模…

力扣 LeetCode 235. 二叉搜索树的最近公共祖先(Day10:二叉树)

解题思路: 方法一:递归 递归法没有中的逻辑 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {return recur(root, p, q);}public TreeNode recur(TreeNode root, TreeNode p, TreeNode q) {if (root…

Python数据结构day2

一、链表 1.1目的 解决顺序表存储数据有上限,并且插入和删除操作效率低的问题 1.2概念 链表:链式存储的线性表,使用随机物理内存存储逻辑上连续的数据 链表的组成:由一个个结点组成 结点:由数据域和链接域组成&a…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

Flink Lookup Join(维表 Join)

Lookup Join 定义(支持 Batch\Streaming) Lookup Join 其实就是维表 Join,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的 Join 就叫做维…

LeetCode 101题集(随时更新)

题集来源:GitHub - changgyhub/leetcode_101: LeetCode 101:力扣刷题指南 使用C完成相关题目,以训练笔试 贪心 采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。 分配问题 455. 分发饼…

百度主动推送可以提升抓取,它能提升索引量吗?

站长在建站SEO的时候,需要用到百度站长平台(资源平台)的工具,在站长工具中【普通收录】-【资源提交】-【API提交】这个功能,对网站的抓取进行一个提交。 这里估计很多站长就有疑问,如果我主动推送&#xf…

DevOps-Jenkins-新手入门级

1. Jenkins概述 1. Jenkins是一个开源持续集成的工具,是由JAVA开发而成 2. Jenkins是一个调度平台,本身不处理任何事情,调用插件来完成所有的工作 1.1 什么是代码部署 代码发布/部署>开发书写的程序代码---->部署测试/生产环境 web服务…