• java对一些文件格式的操作(读写)



     


     

    正文:

    文件格式一般可分为:①文档格式、②图片格式、③视频格式、④声音格式、⑤系统格式。

    具体如下:

    一、文档格式有:TXT、DOC、DOCX、XLS、PPT、XLSX、PPTX 等。

    二、图片格式有:JPG、PNG、PDF、TIFF、SWF等。

    三、视频格式有:FLV、RMVB、MP4、MVB等。

    四、声音格式有:WMA、MP3等。

    五、系统格式有:RAR、EXE等。

    这里只讨论前2种。


    (1).操作TXT

    1. package com.chunbaosheng.demo;
    2. import java.io.*;
    3. public class TestOne {
    4. //使用FileInputStream实现读取txt文件内容:
    5. //使用FileOutputStream实现写入txt文件内容:
    6. /**传入txt路径读取txt文件
    7. * @param txtPath
    8. * @return 返回读取到的内容
    9. */
    10. public static String readTxt(String txtPath) {
    11. File file = new File(txtPath);
    12. if (file.isFile() && file.exists()) {
    13. try {
    14. FileInputStream fileInputStream = new FileInputStream(file);
    15. InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
    16. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    17. StringBuffer sb = new StringBuffer();
    18. String text = null;
    19. while ((text = bufferedReader.readLine()) != null) {
    20. sb.append(text);
    21. }
    22. return sb.toString();
    23. } catch (Exception e) {
    24. e.printStackTrace();
    25. }
    26. }
    27. return null;
    28. }
    29. /**使用FileOutputStream来写入txt文件
    30. * @param txtPath txt文件路径
    31. * @param content 需要写入的文本
    32. */
    33. public static void writeTxt(String txtPath,String content){
    34. FileOutputStream fileOutputStream = null;
    35. File file = new File(txtPath);
    36. try {
    37. if(file.exists()){
    38. //判断文件是否存在,如果不存在就新建一个txt
    39. file.createNewFile();
    40. }
    41. fileOutputStream = new FileOutputStream(file);
    42. fileOutputStream.write(content.getBytes());
    43. fileOutputStream.flush();
    44. fileOutputStream.close();
    45. } catch (Exception e) {
    46. e.printStackTrace();
    47. }
    48. }
    49. //验证方法:先写入文件后读取打印如下:
    50. public static void main(String[] args) {
    51. writeTxt("C:\\Users\\Administrator\\Desktop\\1\\result1.txt", "测试写入txt文件内容");
    52. String str = readTxt("C:\\Users\\Administrator\\Desktop\\1\\result1.txt");
    53. System.out.println(str);
    54. }
    55. }

    (2).操作Doc/Docx 文档

    1. <dependency>
    2. <groupId>org.apache.poigroupId>
    3. <artifactId>poi-scratchpadartifactId>
    4. <version>3.14version>
    5. dependency>
    6. <dependency>
    7. <groupId>commons-iogroupId>
    8. <artifactId>commons-ioartifactId>
    9. <version>2.6version>
    10. dependency>
    11. <dependency>
    12. <groupId>org.apache.poigroupId>
    13. <artifactId>poi-ooxmlartifactId>
    14. <version>3.14version>
    15. dependency>

    读:

    1. package com.chunbaosheng.demo;
    2. import org.apache.poi.POIXMLDocument;
    3. import org.apache.poi.POIXMLTextExtractor;
    4. import org.apache.poi.hwpf.extractor.WordExtractor;
    5. import org.apache.poi.openxml4j.opc.OPCPackage;
    6. import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
    7. import java.io.File;
    8. import java.io.FileInputStream;
    9. import java.io.InputStream;
    10. import java.util.ArrayList;
    11. import java.util.List;
    12. public class TestTwo {
    13. /**
    14. * @Description: POI 读取 word
    15. * @update logs
    16. * @throws Exception
    17. */
    18. public static List readWord(String filePath) throws Exception{
    19. List linList = new ArrayList();
    20. String buffer = "";
    21. try {
    22. if (filePath.endsWith(".doc")) {
    23. InputStream is = new FileInputStream(new File(filePath));
    24. WordExtractor ex = new WordExtractor(is);
    25. buffer = ex.getText();
    26. is.close();
    27. if(buffer.length() > 0){
    28. //使用回车换行符分割字符串
    29. String [] arry = buffer.split("\\r\\n");
    30. for (String string : arry) {
    31. linList.add(string.trim());
    32. }
    33. }
    34. } else if (filePath.endsWith(".docx")) {
    35. System.out.println("读取docx");
    36. OPCPackage opcPackage = POIXMLDocument.openPackage(filePath);
    37. POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
    38. buffer = extractor.getText();
    39. extractor.close();
    40. if(buffer.length() > 0){
    41. //使用换行符分割字符串
    42. String [] arry = buffer.split("\\n");
    43. for (String string : arry) {
    44. System.out.println(string);
    45. linList.add(string.trim());
    46. }
    47. }
    48. } else {
    49. return null;
    50. }
    51. return linList;
    52. } catch (Exception e) {
    53. System.out.print("error---->"+filePath);
    54. e.printStackTrace();
    55. return null;
    56. }
    57. }
    58. public static void main(String[] args)throws Exception {
    59. System.out.println(readWord("C:\\Users\\Administrator\\Desktop\\1\\Java面试宝典.docx"));
    60. }
    61. }

    写:

    1. package com.chunbaosheng.demo;
    2. import org.apache.poi.hwpf.HWPFDocument;
    3. import java.io.*;
    4. public class WriteDoc {
    5. public static void testWrite() throws Exception {
    6. String templatePath = "C:\\Users\\Administrator\\Desktop\\1\\template.doc";
    7. InputStream is = new FileInputStream(templatePath);
    8. OutputStream os = null;
    9. HWPFDocument doc = new HWPFDocument(is);
    10. os = new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\1\\template1.doc"));
    11. //把doc输出到输出流中
    12. doc.write(os);
    13. os.close();
    14. // is.close();
    15. }
    16. public static void main(String[] args) throws Exception{
    17. testWrite();
    18. }
    19. }

    操作:XLS,XLSX

    1. <dependency>
    2. <groupId>com.alibabagroupId>
    3. <artifactId>easyexcelartifactId>
    4. <version>2.2.3version>
    5. dependency>

    写:

    1. // 根据user模板构建数据
    2. private List getUserData() {
    3. List users = new ArrayList<>();
    4. for (int i = 1; i <= 10; i++) {
    5. User user = User.builder()
    6. .userId(i)
    7. .userName("admin" + i)
    8. .gender(i % 2 == 0 ? "男" : "女")
    9. .salary(i * 1000.00)
    10. .hireDate(new Date())
    11. .build();
    12. users.add(user);
    13. }
    14. return users;
    15. }
    16. @Test
    17. public void testWriteExcel() {
    18. String filename = "D:\\study\\excel\\user1.xlsx";
    19. // 向Excel中写入数据 也可以通过 head(Class) 指定数据模板
    20. EasyExcel.write(filename, User.class)
    21. .sheet("用户信息")
    22. .doWrite(getUserData());
    23. }

    读:

    1. @Test
    2. public void testReadExcel() {
    3. // 读取的excel文件路径
    4. String filename = "D:\\study\\excel\\read.xlsx";
    5. // 读取excel
    6. EasyExcel.read(filename, DemoData.class, new AnalysisEventListener() {
    7. // 每解析一行数据,该方法会被调用一次
    8. @Override
    9. public void invoke(DemoData demoData, AnalysisContext analysisContext) {
    10. System.out.println("解析数据为:" + demoData.toString());
    11. }
    12. // 全部解析完成被调用
    13. @Override
    14. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    15. System.out.println("解析完成...");
    16. // 可以将解析的数据保存到数据库
    17. }
    18. }).sheet().doRead();
    19. }
    20. //读excel的方式二代码
    21. @Test
    22. public void testReadExcel2() {
    23. // 读取的excel文件路径
    24. String filename = "D:\\study\\excel\\read.xlsx";
    25. // 创建一个数据格式来装读取到的数据
    26. Class head = DemoData.class;
    27. // 创建ExcelReader对象
    28. ExcelReader excelReader = EasyExcel.read(filename, head, new AnalysisEventListener() {
    29. // 每解析一行数据,该方法会被调用一次
    30. @Override
    31. public void invoke(DemoData demoData, AnalysisContext analysisContext) {
    32. System.out.println("解析数据为:" + demoData.toString());
    33. }
    34. // 全部解析完成被调用
    35. @Override
    36. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    37. System.out.println("解析完成...");
    38. // 可以将解析的数据保存到数据库
    39. }
    40. }).build();
    41. // 创建sheet对象,并读取Excel的第一个sheet(下标从0开始), 也可以根据sheet名称获取
    42. ReadSheet sheet = EasyExcel.readSheet(0).build();
    43. // 读取sheet表格数据, 参数是可变参数,可以读取多个sheet
    44. excelReader.read(sheet);
    45. // 需要自己关闭流操作,在读取文件时会创建临时文件,如果不关闭,会损耗磁盘,严重的磁盘爆掉
    46. excelReader.finish();
    47. }

    操作 PPT、PPTX 

    1. //Java基于POI对PPT的基本操作
    2. // 在Java中对PPT文件进行操作的话,我使用的是Apache的开源项目POI。该项目的功能主要是使用
    3. //Java开发或生成微软办公文件,比如:Word、Excel、PPT、Visio等。其中实现对PPT文件进行操作的类包
    4. //主要是HSLF(.ppt)和XSLF(.pptx),在本文中,会以XSLF为主。
    5. //创建PPT文件,并生成空白幻灯片
    6. package com.jointstarc.test;
    7. import java.io.FileOutputStream;
    8. import java.io.IOException;
    9. import org.apache.poi.xslf.usermodel.XMLSlideShow;
    10. import org.apache.poi.xslf.usermodel.XSLFSlide;
    11. public class Demo1 {
    12. public static void main(String[] args) {
    13. // 创建一个空白PPT
    14. XMLSlideShow ppt = new XMLSlideShow();
    15. // 在空白的PPT中创建一个空白的幻灯片
    16. XSLFSlide slide = ppt.createSlide();
    17. try {
    18. // 对新建的PPT保存到硬盘里
    19. ppt.write(new FileOutputStream("D://test3.pptx"));
    20. } catch (Exception e) {
    21. e.printStackTrace();
    22. } finally {
    23. if (ppt != null) {
    24. try {
    25. // 保存完之后要对PPT进行关闭操作
    26. ppt.close();
    27. } catch (IOException e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. }
    32. }
    33. }
    1. //添加文本框和超链接
    2. /*
    3. * 在空幻灯片中插入一个文本框,然后在文本框中写入文字,
    4. * 并给文字添加一个超链接
    5. */
    6. // 在幻灯片中插入一个文本框
    7. XSLFTextShape ts = slide.createTextBox();
    8. // 设置文本框的位置和文本框大小
    9. ts.setAnchor(new Rectangle(150, 150, 200, 50));
    10. // 设置文本框里面的文字
    11. XSLFTextRun tr = ts.addNewTextParagraph().addNewTextRun();
    12. tr.setText("测试一下");
    13. // 给文本添加颜色
    14. tr.setFontColor(Color.RED);
    15. // 给文本添加超链接
    16. XSLFHyperlink link = tr.createHyperlink();
    17. link.setAddress("http://www.baidu.com");

    添加表格

    1. /*
    2. * 在幻灯片中添加表格
    3. */
    4. // 在幻灯片中插入一个表格
    5. XSLFTable table = slide1.createTable();
    6. // 设置表格的位置和表格大小
    7. table.setAnchor(new Rectangle(50, 100, 100, 100));
    8. for (int i = 0; i < 5; i++) {
    9. // 在表格中添加一行
    10. XSLFTableRow row = table.addRow();
    11. for (int j = 0; j < 5; j++) {
    12. // 在行中添加一个单元格
    13. XSLFTableCell cell = row.addCell();
    14. // 设置单元格中的内容和样式
    15. XSLFTextParagraph p = cell.addNewTextParagraph();
    16. p.setTextAlign(TextAlign.CENTER);
    17. XSLFTextRun tr1 = p.addNewTextRun();
    18. tr1.setFontColor(Color.RED);
    19. tr1.setText("测试" + i + j);
    20. // 设置单元格边框的粗细
    21. cell.setBorderWidth(BorderEdge.bottom, 2.0);
    22. cell.setBorderWidth(BorderEdge.left, 2.0);
    23. cell.setBorderWidth(BorderEdge.right, 2.0);
    24. cell.setBorderWidth(BorderEdge.top, 2.0);
    25. // 设置单元格边框的颜色
    26. cell.setBorderColor(BorderEdge.bottom, Color.black);
    27. cell.setBorderColor(BorderEdge.left, Color.black);
    28. cell.setBorderColor(BorderEdge.right, Color.black);
    29. cell.setBorderColor(BorderEdge.top, Color.black);
    30. }
    31. }

    添加图片

    1. /*
    2. * 在幻灯片中插入一张图片
    3. */
    4. // 图片文件
    5. File image = new File("D://111.jpg");
    6. // 图片文件输入流
    7. FileInputStream imageFis = new FileInputStream(image);
    8. // 获取图片大小
    9. int len = (int) image.length();
    10. // 创建一个字节数组,数组大小与图片文件大小一致
    11. byte[] imageData = new byte[len];
    12. // 将图片数据读进字节数组中
    13. imageFis.read(imageData);
    14. // 将图片添加到PPT中
    15. XSLFPictureData pd = ppt.addPicture(imageData, PictureData.PictureType.JPEG);
    16. // 将图片放到指定的幻灯片中
    17. XSLFPictureShape pic = slide2.createPicture(pd);
    18. // 设置图片框的放置的位置和大小
    19. pic.setAnchor(new Rectangle(50, 100, 200, 200));

    读取现有的PPT文件,并在已有的幻灯片后添加幻灯片

    1. package com.jointstarc.test;
    2. import java.io.FileInputStream;
    3. import java.io.FileOutputStream;
    4. import java.io.IOException;
    5. import org.apache.poi.xslf.usermodel.XMLSlideShow;
    6. import org.apache.poi.xslf.usermodel.XSLFSlide;
    7. public class Demo2 {
    8. public static void main(String[] args) {
    9. XMLSlideShow ppt = null;
    10. try {
    11. // 通过输入流读取一个现有的PPT文件,生成PPT类
    12. ppt = new XMLSlideShow(new FileInputStream("D://test.pptx"));
    13. // 在现有的PPT文件后面新建一个空白幻灯片
    14. XSLFSlide slide = ppt.createSlide();
    15. // 将修改后的PPT文件回写到硬盘
    16. ppt.write(new FileOutputStream("D://test3.pptx"));
    17. } catch (Exception e) {
    18. e.printStackTrace();
    19. } finally {
    20. if (ppt != null) {
    21. try {
    22. // 保存完之后要对PPT进行关闭操作
    23. ppt.close();
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. }
    27. }
    28. }
    29. }
    30. }

    读取现有的PPT内容,并进行修改

    获取PPT的所有文本框里的文字,并进行更改

    1. /*
    2. * 获取PPT的所有文本框里的文字,并进行更改
    3. */
    4. // 获取PPT中的所有幻灯片
    5. List slides = ppt.getSlides();
    6. // 遍历幻灯片
    7. for (XSLFSlide slide : slides) {
    8. // 获取幻灯片中的所有图形(文本框、表格、图形...)
    9. List shapes = slide.getShapes();
    10. // 遍历图形
    11. for (XSLFShape shape : shapes) {
    12. // 判断该图形类是否是文本框类
    13. if (shape instanceof XSLFTextShape) {
    14. // 将图像类强制装换成文本框类
    15. XSLFTextShape ts = (XSLFTextShape) shape;
    16. // 获取文本框内的文字
    17. String str = ts.getText();
    18. System.out.println(str);
    19. // 若想对文本框内的文字进行更改,还需要进行如下步骤
    20. List textParagraphs = ts.getTextParagraphs();
    21. for (XSLFTextParagraph tp : textParagraphs) {
    22. List textRuns = tp.getTextRuns();
    23. for (XSLFTextRun r : textRuns) {
    24. if ("201809".equals(r.getRawText())) {
    25. // 对匹配到的字符串进行更改
    26. r.setText("2018-09");
    27. // 设置字体颜色
    28. r.setFontColor(Color.RED);
    29. }
    30. }
    31. }
    32. }
    33. }
    34. }

    获取PPT的所有表格里的文字,并进行更改

    1. /*
    2. * 获取PPT的所有表格里的文字,并进行更改
    3. */
    4. // 获取PPT中的所有幻灯片
    5. List slides = ppt.getSlides();
    6. for (XSLFSlide slide : slides) {
    7. // 获取幻灯片中的所有图形(文本框、表格、图形...)
    8. List shapes = slide.getShapes();
    9. for (XSLFShape shape : shapes) {
    10. // 判断该图形类是否是表格类
    11. if (shape instanceof XSLFTable) {
    12. // 将图像类强制装换成表格类
    13. XSLFTable table = (XSLFTable) shape;
    14. // 获取表格中的所有行
    15. List rows = table.getRows();
    16. for (XSLFTableRow tr : rows) {
    17. // 获取行中的所有单元格
    18. List cells = tr.getCells();
    19. for (XSLFTableCell tc : cells) {
    20. // 获取单元格内的文字
    21. String str = tc.getText();
    22. // 若想对表格内的文字进行更改,还需要进行如下步骤
    23. List textParagraphs = tc.getTextParagraphs();
    24. for (XSLFTextParagraph tp : textParagraphs) {
    25. List textRuns = tp.getTextRuns();
    26. for (XSLFTextRun r : textRuns) {
    27. if ("风险指标".equals(r.getRawText())) {
    28. // 对匹配到的字符串进行更改
    29. r.setText("测试修改文字");
    30. // 设置字体颜色
    31. r.setFontColor(Color.RED);
    32. }
    33. }
    34. }
    35. }
    36. }
    37. }
    38. }
    39. }

    获取PPT的所有图片,并进行更改

    1. /*
    2. * 获取PPT的所有图片,并进行更改
    3. */
    4. // 获取PPT中的所有幻灯片
    5. List slides = ppt.getSlides();
    6. for (XSLFSlide slide : slides) {
    7. // 获取幻灯片中的所有图形(文本框、表格、图形...)
    8. List shapes = slide.getShapes();
    9. for (XSLFShape shape : shapes) {
    10. // 判断该图形类是否是图片框类
    11. if (shape instanceof XSLFPictureShape) {
    12. /*
    13. * 获取图片数据
    14. */
    15. // 将图像类强制装换成图片框类
    16. XSLFPictureShape ps = (XSLFPictureShape) shape;
    17. // 获取图片的字节码数据(可以利用输出流将该图片保存到硬盘里)
    18. byte [] pictureData = ps.getPictureData().getData();
    19. /*
    20. * 更改图片
    21. */
    22. // 图片文件
    23. File image = new File("D://222.jpg");
    24. // 图片文件输入流
    25. FileInputStream imageFis = new FileInputStream(image);
    26. // 获取图片大小
    27. int len = (int) image.length();
    28. // 创建一个字节数组,数组大小与图片文件大小一致
    29. byte[] imageData = new byte[len];
    30. if (imageFis.read(imageData) != -1) {
    31. // 更换图片必须图片设置索引,要不不生效
    32. ps.getPictureData().setIndex(1);
    33. ps.getPictureData().setData(imageData);
    34. }
    35. // 关闭输入流
    36. imageFis.close();
    37. }
    38. }
    39. }

    操作图片格式有:JPG、PNG、PDF、TIFF、SWF等。

    1. org.icepdf.os
    2. icepdf-core
    3. 6.1.2
    4. javax.media
    5. jai-core

    Pdf文件转图片方法

    1. import org.apache.pdfbox.pdmodel.PDDocument;
    2. import org.apache.pdfbox.pdmodel.PDPageTree;
    3. import org.apache.pdfbox.rendering.PDFRenderer;
    4. import javax.imageio.ImageIO;
    5. import java.awt.image.BufferedImage;
    6. import java.io.*;
    7. public class PdfToImgOne {
    8. /**
    9. * pdfToImageFile("E:\\pdf\\1.pdf", "E:\\pdf\\img\\");
    10. * @param inputFilePath :Pdf地址:"E:\\pdf\\1.pdf"
    11. * @param outputFilePath :转图片后图片保存地址:"E:\\pdf\\img\\"
    12. * @throws Exception
    13. */
    14. static void pdfToImageFile(String inputFilePath, String outputFilePath) throws Exception {
    15. long currentTimeMillisStart = System.currentTimeMillis();
    16. PDDocument doc = null;
    17. ByteArrayOutputStream os = null;
    18. InputStream stream = null;
    19. OutputStream out = null;
    20. try {
    21. // pdf路径
    22. stream = new FileInputStream(inputFilePath);
    23. // 加载解析PDF文件
    24. doc = PDDocument.load(stream);
    25. PDFRenderer pdfRenderer = new PDFRenderer(doc);
    26. PDPageTree pages = doc.getPages();
    27. int pageCount = pages.getCount();
    28. for (int i = 0; i < pageCount; i++) {
    29. BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 200);
    30. os = new ByteArrayOutputStream();
    31. ImageIO.write(bim, "jpg", os);
    32. byte[] dataList = os.toByteArray();
    33. // jpg文件转出路径
    34. File file = new File(outputFilePath + Integer.valueOf(i + 1) + ".jpg");
    35. if (!file.getParentFile().exists()) {
    36. // 不存在则创建父目录及子文件
    37. file.getParentFile().mkdirs();
    38. file.createNewFile();
    39. }
    40. out = new FileOutputStream(file);
    41. out.write(dataList);
    42. }
    43. } catch (Exception e) {
    44. e.printStackTrace();
    45. throw e;
    46. } finally {
    47. if (doc != null) doc.close();
    48. if (os != null) os.close();
    49. if (stream != null) stream.close();
    50. if (out != null) out.close();
    51. }
    52. long currentTimeMillisEnd = System.currentTimeMillis();
    53. System.out.println("18页的Pdf转换完成耗时:"
    54. +(currentTimeMillisEnd - currentTimeMillisStart)/1000);//18页的Pdf转换完成耗时:6
    55. }
    56. }

  • 相关阅读:
    分页查询(关键词: limit)
    JUL日志
    机器学习基础概念
    Linux文件锁的使用
    最短路相关笔记
    springboot简介
    花了6个月时间完成本科优秀毕业设计,我做了什么?
    元宇宙在南昌起义英雄城吹响了“集结号” | 倪健中共同主席出席江西元宇宙产业发展论坛并发表致辞
    Geogebra 教程之 01 什么是Geogebra,真的可以提高我们数学水平么?
    DPU网络开发SDK——DPDK(十五)
  • 原文地址:https://blog.csdn.net/s_sos0/article/details/126684246