java中几种Map在啥情况下使用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中几种Map在啥情况下使用?相关的知识,希望对你有一定的参考价值。
参考技术A HashMap 散列表 插入和查询的开销是固定的; 可以通过构造方法设置容量和负载因子,调整性能默认选择LinkedHashMap 链表
取得元素的顺序是其插入次序,或者最近最少使用次序;插入时比HashMap略慢,但迭代时更快
TreeMap 红黑树 总是保证有序; 可以通过subMap()方法返回一个子树
WeakHashMap 弱键映射,允许释放映射所指向的对象
ConcurrentHashMap 线程安全,不涉及同步加锁
IdentityHashMap 用 == 代替 equals() 进行比较; 插入操作不会随着Map尺寸变大而明显变慢 参考技术B Map接口的常用实现类有HashMap和TreeMap,HashMap通过哈希码对其内部的映射关系进行快速查找,而TreeMap中的映射关系存在一定的顺序,如果希望在遍历集合时是有序的,则应该使用由TreeMap类实现的Map集合,否则建议使用由HashMap类实现的Map集合,因为由HashMap类实现的Map集合对于添加和删除映射关系更高效。Map集合允许值对象为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况,一种是在集合中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在Map集合中不应该利用get()方法来判断是否存在某个键,而应该利用containsKey()方法来判断;
LinkedHashMap:它是基于HashMap来做的,真正的存储单元还是用数组来实现的,它的每一个实体,就是LinkedHashMap.Entry的实现是用了链表形式,实体虽然是以Hash的顺序存放在Map的数组table里面,但是实体之间却用链表的形式保持了存入的先后关系;
IdentityHashMap:不是通用 Map 实现!此类实现 Map 接口时,它有意违反 Map 的常规协定,该协定在比较对象时强制使用 equals 方法。此类设计仅用于其中需要引用相等性语义的罕见情况,并且这种实现不是同步的;
WeakHashMap:以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同;
ConcurrentHashMap:支持获取的完全并发和更新的所期望可调整并发的哈希表。此类遵守与 Hashtable 相同的功能规范,并且包括对应于 Hashtable 的每个方法的方法版本。不过,尽管所有操作都是线程安全的,但获取操作不 必锁定,并且不 支持以某种防止所有访问的方式锁定整个表。此类可以通过程序完全与 Hashtable 进行互操作,这取决于其线程安全,而与其同步细节无关;
SortedMap:
进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet、keySet 和 values 方法返回)进行迭代时,此顺序就会反映出来。要采用此排序方式,还需要提供一些其他操作(此接口是 SortedSet 的对应映射)。 参考技术C 一、Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。Map接口定义了如下常用的方法:
1、void clear():删除Map中所以键值对。
2、boolean containsKey(Object key):查询Map中是否包含指定key,如果包含则返回true。
3、boolean containsValue(Object value):查询Map中是否包含指定value,如果包含则返回true。
4、Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map的内部类)。
5、Object get(Object key):返回指定key所对应的value,如Map中不包含key则返回null。
6、boolean isEmpty():查询Map是否为空,如果空则返回true。
7、Set keySet():返回该Map中所有key所组成的set集合。
8、Object put(Object key,Object value):添加一个键值对,如果已有一个相同的key值则新的键值对覆盖旧的键值对。
9、void putAll(Map m):将指定Map中的键值对复制到Map中。
10、Object remove(Object key):删除指定key所对应的键值对,返回可以所关联的value,如果key不存在,返回null。
11、int size():返回该Map里的键值对的个数。
12、Collection values():返回该Map里所有value组成的Collection。
Map中包含一个内部类:Entry。该类封装了一个键值对,它包含了三个方法:
1、Object getKey():返回该Entry里包含的key值。
2、Object getValeu():返回该Entry里包含的value值。
3、Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。
二、HashMap和Hashtable实现类:
1、HashMap与HashTable的区别:
1) 同步性:Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的。而HashMap则是异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。
2) 值:HashMap可以让你将空值作为一个表的条目的key或value,但是Hashtable是不能放入空值的。HashMap最多只有一个key值为null,但可以有无数多个value值为null。
2、性能:HashMap的性能最好,HashTable的性能是最差(因为它是同步的)
3、注意:
1)用作key的对象必须实现hashCode和equals方法。
2)不能保证其中的键值对的顺序
3)尽量不要使用可变对象作为它们的key值。
三、LinkedHashMap:
它的父类是HashMap,使用双向链表来维护键值对的次序,迭代顺序与键值对的插入顺序保持一致。LinkedHashMap需要维护元素的插入顺序,so性能略低于HashMap,但在迭代访问元素时有很好的性能,因为它是以链表来维护内部顺序。
四、TreeMap:
Map接口派生了一个SortMap子接口,SortMap的实现类为TreeMap。TreeMap也是基于红黑树对所有的key进行排序,有两种排序方式:自然排序和定制排序。Treemap的key以TreeSet的形式存储,对key的要求与TreeSet对元素的要求基本一致。
1、Map.Entry firstEntry():返回最小key所对应的键值对,如Map为空,则返回null。
2、Object firstKey():返回最小key,如果为空,则返回null。
3、Map.Entry lastEntry():返回最大key所对应的键值对,如Map为空,则返回null。
4、Object lastKey():返回最大key,如果为空,则返回null。
5、Map.Entry higherEntry(Object key):返回位于key后一位的键值对,如果为空,则返回null。
6、Map.Entry lowerEntry(Object key):返回位于key前一位的键值对,如果为空,则返回null。
7、Object lowerKey(Object key):返回位于key前一位key值,如果为空,则返回null。
8、NavigableMap subMap(Object fromKey,boolean fromlnclusive,Object toKey,boolean toInciusive):返回该Map的子Map,其key范围从fromKey到toKey。
9、SortMap subMap(Object fromKey,Object toKey );返回该Map的子Map,其key范围从fromkey(包括)到tokey(不包括)。
10、SortMap tailMap(Object fromkey ,boolean inclusive):返回该Map的子Map,其key范围大于fromkey(是否包括取决于第二个参数)的所有key。
11、 SortMap headMap(Object tokey ,boolean inclusive):返回该Map的子Map,其key范围小于tokey(是否包括取决于第二个参数)的所有key。
五、WeakHashMap:
WeakHashMap与HashMap的用法基本相同,区别在于:后者的key保留对象的强引用,即只要HashMap对象不被销毁,其对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的键值对对象。但WeakHashMap的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被回收。WeakHashMap中的每个key对象保存了实际对象的弱引用,当回收了该key所对应的实际对象后,WeakHashMap会自动删除该key所对应的键值对。
六、IdentityHashMap类:
IdentityHashMap与HashMap基本相似,只是当两个key严格相等时,即key1==key2时,它才认为两个key是相等的 。IdentityHashMap也允许使用null,但不保证键值对之间的顺序。
七、EnumMap类:
1、EnumMap中所有key都必须是单个枚举类的枚举值,创建EnumMap时必须显示或隐式指定它对应的枚举类。
2、Enu 参考技术D Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。Map接口定义了如下常用的方法:
1、void clear():删除Map中所以键值对。
2、boolean containsKey(Object key):查询Map中是否包含指定key,如果包含则返回true。
3、boolean containsValue(Object value):查询Map中是否包含指定value,如果包含则返回true。
4、Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map的内部类)。
5、Object get(Object key):返回指定key所对应的value,如Map中不包含key则返回null。
6、boolean isEmpty():查询Map是否为空,如果空则返回true。
7、Set keySet():返回该Map中所有key所组成的set集合。
8、Object put(Object key,Object value):添加一个键值对,如果已有一个相同的key值则新的键值对覆盖旧的键值对。
9、void putAll(Map m):将指定Map中的键值对复制到Map中。
10、Object remove(Object key):删除指定key所对应的键值对,返回可以所关联的value,如果key不存在,返回null。
11、int size():返回该Map里的键值对的个数。
12、Collection values():返回该Map里所有value组成的Collection。
Map中包含一个内部类:Entry。该类封装了一个键值对,它包含了三个方法:
1、Object getKey():返回该Entry里包含的key值。
2、Object getValeu():返回该Entry里包含的value值。
3、Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。
HashMap和Hashtable实现类:
HashMap与HashTable的区别:
1、 同步性:Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的。而HashMap则是异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。
2、 值:HashMap可以让你将空值作为一个表的条目的key或value,但是Hashtable是不能放入空值的。HashMap最多只有一个key值为null,但可以有无数多个value值为null。
注意:
1、用作key的对象必须实现hashCode和equals方法。
2、不能保证其中的键值对的顺序
3、尽量不要使用可变对象作为它们的key值。
LinkedHashMap:
它的父类是HashMap,使用双向链表来维护键值对的次序,迭代顺序与键值对的插入顺序保持一致。LinkedHashMap需要维护元素的插入顺序,so性能略低于HashMap,但在迭代访问元素时有很好的性能,因为它是以链表来维护内部顺序。
TreeMap:
Map接口派生了一个SortMap子接口,SortMap的实现类为TreeMap。TreeMap也是基于红黑树对所有的key进行排序,有两种排序方式:自然排序和定制排序。Treemap的key以TreeSet的形式存储,对key的要求与TreeSet对元素的要求基本一致。
1、Map.Entry firstEntry():返回最小key所对应的键值对,如Map为空,则返回null。
2、Object firstKey():返回最小key,如果为空,则返回null。
3、Map.Entry lastEntry():返回最大key所对应的键值对,如Map为空,则返回null。
4、Object lastKey():返回最大key,如果为空,则返回null。
5、Map.Entry higherEntry(Object key):返回位于key后一位的键值对,如果为空,则返回null。
6、Map.Entry lowerEntry(Object key):返回位于key前一位的键值对,如果为空,则返回null。
7、Object lowerKey(Object key):返回位于key前一位key值,如果为空,则返回null。
8、NavigableMap subMap(Object fromKey,boolean fromlnclusive,Object toKey,boolean toInciusive):返回该Map的子Map,其key范围从fromKey到toKey。
9、SortMap subMap(Object fromKey,Object toKey );返回该Map的子Map,其key范围从fromkey(包括)到tokey(不包括)。
10、SortMap tailMap(Object fromkey ,boolean inclusive):返回该Map的子Map,其key范围大于fromkey(是否包括取决于第二个参数)的所有key。
11、 SortMap headMap(Object tokey ,boolean inclusive):返回该Map的子Map,其key范围小于tokey(是否包括取决于第二个参数)的所有key。
WeakHashMap:
WeakHashMap与HashMap的用法基本相同,区别在于:后者的key保留对象的强引用,即只要HashMap对象不被销毁,其对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的键值对对象。但WeakHashMap的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被回收。WeakHashMap中的每个key对象保存了实际对象的弱引用,当回收了该key所对应的实际对象后,WeakHashMap会自动删除该key所对应的键值对。
public static void main(String[] args)
// TODO Auto-generated method stub
WeakHashMap w1=new WeakHashMap();
//添加三个键值对,三个key都是匿名字符串,没有其他引用
w1 .put("语文", "良好");
w1 .put("数学", "及格");
w1 .put("英语", "中等");
w1 .put("java", "good");//该key是一个系统缓存的字符串对象
Java中几种office文档转pdf的方式
最近公司要做office的文档,搜集了几种office文档转pdf的方式,简单的做下总结
我主要尝试了三种方式:openoffice,aspose,jacob
对他们进行了大文件,小文件,在linux,在windows,转换txt,excel,word,ppt的测试。
一、aspose:这种方式在目前来看应该是最好的,无论是转换的速度还是成功的概率,还支持的文件类型。
(1)使用:
这种方式使用很简单,引入jar包就可以直接使用
代码:
源码,jar包在最后提供
package aspose; import java.io.*; import javax.servlet.http.HttpServletRequest; import com.aspose.cells.Workbook; import com.aspose.slides.Presentation; import com.aspose.slides.SaveFormat; import com.aspose.words.*; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfWriter; public class AsposeUtil { //校验license private static boolean judgeLicense() { boolean result = false; try { InputStream is = AsposeUtil.class.getClassLoader().getResourceAsStream("license.xml"); License aposeLic = new License(); aposeLic.setLicense(is); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } // 转换 public static void trans(String filePath, String pdfPath, String type) { if (!judgeLicense()) { System.out.println("license错误"); } try { System.out.println("as开始:" + filePath); long old = System.currentTimeMillis(); File file = new File(pdfPath); toPdf(file, filePath, type); long now = System.currentTimeMillis(); System.out.println("完成:" + pdfPath); System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); } catch (Exception e) { e.printStackTrace(); } } private static void toPdf(File file, String filePath, String type) { if ("word".equals(type) || "txt".equals(type)) { wordofpdf(file, filePath); } else if ("excel".equals(type)) { exceOfPdf(file, filePath); } else if ("ppt".equals(type)) { pptofpdf(file, filePath); }else{ System.out.println("暂不支持该类型:"+type); } } private static void wordofpdf(File file, String filePath) { FileOutputStream os = null; Document doc; try { os = new FileOutputStream(file); doc = new Document(filePath); doc.save(os, com.aspose.words.SaveFormat.PDF); } catch (Exception e) { e.printStackTrace(); } finally { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } private static void exceOfPdf(File file, String filePath) { FileOutputStream os = null; try { os = new FileOutputStream(file); Workbook wb = new Workbook(filePath); wb.save(os, com.aspose.cells.SaveFormat.PDF); } catch (Exception e) { e.printStackTrace(); } finally { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } private static void pptofpdf(File file, String filePath) { FileOutputStream os = null; try { os = new FileOutputStream(file); Presentation pres = new Presentation(filePath);// 输入pdf路径 pres.save(os, SaveFormat.Pdf); } catch (Exception e) { e.printStackTrace(); } finally { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } }
测试代码:
这里面每一种类型的文档都至少取了三个,主要是为了测试他们对大文件,小文件的支持,从而能在不同的场景更好的选择使用的方式,在本篇文章的最后会将测试的结果贴上
package openoffice; import aspose.AsposeUtil; /** * @author sonyan * @version 2019年9月25日 下午1:12:21 * @desc */ public class Test { private static void testWord(String path_word, String pafpath) throws Exception { String word1 = path_word + "01正方数字.docx"; String word2 = path_word + "02正方数字.docx"; String word3 = path_word + "03正方数字.doc"; String word4 = path_word + "04正方数字.doc"; String word5 = path_word + "05正方数字.docx"; String word6 = path_word + "06正方数字.doc"; OpenOfficeUtils.toPdf(word1, pafpath + "Open-word-01测试.pdf"); OpenOfficeUtils.toPdf(word2, pafpath + "Open-word-02测试.pdf"); OpenOfficeUtils.toPdf(word3, pafpath + "Open-word-03测试.pdf"); OpenOfficeUtils.toPdf(word4, pafpath + "Open-word-04测试.pdf"); OpenOfficeUtils.toPdf(word5, pafpath + "Open-word-05测试.pdf"); OpenOfficeUtils.toPdf(word6, pafpath + "Open-word-06测试.pdf"); } private static void testWord2(String path_word, String pafpath) throws Exception { String word1 = path_word + "01.docx"; String word2 = path_word + "02.docx"; String word3 = path_word + "03.doc"; String word4 = path_word + "04.doc"; String word5 = path_word + "05.docx"; String word6 = path_word + "06.doc"; OpenOfficeUtils.toPdf(word1, pafpath + "Open-word-01.pdf"); OpenOfficeUtils.toPdf(word2, pafpath + "Open-word-02.pdf"); OpenOfficeUtils.toPdf(word3, pafpath + "Open-word-03.pdf"); OpenOfficeUtils.toPdf(word4, pafpath + "Open-word-04.pdf"); OpenOfficeUtils.toPdf(word5, pafpath + "Open-word-05.pdf"); OpenOfficeUtils.toPdf(word6, pafpath + "Open-word-06.pdf"); } private static void testTxt(String path_word, String pafpath) throws Exception { String txt1 = path_word + "01jvm.txt"; String txt2 = path_word + "02jvm.txt"; String txt3 = path_word + "03jvm.txt"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-txt-01测试.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-txt-02测试.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-txt-03测试.pdf"); } private static void testTxt2(String path_word, String pafpath) throws Exception { String txt1 = path_word + "01jvm.txt"; String txt2 = path_word + "02jvm.txt"; String txt3 = path_word + "03jvm.txt"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-txt-01.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-txt-02.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-txt-03.pdf"); } private static void testExcel(String path_word, String pafpath) throws Exception { String txt1 = path_word + "01部门开发任务管理.xlsx"; String txt2 = path_word + "02部门开发任务管理.xlsx"; String txt3 = path_word + "03部门开发任务管理.xlsx"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-excel-01测试.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-excel-02测试.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-excel-03测试.pdf"); } private static void testExcel2(String path_word, String pafpath) throws Exception { String txt1 = path_word + "01.xlsx"; String txt2 = path_word + "02.xlsx"; String txt3 = path_word + "03.xlsx"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-excel-01.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-excel-02.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-excel-03.pdf"); } private static void testPPt(String path_ppt, String pafpath) throws Exception { String txt1 = path_ppt + "01jquery培训.pptx"; String txt2 = path_ppt + "02jquery培训.pptx"; String txt3 = path_ppt + "03jquery培训.ppt"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-ppt-01测试.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-ppt-02测试.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-ppt-03测试.pdf"); } private static void testPPt2(String path_ppt, String pafpath) throws Exception { String txt1 = path_ppt + "01jquery.pptx"; String txt2 = path_ppt + "02jquery.pptx"; String txt3 = path_ppt + "03jquery培训.ppt"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-ppt-01.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-ppt-02.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-ppt-03.pdf"); } public static void LinuxTest() throws Exception { String path_word = "/software/songyan/hah/01word/"; String path_txt = "/software/songyan/hah/02txt/"; String path_excel = "/software/songyan/hah/03excel/"; String path_ppt = "/software/songyan/hah/04ppt/"; String pafpath = "/software/songyan/hah/pdf/"; System.out.println("************************"); testTxt(path_txt, pafpath); System.out.println("************************"); testExcel(path_excel, pafpath); System.out.println("************************"); testPPt(path_ppt, pafpath); System.out.println("************************"); testWord(path_word, pafpath); } public static void LinuxTest2() throws Exception { String path_word = "/software/songyan/hah/01word/"; String path_txt = "/software/songyan/hah/02txt/"; String path_excel = "/software/songyan/hah/03excel/"; String path_ppt = "/software/songyan/hah/04ppt/"; String pafpath = "/software/songyan/hah/pdf/"; System.out.println("************************"); testTxt2(path_txt, pafpath); System.out.println("************************"); testExcel2(path_excel, pafpath); System.out.println("************************"); testPPt2(path_ppt, pafpath); System.out.println("************************"); testWord2(path_word, pafpath); } public static void winTest() throws Exception { String path_word = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/转换前文档/01word/"; String path_txt = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/转换前文档/02txt/"; String path_excel = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/转换前文档/03excel/"; String path_ppt = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/转换前文档/04ppt/"; String pafpath = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/pdf/"; System.out.println("************************"); testWord(path_word, pafpath); System.out.println("************************"); testTxt(path_txt, pafpath); System.out.println("************************"); testExcel(path_excel, pafpath); System.out.println("************************"); testPPt(path_ppt, pafpath); } public static void main(String[] args) throws Exception { winTest(); } }
(2)初次使用遇到的问题:
1)我在这种方式的初次尝试中走的最大的一个坑就是:jar包的引入
上面这三个分别是转换word/txt,excel,ppt的关键代码,在网上找的很多代码可能都是对一种方式的转换,所以SaveFormat也就不会加上包名,所以我在开始就以为是同一个类,怎么调试都不对,最后也是不记得看了哪个博友的博客才注意到这,一定要加上包名,这三个不同包下的类来自三个不同的jar包
2)还有一个很大的坑就是在linux系统上部署测试的时候报了下面的错
这个问题就查到了一个结果,官方给出的解释是:
也就是缺少jar包,可是我检查后发现jar包引入的也没有错误,在第二天找同事帮忙的时候发现,同样的war包使用他的工具可以正常执行转换
很不可思议,我们是在同一台服务器上上传的相同的war包,不一样的就是使用的工具不一样,我用的xshell,他用的sshClient。
我有又测试了一下,第一次访问的时候都会有这个提示
要求安装xmanager,然后就试了试,安装之后果然就可以了,原因现在也没搞明白,,知道的留言吧(我们经理说可能是依赖xmanager里面的包,只是一种猜测)
3)还有个小问题就是:在linux上使用的时候需要安装字体,不安装会中文乱码,这里不细说,百度很多,操作很简单
4)在测试的过程中有个ppt文件转换失败,目前还没有找到原因,转换失败的文件在最后也会提供在网盘中。。
5)这种方式不支持中文路径,如果转换的文件里面有中文,就会报文件找不到的错误
二,openoffice方式:这种方式在转小文件的时候还是很好用的,在调研的过程中也发现不少公司在实际开发中就是使用的这种方式,我们公司在之前也是用的这种,但是在文件太大的时候转换的时间就会特别的慢,几十分钟的那种。而且这种方式需要依赖openoffice
(1)代码
注:这种方式需要安装openoffice,使用前需要开启openoffice,在转换大文件的时候速度特别的慢。
使用步骤
(1)安装openoffice
(2)开启openoffice
(3)调用代码
package openoffice; import java.io.File; import java.net.ConnectException; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter; public class OpenOfficeUtils { static final String host = "192.168.11.3";//openoffice服务地址 static final int post = 8100;//openoffice端口号 //计时 public static void toPdf(String filePath, String pdfPath) { try { long old = System.currentTimeMillis(); System.out.println("open-开始:" + filePath); File wordFile = new File(filePath); File PDFFile = new File(pdfPath); OpenOfficeConnection connection = new SocketOpenOfficeConnection(host, post); try { connection.connect(); DocumentConverter converter = getConverter(host, connection); converter.convert(wordFile, PDFFile); long now = System.currentTimeMillis(); System.out.println("open-完成:" + filePath); System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); } catch (ConnectException e) { System.out.println("获取OpenOffice连接失败..."); e.printStackTrace(); } finally{ connection.disconnect(); } } catch (Exception e) { System.out.println("转换失败:"+filePath); e.printStackTrace(); } } private static DocumentConverter getConverter(String connectIp, OpenOfficeConnection connection) { DocumentConverter converter = "localhost".equals(connectIp) || "127.0.0.1".equals(connectIp) || "0:0:0:0:0:0:0:1".equals(connectIp) ? new OpenOfficeDocumentConverter(connection) : new StreamOpenOfficeDocumentConverter(connection); return converter; } }
测试:
package openoffice; import aspose.AsposeUtil; /** * @author sonyan * @version 2019年9月25日 下午1:12:21 * @desc */ public class Test { private static void testWord(String path_word, String pafpath) throws Exception { String word1 = path_word + "01正方数字.docx"; String word2 = path_word + "02正方数字.docx"; String word3 = path_word + "03正方数字.doc"; String word4 = path_word + "04正方数字.doc"; String word5 = path_word + "05正方数字.docx"; String word6 = path_word + "06正方数字.doc"; OpenOfficeUtils.toPdf(word1, pafpath + "Open-word-01测试.pdf"); OpenOfficeUtils.toPdf(word2, pafpath + "Open-word-02测试.pdf"); OpenOfficeUtils.toPdf(word3, pafpath + "Open-word-03测试.pdf"); OpenOfficeUtils.toPdf(word4, pafpath + "Open-word-04测试.pdf"); OpenOfficeUtils.toPdf(word5, pafpath + "Open-word-05测试.pdf"); OpenOfficeUtils.toPdf(word6, pafpath + "Open-word-06测试.pdf"); } private static void testWord2(String path_word, String pafpath) throws Exception { String word1 = path_word + "01.docx"; String word2 = path_word + "02.docx"; String word3 = path_word + "03.doc"; String word4 = path_word + "04.doc"; String word5 = path_word + "05.docx"; String word6 = path_word + "06.doc"; OpenOfficeUtils.toPdf(word1, pafpath + "Open-word-01.pdf"); OpenOfficeUtils.toPdf(word2, pafpath + "Open-word-02.pdf"); OpenOfficeUtils.toPdf(word3, pafpath + "Open-word-03.pdf"); OpenOfficeUtils.toPdf(word4, pafpath + "Open-word-04.pdf"); OpenOfficeUtils.toPdf(word5, pafpath + "Open-word-05.pdf"); OpenOfficeUtils.toPdf(word6, pafpath + "Open-word-06.pdf"); } private static void testTxt(String path_word, String pafpath) throws Exception { String txt1 = path_word + "01jvm.txt"; String txt2 = path_word + "02jvm.txt"; String txt3 = path_word + "03jvm.txt"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-txt-01测试.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-txt-02测试.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-txt-03测试.pdf"); } private static void testTxt2(String path_word, String pafpath) throws Exception { String txt1 = path_word + "01jvm.txt"; String txt2 = path_word + "02jvm.txt"; String txt3 = path_word + "03jvm.txt"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-txt-01.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-txt-02.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-txt-03.pdf"); } private static void testExcel(String path_word, String pafpath) throws Exception { String txt1 = path_word + "01部门开发任务管理.xlsx"; String txt2 = path_word + "02部门开发任务管理.xlsx"; String txt3 = path_word + "03部门开发任务管理.xlsx"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-excel-01测试.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-excel-02测试.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-excel-03测试.pdf"); } private static void testExcel2(String path_word, String pafpath) throws Exception { String txt1 = path_word + "01.xlsx"; String txt2 = path_word + "02.xlsx"; String txt3 = path_word + "03.xlsx"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-excel-01.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-excel-02.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-excel-03.pdf"); } private static void testPPt(String path_ppt, String pafpath) throws Exception { String txt1 = path_ppt + "01jquery培训.pptx"; String txt2 = path_ppt + "02jquery培训.pptx"; String txt3 = path_ppt + "03jquery培训.ppt"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-ppt-01测试.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-ppt-02测试.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-ppt-03测试.pdf"); } private static void testPPt2(String path_ppt, String pafpath) throws Exception { String txt1 = path_ppt + "01jquery.pptx"; String txt2 = path_ppt + "02jquery.pptx"; String txt3 = path_ppt + "03jquery培训.ppt"; OpenOfficeUtils.toPdf(txt1, pafpath + "Open-ppt-01.pdf"); OpenOfficeUtils.toPdf(txt2, pafpath + "Open-ppt-02.pdf"); OpenOfficeUtils.toPdf(txt3, pafpath + "Open-ppt-03.pdf"); } public static void LinuxTest() throws Exception { String path_word = "/software/songyan/hah/01word/"; String path_txt = "/software/songyan/hah/02txt/"; String path_excel = "/software/songyan/hah/03excel/"; String path_ppt = "/software/songyan/hah/04ppt/"; String pafpath = "/software/songyan/hah/pdf/"; System.out.println("************************"); testTxt(path_txt, pafpath); System.out.println("************************"); testExcel(path_excel, pafpath); System.out.println("************************"); testPPt(path_ppt, pafpath); System.out.println("************************"); testWord(path_word, pafpath); } public static void LinuxTest2() throws Exception { String path_word = "/software/songyan/hah/01word/"; String path_txt = "/software/songyan/hah/02txt/"; String path_excel = "/software/songyan/hah/03excel/"; String path_ppt = "/software/songyan/hah/04ppt/"; String pafpath = "/software/songyan/hah/pdf/"; System.out.println("************************"); testTxt2(path_txt, pafpath); System.out.println("************************"); testExcel2(path_excel, pafpath); System.out.println("************************"); testPPt2(path_ppt, pafpath); System.out.println("************************"); testWord2(path_word, pafpath); } public static void winTest() throws Exception { String path_word = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/转换前文档/01word/"; String path_txt = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/转换前文档/02txt/"; String path_excel = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/转换前文档/03excel/"; String path_ppt = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/转换前文档/04ppt/"; String pafpath = "C:/Users/Administrator.DESKTOP-QN9A3AA/Desktop/office/测试文档/pdf/"; System.out.println("************************"); testWord(path_word, pafpath); System.out.println("************************"); testTxt(path_txt, pafpath); System.out.println("************************"); testExcel(path_excel, pafpath); System.out.println("************************"); testPPt(path_ppt, pafpath); } public static void main(String[] args) throws Exception { winTest(); } }
(2)首次使用遇到的坑
1)看下面的代码,需要提供的openoffice服务器的安装地址以及端口号,需要注ip(有的需要写内网的ip,有的需要写成127.0.0.1,也有的需要写成localhost),具体写成什么形式根据电脑中一个文件的配置,具体的自行百度
2)开启openoffice服务,如果在转换的过程中强制性杀进程,在连接会出现连接拒绝的问题(我在windows上启动的openoffice,使用linux连接时,有一次连接成功,可以正常的转换,但是当时强制性的杀掉了进程,之后再重启,重装都会连接失败,而且linux尝试连接后,本机再去请求连接也会被拒绝,具体的原因还没找到,这种方式被很多公司正式的使用,应该有解决方案),最后是在linux服务器安装了openoffice,在linux也连接自己的服务完成的测试
三、第三种方式是jacob:这种方式使用起来很方便,把dll文件放到jre的bin目录,引入jar包就可以使用,但是它只支持windows系统,而且转换的速度相对aspose方式来讲要慢一些,对于在部署在windows上,对转换速度要求不高的可以使用这种方式。
(1)代码:
1.下载jacob.jar,将jacob.jar导入程序中,把对应的jcob.dll拷贝到system32/SysWOW64目录下,同时也拷贝到对应的jre的bin目录下。
2.编写转换代码
package jacob; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class JacobUtil { //计时 public static void trans(String filePath, String pdfPath,String type) { try { long old = System.currentTimeMillis(); System.out.println("jav-转换开始:" + filePath); toPdf(filePath,pdfPath, type); System.out.println("完成:" + pdfPath); long now = System.currentTimeMillis(); System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒"); } catch (Exception e) { System.out.println("转换失败:" + filePath); e.printStackTrace(); } } //转换 private static void toPdf(String filePath, String pdfPath,String type) { if("word".equals(type)){ word2PDF(filePath,pdfPath); }else if("excel".equals(type)){ excel2PDF(filePath,pdfPath); }else if("ppt".equals(type)){ ppt2PDF(filePath,pdfPath); } } private static void word2PDF(String inputFile, String pdfFile) { ActiveXComponent app = new ActiveXComponent("Word.Application"); try { app.setProperty("Visible", false); Dispatch docs = app.getProperty("Documents").toDispatch(); Dispatch doc = Dispatch.call(docs, "Open", new Object[]{inputFile, false, true}).toDispatch(); Dispatch.call(doc, "ExportAsFixedFormat", new Object[]{pdfFile, 17}); Dispatch.call(doc, "Close", new Object[]{false}); } catch (Exception e) { e.printStackTrace(); System.out.println("转换出错:"+pdfFile); }finally { app.invoke("Quit"); } } private static void excel2PDF(String inputFile, String pdfFile) { ComThread.InitSTA(true); ActiveXComponent app = new ActiveXComponent("Excel.Application"); try { app.setProperty("Visible", false); app.setProperty("AutomationSecurity", new Variant(3)); Dispatch excels = app.getProperty("Workbooks").toDispatch(); Dispatch excel = Dispatch.invoke(excels, "Open", 1, new Object[]{inputFile, new Variant(false), new Variant(false)}, new int[9]).toDispatch(); Dispatch.invoke(excel, "ExportAsFixedFormat", 1, new Object[]{new Variant(0), pdfFile, new Variant(0)}, new int[1]); Dispatch.call(excel, "Close", new Object[]{false}); if (app != null) { app.invoke("Quit", new Variant[0]); app = null; } ComThread.Release(); } catch (Exception e) { e.printStackTrace(); System.out.println("转换出错:"+pdfFile); }finally { app.invoke("Quit"); } } private static void ppt2PDF(String inputFile, String pdfFile) { ActiveXComponent app = new ActiveXComponent("PowerPoint.Application"); try { Dispatch ppts = app.getProperty("Presentations").toDispatch(); Dispatch ppt = Dispatch.call(ppts, "Open", new Object[]{inputFile, true, true, false}).toDispatch(); Dispatch.call(ppt, "SaveAs", new Object[]{pdfFile, 32}); Dispatch.call(ppt, "Close"); app.invoke("Quit"); } catch (Exception e) { e.printStackTrace(); System.out.println("转换出错:"+inputFile); }finally { app.invoke("Quit"); } } }
测试:
package jacob; /** * @author sonyan * @version 2019年9月25日 下午1:12:21 * @desc */ public class Test { private static void testWord(String path_word, String pdfPath) throws Exception { String word1 = path_word + "01正方数字.docx"; String word2 = path_word + "02正方数字.docx"; String word3 = path_word + "03正方数字.doc"; String word4 = path_word + "04正方数字.doc"; String word5 = path_word + "05正方数字.docx"; String word6 = path_word + "06正方数字.doc"; JacobUtil.trans(word1, pdfPath + "jac-word-01测试.pdf", "word"); JacobUtil.trans(word2, pdfPath + "jac-word-02测试.pdf", "word"); JacobUtil.trans(word3, pdfPath + "jac-word-03测试.pdf", "word"); JacobUtil.trans(word4, pdfPath + "jac-word-04测试.pdf", "word"); JacobUtil.trans(word5, pdfPath + "jac-word-05测试.pdf", "word"); JacobUtil.trans(word6, pdfPath + "jac-word-06测试.pdf", "word"); } private static void testWord1(String path_word, String pdfPath) throws Exception { String word1 = p以上是关于java中几种Map在啥情况下使用?的主要内容,如果未能解决你的问题,请参考以下文章