◎筱米加步枪◎.Blog

Happy coding

Windows下查看端口被占用情况

今天开发时遇到的问题~~端口被占用~~想知道哪个程序占用了此端口~~百度了下,虽然后面解决问题是直接重启电脑了。。

但是学习了一招:

windows下如何查看端口被哪个程序占用了? 按照以下步骤:

1. cmd >> netstat –ano 可以看到使用端口情况。注意对照PID 一栏如图:

2.接着输入 tasklist 可以看到任务运行情况

3.请看PID一栏,查看某个端口的使用,记住这个端口所对应的PID,然后在任务列表中通过PID来找到端口被哪个程序所使用,

接下来就可以通过打开任务管理器 来关闭被占用端口所使用的程序,还可以通过以下命令快速关闭任务。

命令如下: taskkill /pid 1040  /t  /f  即可。

当然现在有许多防火墙都有此功能~呵~

Spring中ApplicationContextAware接口用法

加载Spring配置文件时,如果Spring配置文件中所定义的Bean类,如果该类实现了ApplicationContextAware接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware接口中的

public void setApplicationContext(ApplicationContext context) throws BeansException

方法,并且自动可获得ApplicationContext 对象。前提必须在Spring配置文件中指定改类。

一个Demo程序如下:

 

Spring配置文件中配置:

<bean id="springContext" class="com.shine.spring.SpringContextHelper"></bean>

 

/**
 * ApplicationContext的帮助类
 * 自动装载ApplicationContext
 * 
 * @author ChenST
 * @create 2010-6-24
 * 
 */
public class SpringContextHelper implements ApplicationContextAware {
	
	private static ApplicationContext context ;
	
	/*
	 * 注入ApplicationContext
	 */
	@Override
	public void setApplicationContext(ApplicationContext context)
			throws BeansException {
		//在加载Spring时自动获得context
		SpringContextHelper.context = context;
		System.out.println(SpringContextHelper.context);
	}
	
	public static Object getBean(String beanName){
		return context.getBean(beanName);
	}
}

Excel 单元格里换行按"Alt+Enter"

无比囧~~

Excel里换行按“Enter”总是到下一个单元格去~~

原来在单元格里换行是按“Alt+Enter

使用pdfBox读取PDF文件注意问题

本来想要iText来读取pdf的,结果网上搜索下得出结论,使用iText读取pdf基本上是无法实现的。

于是还是改用了pdfBox来读取文件。于是造成了iText与pdfBox混用的尴尬。

虽然如此,但也遇到了不少问题。下面分析遇到的问题。
---------------------------------------------------------------------------------

1.首先最好要下载pdfbox 1.1的版本。处理文档方面比较完善,如果是低版本的话,是不支持字体与语言的读取。会报错。

2.另外还要下载fontbox 1.1 的包,这对多种字体以及多种语言的支持。注意版本,不然会报有一些类找不到。

3.还要加入common-loggin的包,不然进行读取的时候会遇到类找不到异常,主要是用到org.apache.commons.logging.LogFactory类

---------------------------------------------------------------------------------

遇到的问题主要是使用的包版本太对,或者两者的版本不匹配造成的。

贴个使用pdfbox来读取pdf文档内容的代码:

/**
	 * 读取指定路径的pdf文件的文本内容<br>
	 * @param filePath  指定路径
	 * @return pdf文件的文本内容
	 * @throws IOException
	 */
	public String readPdf(String filePath) throws IOException{
		File file = new File(filePath);
		FileInputStream fis = new FileInputStream(file);
		//创建一个PDF解析器
		PDFParser parser = new PDFParser(fis);
		//进行解析
		parser.parse();
		//得到PDF文档对象
		PDDocument document = parser.getPDDocument();
		//新建一个PDF文件剥离器
		PDFTextStripper stripper = new PDFTextStripper();
		//从文档对象中剥离文本
		String content = stripper.getText(document);
		fis.close();
		document.close();
		return content;

Java操作Excel文件之使用JXL 学习笔记

百科上对于JXL的说明:

通过java操作excel表格的工具类库   

支持Excel 95-2000的所有版本   

生成Excel 2000标准格式   

支持字体、数字、日期操作   

能够修饰单元格属性   

支持图像和图表   

应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。

前几天学习了下,总结备忘下:贴个关于Excel操作类的代码:(需要加入jxl.jar包)

/**
 * 
 * <pre>
 * MS Office Excel 文件操作对象
 * 注:利用第三方包jxl.jar进行操作
 * 注:暂不支持excel2007版本新格式xlsx后缀名
 * 提供操作内容:
 * 1.创建Excel文件
 * 2.读取Excel文件
 * 3.导出(写入)Excel文件
 * 4.判断是否为Excel文件
 * </pre>
 *
 * @author 陈书挺
 * @create 2010-6-12
 * @version v1.0
 *
 * <pre>
 * 修改时间    修改人   修改原因
 * 2010-6-12  陈书挺   新建类
 * 2010-6-13  陈书挺   修改createExcel(String)方法 | 增加createExcel(String, String...)方法
 * </pre>
 *
 */
public class ExcelOperator {
	
	/*
	 * Excel文件后缀名
	 */
	private static final String EXCEL_POSTFIX = ".xls";
	
	/**
	 * 创建指定的文件路径的一个Excel文件<br>
	 * 默认创建3个工作表分别为:Sheet1|Sheet2|Sheet3<br>
	 * 注:只支持xls格式的文件
	 * @param filePath    文件路径
	 * @throws Exception
	 */
	public void createExcel(String filePath) throws Exception{
		this.createExcel(filePath, "Sheet1" , "Sheet2" , "Sheet3");
	}
	
	/**
	 * 创建指定的文件路径的一个Excel文件,并指定工作表名<br>
	 * 注:只支持xls格式的文件
	 * @param filePath    文件路径
	 * @param sheetNames  工作表名数组
	 * @throws Exception
	 */
	public void createExcel(String filePath , String...sheetNames) throws Exception{
		if(!this.isExcel(filePath)){
			throw new Exception("对不起,文件必须是Excel文件,必须是xls格式的文件");
		}
		File file = new File(filePath);
		//工厂方法创建一个可写入的工作薄(WorkBook)
		WritableWorkbook workBook = Workbook.createWorkbook(file);
		//创建一个可写入的工作表(Sheet) 得到的对象为WritableSheet对象              
		//工作表名   工作表在工作簿中的位置
		for (int i = 0; i < sheetNames.length; i++) {
			workBook.createSheet(sheetNames[i], i);
		}
		workBook.write();
		workBook.close();
	}
	
	/**
	 * 读取指定文件路径的Excel文件,以集合方式返回<br>
	 * 说明:读取所有工作表的内容
	 * @param filePath  文件路径
	 * @return  List集合,List集合中的元素表示一个工作表
	 * 			List中存储String[][]数组,一个数组表示存储工作表的内容
	 *          返回文件中的所有内容
	 * @throws Exception
	 */
	public List<String [][]> readExcel(String filePath) throws Exception{
		if(!this.isExcel(filePath)){
			throw new Exception("对不起,文件必须是Excel文件,必须是xls格式的文件");
		}
		List<String [][]> contents = new ArrayList<String[][]>();
		File file = new File(filePath);
		//创建工作薄
		Workbook workBook = Workbook.getWorkbook(file);
		//获取工作表
		Sheet [] sheets = workBook.getSheets();
		if(sheets!=null && sheets.length>0){
			for (int i = 0; i < sheets.length; i++) {
				String[][] content = this.readExcel(filePath, i);
				contents.add(content);
			}
		}
		workBook.close();
		return contents;
	}
	
	/**
	 * 将指定内容写入指定的Excel文件,并指定相应的工作表名
	 * @param filePath   文件路径
	 * @param contents   数据内容
	 * @param sheetName  工作表名
	 * @throws Exception
	 */
	public void writeExcel(String filePath , String [][] contents ,String sheetName) throws Exception{
		if(!this.isExcel(filePath)){
			throw new Exception("对不起,文件必须是Excel文件,必须是xls格式的文件");
		}
		File file = new File(filePath);
		//工厂方法创建一个可写入的工作薄(WorkBook)
		WritableWorkbook workBook = Workbook.createWorkbook(file);
		WritableSheet sheet = workBook.createSheet(sheetName, 0);
		for (int i = 0; i < contents.length; i++) {
			for (int j = 0; j < contents[i].length; j++) {
				sheet.addCell(new Label(j,i,contents[i][j]));
			}
		}
		workBook.write();
		workBook.close();
	}
	
	/**
	 * 将指定内容写入指定的Excel文件,并指定相应的工作表名
	 * @param filePath   文件路径
	 * @param contents   数据内容
	 * @param sheetName  工作表名
	 * @throws Exception
	 */
	public void writeExcel(String filePath , Vector<Vector<String>> contents , String sheetName) throws Exception{
		this.writeExcel(filePath, StringUtils.toStringArray(contents), sheetName);
	}
	
	/**
	 * 读取指定文件路径、指定工作表索引的Excel文件
	 * 
	 * @param filePath   Excel文件路径
	 * @param sheetIndex 工作表索引 从0开始
	 * @return 与Excel结构相似的二维数组,二维数组中存储的是表格中的内容
	 * @throws Exception
	 */
	public String [][] readExcel(String filePath , int sheetIndex) throws Exception{
		if(!this.isExcel(filePath)){
			throw new Exception("文件必须是Excel文件,必须是xls格式的文件");
		}
		File file = new File(filePath);
		//创建工作薄
		Workbook workBook = Workbook.getWorkbook(file);
		//获取工作表
		Sheet [] sheets = workBook.getSheets();
		if(sheetIndex>sheets.length-1){
			throw new Exception("工作表索引["+sheetIndex+"]超出范围");
		}
		
		//获取指定工作表
		Sheet sheet = sheets[sheetIndex];
		//获取当前工作薄的行数
		int rows = sheet.getRows();
		//获取当前工作薄的列数
		int columns = sheet.getColumns();
		//存储Excel中的数据
		String [][] content = new String[rows][columns];
		this.initArrays(content);
		for (int i = 0; i < rows; i++) {
			//得到当前行的所有单元格
			Cell [] cells = sheet.getRow(i);
			if(cells!=null && cells.length>0){
				for (int j= 0; j < cells.length; j++) {
					String cellContent = cells[j].getContents();
					content[i][j]=cellContent;
				}
			}
		}
		workBook.close();
		return content;
	}
	
	/**
	 * 判断指定文件的路径是否是Excel文件
	 * @param filePath  文件的路径 
	 * @return   是否是Excel文件
	 * 			true:是Excel文件
	 * 			false:不是Excel文件
	 */
	public boolean isExcel(String filePath){
		//获取文件后缀名
		String postfix = FileUtils.getPostfix(filePath);
		if(!postfix.equals(ExcelOperator.EXCEL_POSTFIX)){
			return false;
		}
		return true;
	}
	
	/*
	 * 初始化二维数组内容为"" 
	 * @param arrays 要初始化二维数组
	 */
	private void initArrays(String [][] arrays){
		for (int i = 0; i < arrays.length; i++) {
			for (int j = 0; j < arrays[i].length; j++) {
				arrays[i][j]="";
			}
		}
	}
}

使用iText5.x创建PDF中文处理问题

今天无意中在网上看到iText这个东东,iText 是利用Java 来操作PDF 操作的一种开源API

简单说明下使用该API创建PDF文件的过程

PS:使用的是iText5.x版本

/**
	 * 创建PDF文件
	 * @param filePath  文件路径
	 * @param content   需要写入的内容
	 * @throws DocumentException
	 * @throws IOException
	 */
	public void createPdf(String filePath ,String content) throws DocumentException, IOException{
		//1.创建Document对象
		Document document = new Document();
		FileOutputStream fos = new FileOutputStream(filePath);
		//2.创建一个PdfWriter实例
		PdfWriter.getInstance(document, fos);
		//3.打开文档
		document.open();
		Paragraph graph = new Paragraph(content);
		//4.加入段落
		document.add(graph);
		//5.关闭文档
		document.close();
	}

利用上述程序,运行结果。发现,只有英文部分被写入,中文部分无法被写入。百度得到结论:

需要加入itextasian.jar包,itextasian.jar包有实现了对中文字体的支持。因此加载itextasian.jar到classpath下。

在上述代码中加入如下代码:

BaseFont baseFontChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
		Font fontChinese =  new  Font(baseFontChinese , 12 , Font.NORMAL);
		Paragraph graph = new Paragraph(content , fontChinese);

运行,得到如下异常:

Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized

还是不行,继续研究,在网上前辈们说如下原因:

  iText5.x版本以上中的font和encoding文件都是从String RESOURCE_PATH = "com/itextpdf/text/pdf/fonts/"加载的,而老itextasian.jar的包名是com.lowagie.text.pdf.fonts, 包名不一致导致路径错误,。

具体解决方法就是修改包的路径了,详细方法如下:

1.解压iTextAsian.jar
  得到如下目录:
  iTextAsian
     --com
        --lowagie
          --text
            --pdf
              --fonts
                --...(字体属性文件)
2.将解压后的com目录下的包名lowagie更改为itextpdf
3.在命令行转至iTextAsian目录,重新打包为iTextAsian.jar文件
4.打包命令如下:
  jar cvf iTextAsian.jar com/itextpdf/text/pdf/fonts/*
5.执行后,将新的iTextAsian.jar加入classpath路径

运行结果,OK,解决问题。

最终代码如下:

/**
	 * 创建PDF文件
	 * @param filePath  文件路径
	 * @param content   需要写入的内容
	 * @throws DocumentException
	 * @throws IOException
	 */
	public void createPdf(String filePath ,String content) throws DocumentException, IOException{
		//1.创建Document对象
		Document document = new Document();
		FileOutputStream fos = new FileOutputStream(filePath);
		//2.创建一个PdfWriter实例
		PdfWriter.getInstance(document, fos);
		//3.打开文档
		document.open();
		BaseFont baseFontChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
		Font fontChinese =  new  Font(baseFontChinese , 12 , Font.NORMAL);
		Paragraph graph = new Paragraph(content , fontChinese);
		document.add(graph);
		document.close();
	}

 继续研究ing~~