Java写入写出Excel操作源码分享

这两天帮老师做一个数据库,将所有实验交易的数据导入到数据库中,但是不想天天在实验室里面待着,气氛太压抑,就想着先把数据读进EXCEL中,哪天带到实验室导进去

数据原来是这样的,不同的实验有一个专门的文件夹,实验名的文件夹下有不同班级的文件夹,班级文件夹下有该班级日期文件夹,存储的是不同时间下该班做实验的数据EXCEL,原来的EXCEL中没有班级和时间,现在需要通过读取EXCEL名以及班级名来将该信息作为一列,加入到EXCEL中。

下面是源代码,嘿嘿,顺便还做了一个可视化窗口。

类ExcelRead:

import java.awt.List;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelRead {
	String path;
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	//默认单元格内容为数字时格式
	private static DecimalFormat df = new DecimalFormat("0");
	// 默认单元格格式化日期字符串
	private static SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");
	// 格式化数字
	private static DecimalFormat nf = new DecimalFormat("0.00");
	public static ArrayList<ArrayList<Object>> readExcel(File file){
		if(file == null){
			return null;
		}
		if(file.getName().endsWith("xlsx")){
			//处理ecxel2007
			return readExcel2007(file);
		} else{
			//处理ecxel2003
			return readExcel2003(file);
		}
	}
	/*
   * @return 将返回结果存储在ArrayList内,存储结构与二位数组类似
   * lists.get(0).get(0)表示过去Excel中0行0列单元格
   */
	public static ArrayList<ArrayList<Object>> readExcel2003(File file){
		try{
			ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
			ArrayList<Object> colList;
			HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));
			HSSFSheet sheet = wb.getSheetAt(0);
			HSSFRow row;
			HSSFCell cell;
			Object value;
			for (int i = sheet.getFirstRowNum() , rowCount = 0; rowCount < sheet.getPhysicalNumberOfRows() ; i++ ){
				row = sheet.getRow(i);
				colList = new ArrayList<Object>();
				if(row == null){
					//当读取行为空时
					if(i != sheet.getPhysicalNumberOfRows()){
						//判断是否是最后一行
						rowList.add(colList);
					}
					continue;
				} else{
					rowCount++;
				}
				for ( int j = row.getFirstCellNum() ; j <= row.getLastCellNum() ;j++){
					cell = row.getCell(j);
					if(cell == null || cell.getCellType() == HSSFCell.CELL_TYPE_BLANK){
						//当该单元格为空
						if(j != row.getLastCellNum()){
							//判断是否是该行中最后一个单元格
							colList.add("");
						}
						continue;
					}
					switch(cell.getCellType()){
						case XSSFCell.CELL_TYPE_STRING:
						            //System.out.println(i + "行" + j + " 列 is String type");
						value = cell.getStringCellValue();
						break;
						case XSSFCell.CELL_TYPE_NUMERIC:
						            if ("@".equals(cell.getCellStyle().getDataFormatString())) {
							value = df.format(cell.getNumericCellValue());
						} else if ("General".equals(cell.getCellStyle()
						                .getDataFormatString())) {
							value = nf.format(cell.getNumericCellValue());
						} else {
							value = sdf.format(HSSFDateUtil.getJavaDate(cell
							                  .getNumericCellValue()));
						}
						//                System.out.println(i + "行" + j
						//                    + " 列 is Number type ; DateFormt:"
						//                    + value.toString());
						break;
						case XSSFCell.CELL_TYPE_BOOLEAN:
						            //System.out.println(i + "行" + j + " 列 is Boolean type");
						value = Boolean.valueOf(cell.getBooleanCellValue());
						break;
						case XSSFCell.CELL_TYPE_BLANK:
						            //System.out.println(i + "行" + j + " 列 is Blank type");
						value = "";
						break;
						default:
						            //System.out.println(i + "行" + j + " 列 is default type");
						value = cell.toString();
					}
					// end switch
					colList.add(value);
				}
				//end for j
				rowList.add(colList);
			}
			//end for i
			return rowList;
		}
		catch(Exception e){
			return null;
		}
	}
	public static ArrayList<ArrayList<Object>> readExcel2007(File file){
		try{
			ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
			ArrayList<Object> colList;
			XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(file));
			XSSFSheet sheet = wb.getSheetAt(0);
			XSSFRow row;
			XSSFCell cell;
			Object value;
			for (int i = sheet.getFirstRowNum() , rowCount = 0; rowCount < sheet.getPhysicalNumberOfRows() ; i++ ){
				row = sheet.getRow(i);
				colList = new ArrayList<Object>();
				if(row == null){
					//当读取行为空时
					if(i != sheet.getPhysicalNumberOfRows()){
						//判断是否是最后一行
						rowList.add(colList);
					}
					continue;
				} else{
					rowCount++;
				}
				for ( int j = row.getFirstCellNum() ; j <= row.getLastCellNum() ;j++){
					cell = row.getCell(j);
					if(cell == null || cell.getCellType() == HSSFCell.CELL_TYPE_BLANK){
						//当该单元格为空
						if(j != row.getLastCellNum()){
							//判断是否是该行中最后一个单元格
							colList.add("");
						}
						continue;
					}
					switch(cell.getCellType()){
						case XSSFCell.CELL_TYPE_STRING:
						            //System.out.println(i + "行" + j + " 列 is String type");
						value = cell.getStringCellValue();
						break;
						case XSSFCell.CELL_TYPE_NUMERIC:
						            if ("@".equals(cell.getCellStyle().getDataFormatString())) {
							value = df.format(cell.getNumericCellValue());
						} else if ("General".equals(cell.getCellStyle()
						                .getDataFormatString())) {
							value = nf.format(cell.getNumericCellValue());
						} else {
							value = sdf.format(HSSFDateUtil.getJavaDate(cell
							                  .getNumericCellValue()));
						}
						//                System.out.println(i + "行" + j
						//                    + " 列 is Number type ; DateFormt:"
						//                    + value.toString());
						break;
						case XSSFCell.CELL_TYPE_BOOLEAN:
						            //System.out.println(i + "行" + j + " 列 is Boolean type");
						value = Boolean.valueOf(cell.getBooleanCellValue());
						break;
						case XSSFCell.CELL_TYPE_BLANK:
						            //System.out.println(i + "行" + j + " 列 is Blank type");
						value = "";
						break;
						default:
						            //System.out.println(i + "行" + j + " 列 is default type");
						value = cell.toString();
					}
					// end switch
					colList.add(value);
				}
				//end for j
				rowList.add(colList);
			}
			//end for i
			return rowList;
		}
		catch(Exception e){
			System.out.println("exception");
			return null;
		}
	}
	public static ArrayList getFiles(String filePath){
		File root = new File(filePath);
		File[]files = root.listFiles();
		ArrayList filelist = new ArrayList();
		for (File file:files){
			if(file.isDirectory()){
				filelist.addAll(getFiles(file.getAbsolutePath()));
			} else{
				String newpath = file.getAbsolutePath();
				if(newpath.contains("交易记录")){
					filelist.add(newpath);
				}
			}
		}
		return filelist;
	}
	public void readBook(String path3) {
		String filePath = path3;
		ArrayList filelist = getFiles(filePath);
		ArrayList<ArrayList>resultAll = new ArrayList<ArrayList>();
		for (int i = 0;i<filelist.size();i++){
			String path = (String) filelist.get(i);
			System.out.println(path);
			ArrayList<ArrayList>result = Graph(path);
			String[] path2 = path.split("\\\\");
			int num = result.get(0).size();
			ArrayList result2 = new ArrayList();
			for (int j = 0;j<num;j++){
				result2.add(path2[path2.length-2]);
			}
			ArrayList result3 = new ArrayList();
			for (int j = 0;j<num;j++){
				result3.add(path2[path2.length-3]);
			}
			result.add(result2);
			result.add(result3);
			if(resultAll.size()==0){
				resultAll = result;
			} else{
				for (int j = 0;j<result.size();j++){
					for (int k = 0;k<result.get(j).size();k++){
						resultAll.get(j).add(result.get(j).get(k));
					}
				}
			}
		}
		writeExcel(resultAll,"D:/a.xls");
	}
	public static void writeExcel(ArrayList<ArrayList> result,String path){
		if(result == null){
			return;
		}
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet("sheet1");
		for (int i = 0 ;i < result.get(0).size() ; i++){
			HSSFRow row = sheet.createRow(i);
			for (int j = 0; j < result.size() ; j ++){
				HSSFCell cell = row.createCell((short)j);
				cell.setCellValue(result.get(j).get(i).toString());
			}
		}
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		try
		    {
			wb.write(os);
		}
		catch (IOException e){
			e.printStackTrace();
		}
		byte[] content = os.toByteArray();
		File file = new File(path);
		//Excel文件生成后存储的位置。
		OutputStream fos = null;
		try
		    {
			fos = new FileOutputStream(file);
			wb.write(fos);
			os.close();
			fos.close();
		}
		catch (Exception e){
			e.printStackTrace();
		}
	}
	public static DecimalFormat getDf() {
		return df;
	}
	public static void setDf(DecimalFormat df) {
		ExcelRead.df = df;
	}
	public static SimpleDateFormat getSdf() {
		return sdf;
	}
	public static void setSdf(SimpleDateFormat sdf) {
		ExcelRead.sdf = sdf;
	}
	public static DecimalFormat getNf() {
		return nf;
	}
	public static void setNf(DecimalFormat nf) {
		ExcelRead.nf = nf;
	}
	public static ArrayList<ArrayList> Graph(String path){
		File file = new File(path);
		ArrayList<ArrayList<Object>> result = ExcelRead.readExcel(file);
		ArrayList<double>price = new ArrayList<double>();
		//价格序列
		ArrayList<String>time = new ArrayList<String>();
		//时间序列
		ArrayList<String>buyList = new ArrayList<String>();
		//买方序列
		ArrayList<String>sellList = new ArrayList<String>();
		//卖方序列
		ArrayList<double>vol = new ArrayList<double>();
		//成交量
		ArrayList<String>Share = new ArrayList<String>();
		//股票名字
		ArrayList<String>id = new ArrayList<String>();
		ArrayList<String>Shareid = new ArrayList<String>();
		for (int i = 2 ;i < result.size() ;i++){
			for (int j = 0;j<result.get(i).size(); j++){
				//第5列表示价格,第8列表示时间
				if(j==0){
					String temp = (String) result.get(i).get(j);
					id.add(temp);
				}
				if(j==3){
					String temp = (String) result.get(i).get(j);
					Shareid.add(temp);
				}
				if(j==5){
					//price.add((String) result.get(i).get(j));
					String temp = (String) result.get(i).get(j);
					String[] units = temp.split("¥");
					price.add(double.valueOf(units[1]));
				}
				if(j==7){
					String temp = (String) result.get(i).get(j);
					time.add(temp);
					//         time.add((String) result.get(i).get(j));
				}
				if(j==1){
					buyList.add((String) result.get(i).get(j));
				}
				if(j==2){
					sellList.add((String) result.get(i).get(j));
				}
				if(j==6){
					vol.add(double.valueOf((String)result.get(i).get(j)));
				}
				if(j==4){
					Share.add((String)result.get(i).get(j));
				}
			}
		}
		ArrayList<ArrayList>resultList = new ArrayList<ArrayList>();
		resultList.add(Shareid);
		resultList.add(id);
		resultList.add(buyList);
		resultList.add(sellList);
		resultList.add(Share);
		resultList.add(price);
		resultList.add(vol);
		resultList.add(time);
		return resultList;
	}
}

readExcelBook(做可视化窗口的):

import java.awt.EventQueue;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.GroupLayout;
import javax.swing.JLabel;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
public class readExcelBook {
	private JFrame frame;
	private JTextField textField;
	/**
   * Launch the application.
   */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					readExcelBook window = new readExcelBook();
					window.frame.setVisible(true);
				}
				catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		);
	}
	/**
   * Create the application.
   */
	public readExcelBook() {
		initialize();
	}
	/**
   * Initialize the contents of the frame.
   */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JButton button = new JButton("\u9009\u62E9\u6587\u4EF6");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser jfc=new JFileChooser();
				jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
				jfc.showDialog(new JLabel(), "选择");
				File file=jfc.getSelectedFile();
				String path = file.getAbsolutePath();
				textField.setText(path);
				ExcelRead er = new ExcelRead();
				er.readBook(path);
			}
		}
		);
		textField = new JTextField();
		textField.setColumns(10);
		JLabel lbldaxls = new JLabel("\u5199\u5165\u4E86D\u76D8\u4E0B\u7684a.xls\u54C8");
		GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
		groupLayout.setHorizontalGroup(
		      groupLayout.createParallelGroup(Alignment.LEADING)
		        .addGroup(groupLayout.createSequentialGroup()
		          .addGap(26)
		          .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
		            .addComponent(lbldaxls)
		            .addComponent(textField, GroupLayout.PREFERRED_SIZE, 295, GroupLayout.PREFERRED_SIZE)
		            .addComponent(button))
		          .addContainerGap(113, short.MAX_VALUE))
		    );
		groupLayout.setVerticalGroup(
		      groupLayout.createParallelGroup(Alignment.LEADING)
		        .addGroup(groupLayout.createSequentialGroup()
		          .addGap(31)
		          .addComponent(button)
		          .addGap(18)
		          .addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
		          .addGap(35)
		          .addComponent(lbldaxls)
		          .addContainerGap(119, short.MAX_VALUE))
		    );
		frame.getContentPane().setLayout(groupLayout);
	}
}

运行结果:

总结

以上就是本文关于Java写入写出Excel操作源码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站Java相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • Java用jxl读取excel并保存到数据库的方法

    项目中涉及到读取excel中的数据,保存到数据库中,用jxl做起来比较简单. 基本的思路: 把excel放到固定盘里,然后前段页面选择文件,把文件的名字传到后台,再利用jxl进行数据读取,把读取到的数据存到list中,通过遍历list,得到map,存到数据库中. 首先导入jar包:在网上都有, 代码: 页面: 新模excel导入 <input type="file" name="excel" id="xinmu"> <input

  • Java实现生成Excel树形表头完整代码示例

    本文主要分享了Java实现生成Excel树形表头完整代码示例,没有什么好解释的,直接看看代码过程. 源数据格式: String[] targetNames = { "指标名称", "单位", "xx_yy1", "xx_yy2_zz1", "xx_yy2_zz2", "2017年5月_主营业务收入_累计", "2017年5月_主营业务收入_同比", "201

  • Java如何将Excel数据导入到数据库

    本文实例为大家分享了Java将Excel数据导入到数据库的具体代码,供大家参考,具体内容如下 所用Jar包 1. sqljdbc4.jar 连接数据库的Jar包(根据数据库的不同进行选择,我用的SqlServer2008) 2.Jxl.jar 访问Excel的Jar包 package xsl; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; impo

  • Java实现批量导入excel表格数据到数据库中的方法

    本文实例讲述了Java实现批量导入excel表格数据到数据库中的方法.分享给大家供大家参考,具体如下: 1.创建导入抽象类 package com.gcloud.common.excel; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintStream; import java.sql.SQLException;

  • Java使用poi包读取Excel文档代码分享

    项目需要解析Excel文档获取数据,就在网上找了一些资料,结合自己这次使用,写下心得: 1.maven项目需加入如下依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10-FINAL</version> </dependency> <dependency> <gr

  • java 导入Excel思路及代码示例

    导出就是将List转化为Excel(listToExcel) 导入就是将Excel转化为List(excelToList) 一.思路分析 1.我们要做导入,实际上也就是先文件上传,然后读取文件的数据. 2.我们要有一个导入的模板,因为我们导入的Excel列要和我们的数据字段匹配上,所以我们要给它来一个规定,也就是模板. 3.按照我们公司的套路,是做了一个导入信息的临时表,用来存导入文件中的信息.每当导入的时候,我们先把表信息清空,再拿到数据放进来,然后我们对导入的数据进行检查,最后才全部导入.

  • Java用POI解析excel并获取所有单元格数据的实例

    1.导入POI相关jar包 org.apache.poi jar 2.代码示例 public List getAllExcel(File file, String tableName, String fname, String enterpriseId, String reportId, String projectId) throws FileNotFoundException, IOException, ClassNotFoundException, InstantiationExcepti

  • Java使用excel工具类导出对象功能示例

    本文实例讲述了Java使用excel工具类导出对象功能.分享给大家供大家参考,具体如下: package com.gcloud.common; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.streaming.SXSSFSheet; import

  • Java写入写出Excel操作源码分享

    这两天帮老师做一个数据库,将所有实验交易的数据导入到数据库中,但是不想天天在实验室里面待着,气氛太压抑,就想着先把数据读进EXCEL中,哪天带到实验室导进去 数据原来是这样的,不同的实验有一个专门的文件夹,实验名的文件夹下有不同班级的文件夹,班级文件夹下有该班级日期文件夹,存储的是不同时间下该班做实验的数据EXCEL,原来的EXCEL中没有班级和时间,现在需要通过读取EXCEL名以及班级名来将该信息作为一列,加入到EXCEL中. 下面是源代码,嘿嘿,顺便还做了一个可视化窗口. 类ExcelRea

  • 使用Java实现天天酷跑(附源码)

    首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的障碍物越多跑酷距离越远,玩家吃的金币越多,得分越高. 三.功能模块: 1.登录界面 用户名(输入框,明文) 密码(输入框,密文) 登录.取消按钮 2.菜单选择界面 开始游戏按钮(图片按钮) 帮助按钮 退出按钮 3.缓冲加载界面 自动加载进度条,加载完毕之后,跳转到下一界面 4.游戏主界面 移动的背景图片.动态

  • java实现简易超市管理系统 附源码下载

    java超市管理系统 1.0(含源文件,后续会继续优化~) 前言 一个月零零散散的时间学习了java,通过这次"超市管理系统"的练习,希望可以给一同开始学习java的朋友一些参考,更希望大佬们多多指点和批评~ 一.确定需求 程序概述: 小型超市商品销售管理系统选择小型超市的四类商品进行管理. 这四类商品是:食品.化妆品.生活用品和饮料(四个类). 每类商品都包含有商品名和商品利润 (其中包括商品的售价.进价.库存量).(五个属性) 每类不同的商品还有区别于其他商品的特殊信息(子类特有属

  • java编程Reference核心原理示例源码分析

    带着问题,看源码针对性会更强一点.印象会更深刻.并且效果也会更好.所以我先卖个关子,提两个问题(没准下次跳槽时就被问到). 我们可以用ByteBuffer的allocateDirect方法,申请一块堆外内存创建一个DirectByteBuffer对象,然后利用它去操作堆外内存.这些申请完的堆外内存,我们可以回收吗?可以的话是通过什么样的机制回收的? 大家应该都知道WeakHashMap可以用来实现内存相对敏感的本地缓存,为什么WeakHashMap合适这种业务场景,其内部实现会做什么特殊处理呢?

  • Java Shutdown Hook场景使用及源码分析

    目录 背景 Shutdown Hook 介绍 关闭钩子被调用场景 注意事项 实践 Shutdown Hook 在 Spring 中的运用 背景 如果想在 Java 进程退出时,包括正常和异常退出,做一些额外处理工作,例如资源清理,对象销毁,内存数据持久化到磁盘,等待线程池处理完所有任务等等.特别是进程异常挂掉的情况,如果一些重要状态没及时保留下来,或线程池的任务没被处理完,有可能会造成严重问题.那该怎么办呢? Java 中的 Shutdown Hook 提供了比较好的方案.我们可以通过 Java

  • 基于Java实现互联网实时聊天系统(附源码)

    目录 0. 前言 1.技术准备 2. 整体说明 2.1 设计思想 2.2 系统结构 2.3 项目结构 2.4 系统功能模块 2.5 系统界面 3. 核心编码 3.1 Netty服务器启动与关闭 4. 效果及操作演示 4.1 登录操作 4.2 聊天演示 5. 源码下载 0. 前言 决定以Netty为核心,以WebSocket为应用层通信协议做一个互联网聊天系统,整体而言就像微信网页版一样,但考虑到这个聊天系统的功能非常多,因此只打算实现核心的聊天功能,包括单发.群发.文件发送,然后把项目与Spri

  • Java编程删除链表中重复的节点问题解决思路及源码分享

    一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4->5 处理后为:1->2->5 三. 思路 个人感觉这题关键是注意指针的指向,可以定义一个first对象(值为-1,主要用于返回操作后的链表),first.next指向head,定义一个last同样指向first(主要用于操作记录要删除节点的前一个节点),定义一个p指向head,指向当前节点.

  • Java 中的FileReader和FileWriter源码分析_动力节点Java学院整理

    FileReader和FileWriter源码分析 1. FileReader 源码(基于jdk1.7.40) package java.io; public class FileReader extends InputStreamReader { public FileReader(String fileName) throws FileNotFoundException { super(new FileInputStream(fil java io系列21之 InputStreamReade

  • Java中的InputStreamReader和OutputStreamWriter源码分析_动力节点Java学院整理

    InputStreamReader和OutputStreamWriter源码分析 1. InputStreamReader 源码(基于jdk1.7.40) package java.io; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import sun.nio.cs.StreamDecoder; // 将"字节输入流"转换成"字符输入流" public class

  • 详解java实践SPI机制及浅析源码

    1.概念 正式步入今天的核心内容之前,溪源先给大家介绍一下关于SPI机制的相关概念,最后会提供实践源代码. SPI即Service Provider Interface,属于JDK内置的一种动态的服务提供发现机制,可以理解为运行时动态加载接口的实现类.更甚至,大家可以将SPI机制与设计模式中的策略模式建立联系. SPI机制: 从上图中理解SPI机制:标准化接口+策略模式+配置文件: SPI机制核心思想:系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编

随机推荐