一、数组
1.数组的概念
数组,顾名思义就是一组数据。数组对于每一门编程语言来说都是重要的数据结构之一,当然不同的语言对数组的实现以及处理也不尽相同。Java语言中提供的数组用来存储固定大小的同类型元素。
在Java中,数组也可以认为是一种数据类型,它本身是一种引用类型。Java的数组可以存储基本类型的数据,也可以存储引用类型的数据。比如存储int类型:

//首先声明一个int[]类型的变量x,然后创建一个长度为10的数组。
int[]  x;
x=new int[10];

1.1一维数组
一维数组就是一组具有相同类型的数据的集合,一维数组中的元素是按顺序存放的。
1.2 数组的声明
要使用Java中的数组,必须先声明数组,再为数组分配内存空间。一维数组的声明有两种方式,语法格式如下:

数据类型 数组名[];
数据类型[] 数组名;

数据类型:指明数组中元素的类型
数组名:一个合法的java标识符
中括号‘[]’:表示数组的维数,一对中括号表示一维数组。
java语言使用new操作符来创建数组,语法格式如下:

arrayRefvar = new dataType[arraySize];

声明数组变量和创建数组可以用一条语句来完成,语法格式如下

dataType[]  arrayRefvar = new dataType[arraySize];

另外,用户还可以使用以下的方式创建数组,语法格式如下

dataType[]  arrayRefvar = {value0,value1,value2,...,valuek};

数组的元素是通过索引访问的,数组索引从零开始,索引为0到arrayRefVar.length-1
例:声明数组应用实例

public class Test{
	public static void main(String[] args){
		int [] a1;          //声明数组变量
		a1 = new int [3]; //创建数组对象
		System.out.println("a1[0]="+a1[0]);   //访问数组中的第一个元素
		System.out.println("a1[1]="+a1[1]);   //访问数组中的第二个元素
		System.out.println("a1[2]="+a1[2]);   //访问数组中的第三个元素
		System.out.println("数组的长度是"+a1.length);  //数组的长度
	}
}

本例中,访问了数组的元素 但是没有给数组赋值,所有打印的是默认值0,数组对象有一个属性length,可以用来获取数组元素的个数,称为数组长度。
例:数组的声明,默认值和赋值应用实例

public class Test{
	public static void main(String[] args){
		int [] a1  = new int [3]; //创建数组对象
		a1[0]=1;       //为第一个元素赋值为1
		a1[2]=3;       //为第三个元素赋值为3
		System.out.println("a1[0]="+a1[0]);   //访问数组中的第一个元素
		System.out.println("a1[1]="+a1[1]);   //访问数组中的第二个元素
		System.out.println("a1[2]="+a1[2]);   //访问数组中的第三个元素
   }
}

1.3 初始化数组
在Java中,初始化数组有静态动态两种方式。
在定义数组时指定数组的长度,并由系统自动为元素赋初值,称为动态初始化。
例: 数组动态初始化应用实例

public class Test{
	public static void main(String[] args){
		int size = 10;
		int[] mylist = new int[size];
		mylist[0] = 5;
		mylist[1] = 4;
		mylist[2] = 3;
		mylist[3] = 2;
		mylist[4] = 18;
		mylist[5] = 25;
		mylist[6] = 34;
		mylist[7] = 68;
		mylist[8] = 102;
		mylist[9] = 1000;
		//计算所有元素的总和
		int result=0;
		for(int i=0;i<size;i++) {
			result+=mylist[i];
		}
		System.out.println("总和为:"+result);
	
   }
}

数组的初始化还有一种静态方式,就是在定义数组的同时,就为每个数组的元素赋值。数组的静态初始化有两种方法,格式如下:

1. 类型[]  数组名 = new 类型[] {元素,元素,...};
2. 类型[]  数组名 = {元素,元素,元素,...};

例:数组静态初始化应用实例

public class Test{
	public static void main(String[] args){
		int [] a1 = {1,2,3,4};
		String[] a2=new String[] {"java","PHP","Python"};
		//访问数组的元素
		System.out.println("a1[0]="+a1[0]);
		System.out.println("a1[1]="+a1[1]);
		System.out.println("a1[2]="+a1[2]);
		System.out.println("a1[3]="+a1[3]);
		System.out.println("a2[0]="+a2[0]);
		System.out.println("a2[1]="+a2[1]);
		System.out.println("a2[2]="+a2[2]);
	
   }
}

1.4多维数组
多维数组的声明与一维数组类似,一维数组要使用一个大括号,二维数组使用两个大括号,以此类推,常用的多维数组是二维数组
1.5 数组的声明
多维数组可以看出数组的数组。二维数组就是一个特殊的一维数组,其每个元素都是一个一维数组,如

String str[] [] =new String[3][4]

多维数组的初始化(以二维数组为例)有两种
(1)直接为每一维分配空间,格式如下:

type arrayName = new type[arraylength1] [arraylenght2];

type可以为基本数据类型和复合数据类型,arraylength1和arraylength2必须为正整数,arraylength1为行数,arraylength2为列数。例如

int a [] [] =new int[2][3];

二维数组a可以看成一个两行三列的数组。
(2)从最高维开始,分别为每一维分配空间。例如:

public class Test{
	public static void main(String[] args){
		String s[] [] =new String[2][3];
		s[0] = new String[2];
		s[1] =new String[3];
		s[0][0] =new String("Good");
		s[0][1] =new String("Luck");
		s[1][0] =new String("to");
		s[1][1] =new String("you");
		s[1][2] =new String("!");
		for(int i=0;i<s.length;i++) {   //使用for循环遍历多维数组
			for(int y=0;y<s[i].length;y++) {
				System.out.println(s[i][y]);
			}
		}
   }
}

二、文件
JAVA文件读写操作
一、读文件 BufferedInputStream

BufferedInputStream必须传入一个InputStream(一般是FileInputStream)

常用方法:

//从该输入流中读取一个字节 public int read();

//从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。

public int read(byte[] b,int off,int len)

应用实例:

import java.io.BufferedInputStream;
import java.io.FileInputStream;

/**
 * BufferedInputStream:缓冲输入流
 * FileInputStream:文件输入流
 */
public class FileReadToString {
    public static void main(String[] args){
        try {
            FileInputStream fis=new FileInputStream("WynnNi.txt");
            BufferedInputStream bis=new BufferedInputStream(fis);
            String content=null;
             //自定义缓冲区
            byte[] buffer=new byte[10240];
            int flag=0;
            while((flag=bis.read(buffer))!=-1){
                content+=new String(buffer, 0, flag);
            }
            System.out.println(content);
            //关闭的时候只需要关闭最外层的流就行了
            bis.close();
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
}

2.1写文件 BufferedOutputStream

创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

常用方法:

//向输出流中输出一个字节
public void write(int b);
//将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
public void write(byte[] b,int off,int len);
//刷新此缓冲的输出流。这迫使所有缓冲的输出字节被写出到底层输出流中。
public void flush();
应用实例


/**
 * BufferedOutputStream:缓冲输出流
 * FileOutPutStream:文件输出流
 */
public class StringOutPutToFile {
    public static void main(String[] args){
        try {
            FileOutputStream fos=new FileOutputStream("WynnNi.txt");
            BufferedOutputStream bos=new BufferedOutputStream(fos);
            String content="xxxxxxxxx!";
            bos.write(content.getBytes(),0,content.getBytes().length);
            bos.flush();
            bos.close();
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
}

三、实际应用场景

被调用方如何将文件传输给调用方并在本地输出文件

1、被调用方将文件读入缓冲区byte[]

2、将缓冲区数据转换成String传递,

String str = Base64.getEncoder().encodeToString(bytes);

3、接收方将String反转为byte[],bytes=Base64.getDecoder().decode(str);

4、接收方将缓冲区输出到文件
四、图表
JFreeChart - 多功能Java图表类库
JFreeChart是一款基于Java的多功能图表类库,并且是完全开源免费的。JFreeChart可以绘制饼状图、柱状图、散点图、时序图、 甘特图等等多种图表,生成的图表还能以PNG和JPEG格式的图片输出,功能十分强大,更重要的一点是JFreeChart生成的图表操作起来非常流畅, 因此性能也挺不错。

例:应用实例

public void test() {
    try {
        // 第一步,使用JFreeChart生成折线图的图片
        // 图表标题、图表x轴名称、图表y轴名称
        String title = "月发电量";
        String categoryAxisLabel = "时间";
        String valueAxisLabel = "发电量";
        String[] titles = new String[] { title, categoryAxisLabel, valueAxisLabel };
        // y轴数据类别
        String[] rowKeys = { "6000001", "6000002", "6000003" };
        // x轴的分类
        String[] colKeys = { "1月", "2月", "3月" };
        // 数据值
        double[][] data = { { 120, 200, 150 }, { 230, 200, 235 }, { 100, 200, 300 } };
        byte[] bytes = LineChartImg.getBytes(titles, 400, 200, rowKeys, colKeys, data);
// 第二步,使用POI将图片放入excel文件
    String excel = "F:/Users/zyj/Desktop/2019-09-27 自由报表/插件测试/生成的报表.xls";
    // 图片位置,八个参数,前四个表示图片离起始单元格和结束单元格边缘的位置,后四个表示起始和结束单元格的位置;
    // 示例{0,0,0,0,2,1,12,15}表示从第2列到第12列,从第1行到第15行,单元格内部的边距都是0
int[] anchors = new int[] { 0, 0, 0, 0, 2, 1, 12, 15 };
        XlsHelper.addPicture(excel, 0, anchors, bytes);
    } catch (Exception e) {
        System.out.print(e);
    }
}