坚持学习(4)JAVA Gui

使用数组、文件和图表
我们将学习如何在数组和文件中存储数据。数组允许我们在一种类型中存储多个数据。这当然与只能存储一个数据的普通变量大不相同。在文件中存储数据是理解在数据库中存储数据的概念的第一步,通过在文件中存储数据,我们不必害怕丢失数据。
一、数组

一维数组
数组:
数组是具有相同数据类型的一组数据的集合。数组中的每个元素具有相同的数据类型。在JAVA中同样将数组看做一个对象,虽然基本数据类型不是对象,但由基本数据类型组成的数组确实对象,在程序设计中引入数组可以更有效地管理和处理数据。
如何声明数组的格式

在datatype[] ArrayName; 
//或者 
datatype ArrayName[];

数组的引用

数组变量的声明格式与普通变量的声明格式几乎相同,数据引用只要在数据
类型之后或数组名称之后使用方括号“[ ]”。

int Data[]; //名称为 Data 的 int 类型数组 
String Name[]; //名称为 Name 的 String 类型数组 

在数组中存储数据可以通过直接初始化数据或将值赋给每个数组索引来完
成。

//声明并初始化数组 
int data[] = {1,2,3,4,5,6,10};   
//使用数组的索引为其赋值 
int Score[] = new int[6]; 
Score[0] = 3; 
Score[1] = 2; 
Score[2] = 9; 
Score[3] = 8; 
Score[4] = 7; 
Score[5] = 10; 

数组的索引从 0 开始到 n-1,其中 n 是存储的数据量。因此,如果存储的数
据量是 6,那么数组索引从 0 开始到 5。

数组的内存分析
在这里插入图片描述
数组的应用

  1. 获取数组中的元素 — 数组名[下标]
  2. 获取数组的长度 — 数组名.length
  3. 遍历数组
// 方式一:普通for循环 --- 先获取下标,然后利用下标获取元素
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
// 方式二:增强for循环 --- 定义变量来依次表示每一个元素
// 只能遍历数组而不能改变数组中的元素
for(int i : arr){
System.out.println(i);
}

  1. 获取数组中最值(最大值/最小值)
// 方式一:直接记录最大值
int max = arr[0];
for(int i = 1; i < arr.length; i++){
	if(max < arr[i])
	max = arr[i];
}
System.out.println(max);
// 方式二:记录最大值的下标
int max = 0;
for(int i = 1; i < arr.length; i++){
	if(arr[max] < arr[i])
		max = i;
}
System.out.println(arr[max]);

5.数组的排序
冒泡排序、选择排序 — 时间复杂度O(n2),空间复杂度o(1); Arrays.sort — 只能进行升序排序 — 时间复杂度O(nlogn)
6. 反转数组 — 首尾互换
7. 数组元素的查找 — 如果数组无序,逐个遍历来比较;如果元素有序使用二分查找 — 时间复杂度O(logn) 空间复杂度o(1)

数组的复制
System.arraycopy(要复制的数组, 要复制的起始下标, 要存放的数组, 要存放的起始下标, 要复制的元素个数);
Arrays.copyOf(原数组, 改变之后的长度); —对数组进行扩容—本质上是在做数组的复制的过程,复制完成之后一定是产生了一个新的数组。

二维数组
二维数组是由行和列组成的数组。二维数组可以比作是由行和列组成的表。当然与前面讨论的一维数组非常不同,在一维数组中它只包含一行。换句话说,二维数组是由行和列组成的矩阵,而一维数组是行向量。可以使用以下格式声明二维数组。

datatype [][] arrayname=new datatype[row][column]; //或者下面的 
datatype arrayname[][]=new datatype[row][column]; 

二维数组:实质就是存储是一维数组。

定义一个二维数组

public class ArrayDemo {
	public static void main(String args[]) {
		//此时的数组并不是一个等列数组
		int data[][] = new int[][] {
			{1, 2, 3}, {4, 5}, {6, 7, 8, 9}};
		//如果在进行输出的时候一定要使用双重循环,
		//外部的循环控制输出的行数,而内部的循环控制输出列数
		for(int i = 0; i < data.length; i++) {
			for(int j = 0; j < data[i].length; j++) {
				System.out.print("data[" + i + "][" + j + "]=" + data[i][j] + "、");
			}
			System.out.println();
		}
	}
}

二、文件操作
当程序处理重要数据时,数据必须存储在文件中。这当然与将数据存储在只是临时的普通变量上有很大的不同。一旦程序关闭或计算机重新启动,存储在变量中的数据将丢失。文件中的数据存储是永久性的。这意味着即使程序关闭或计算机重新启动,存储在文件中的数据也不会丢失。
读取文本文件
读取文件通常是在程序执行相当大的处理时完成的。由于数据量大,不可能存储在数组或普通变量中。针对从文件中读取输入,Java 提供了 IO 库中的几个类:File、OutputStream、InputStream、Writer、Reader

IO流
在这里插入图片描述

是Java中一套用于数据传输的API。IO - Input Output - 输入输出流。输入流指数据从外部流向程序;输出流指数据从程序流向外部。读取文件 - 数据从文件流向程序 - 输入流 向TXT文件中追加数据 - 数据从程序流向文件 - 输出流
根据数据的传输方向:输入流、输出流
根据数据的传输形式:字符流、字节流

字节流字符流
InputStreamReader
OutputStreamWriter

四个基本流都是抽象类,不能直接创建对象
数据的来源/目的地:硬盘、内存、网络、输入设备
向TXT文件中写入一个字符串 — 字符流、输出流、和文件相关的流 — FileWriter

流中的异常处理

  1. 将流对象放到try之外声明并且赋值为null,放到try之内创建
  2. 关流之前需要判断流对象是否初始化成功 — 判断流对象是否为null
  3. 关流之后需要将流对象设置为null
  4. 为了防止关流失败导致数据丢失,需要在写外之后手动冲刷一次缓冲区
    读取TXT文件 — 输入流 字符流 和文件相关 FileReader

输入字节流InputStream
在这里插入图片描述

ByteArrayInputStream:字节数组输入流,该类的功能就是从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去,我们拿也是从这个字节数组中拿
PipedInputStream:管道字节输入流,它和PipedOutputStream一起使用,能实现多线程间的管道通信
FilterInputStream :装饰者模式中处于装饰者,具体的装饰者都要继承它,所以在该类的子类下都是用来装饰别的流的,也就是处理类。具体装饰者模式在下面会讲解到,到时就明白了
BufferedInputStream:缓冲流,对处理流进行装饰,增强,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送。效率更高
DataInputStream:数据输入流,它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”
FileInputSream:文件输入流。它通常用于对文件进行读取操作
File:对指定目录的文件进行操作,具体可以查看讲解File的博文。注意,该类虽然是在IO包下,但是并不继承自四大基础类。
ObjectInputStream:对象输入流,用来提供对“基本数据或对象”的持久存储。通俗点讲,也就是能直接传输对象(反序列化中使用)
输出字节流OutputStream
在这里插入图片描述
IO 中输出字节流的继承图可见上图,可以看出:

1.OutputStream 是所有的输出字节流的父类,它是一个抽象类。
2.ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,
3.ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流(序列化中使用)。
字符输入流Reader
在这里插入图片描述
从图上看出来
1.Reader 是所有的输入字符流的父类,它是一个抽象类。
2.CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。
3.BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。
4.FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。
5.InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。

字符输出流Writer
在这里插入图片描述
在上面的关系图中可以看出:

1.Writer 是所有的输出字符流的父类,它是一个抽象类。
2.CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据,
3.BufferedWriter 是一个装饰器为Writer 提供缓冲功能。
4.PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。
5.OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream 极其类似,后面会有它们的对应图。

使用范围
字符流和字节流的使用范围:字节流一般用来处理图像,视频,以及PPT,Word类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,字节流可以用来处理纯文本文件,但是字符流不能用于处理图像视频等非文本类型的文件。

读取excel文件:
读取、创建和写入excel文件将使用一个外部库,即Aphace POI。Apache POI是一个Java API,用于基于 Office Open XML 操作各种文件格式。有了Aphace POI,我们可以在java中读写excel文件,还可以使用 Java 读写 MS Word 和 MS PowerPoint。

这是Aphace POI官网下载链接:
https://poi.apache.org/download.html
在这里插入图片描述
Group ID:org.apche.poi
Artifact ID:poi
Version:4.1.2

Group ID
org.apche.poi
Artifact ID:poi-ooxml
Version:4.1.2
手动导入这两个即可

是需要导入一个外部库 这里是poi 4.1.2
我在这里录了个导入外部库的操作视频 下面是 链接和提取码
链接:https://pan.baidu.com/s/1yXQ4y39VE5xpmF2sBkWv0Q
提取码:mjtf

图表

信息或数据通常以图形形式表示,以便于阅读。作为一种非常流行的编程语言,Java 提供了许多可用于创建图形的库。这些库有些来自内部库,有些是由称为外部库的第三方开发的。本章节我们将讨论如何使用 JFreeChart 创建图形。JFreeChart 是一个外部库,它是使用 Java 编程语言开发的,并且是开源的。此库可用于在所有基于 Java 的应用程序上创建 2D 或 3D 图形。

JFreeChart 是一个外部库,它是使用 Java 编程语言开发的,并且是开源的。此库可用于在所有基于 Java 的应用程序上创建 2D 或 3D 图形。
要使用 JFreeChart 库,首先要从以下站点链接下载该库:
http://www.jfree.org/jfreechart/download
在这里我们也需要导入外部库用来创建图表

方法和上面的一样 只是需要包不一样 具体操作我就不在这里详细说了

手动导入以下的
Group ID:jfree
Artifact ID:jfreechart:
Version:1.0.1

Group ID:jfree
Artifact ID:jcommon
Version:1.0.0

学习到此处完毕! 加油
——————————————————————————————————————————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值