FileSystem.get()方法解析

整体过程

  1. 根据URI获取scheme信息;
  2. 通过scheme判断是否使用缓存;
  3. 如果不用缓存,则直接创建FileSystem;否则从缓存中获取;

FileSystem创建过程

  1. 首次使用时,通过ServiceLoader方法将FileSystem所有实现类加载到内存,并缓存所有的class对象;
  2. 每次通过scheme获取文件系统对应的class对象,实例化和初始化;
private static FileSystem createFileSystem(URI uri, Configuration conf
      ) throws IOException {
    Class<?> clazz = getFileSystemClass(uri.getScheme(), conf);
    FileSystem fs = (FileSystem)ReflectionUtils.newInstance(clazz, conf);
    fs.initialize(uri, conf);
    return fs;
  }

从缓存获取FileSystem过程

  1. 根据url和conf创建key;
  2. 如果缓存中存在key,则直接返回FileSystem;否则,创建FileSystem,加入缓存并返回;
FileSystem get(URI uri, Configuration conf) throws IOException{
      Key key = new Key(uri, conf);
      return getInternal(uri, conf, key);
    }

ServiceLoader加载的 FileSystem实现类

在这里插入图片描述

get()注意事项

 使用get()方法获取FileSystem实例时,每个请求都会生成一个key,如果参数中没有传入用户名和密码,则每次使用同一个UserGroupInformation实例,key的hashcode相同,返回同一个FileSystem实例;反之,如果传入用户相关的参数,导致每个请求都会创建新的UserGroupInformation实例,从而key的hashcode不同,进而创建新的FileSystem实例,缓存并返回;(蛋疼的逻辑)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

实验说明

 传入user信息时,相同配置的两次请求,产生不同的FileSystem实例,如下图:
在这里插入图片描述
 没有传入user信息时,相同配置的两次请求,返回相同的FileSystem实例,如下图:
在这里插入图片描述

参考:

  1. https://stackoverflow.com/questions/20057881/hadoop-filesystem-closed-exception-when-doing-bufferedreader-close
### 回答1: 要使用Java解析Word文件中的表格,可以使用Apache POI和Apache Tika库。 以下是一些基本步骤: 1. 导入Apache POI和Apache Tika库。 ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.0.0</version> </dependency> ``` 2. 使用Tika解析Word文件。 ``` FileInputStream inputStream = new FileInputStream(new File("file.docx")); Parser parser = new AutoDetectParser(); ContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); parser.parse(inputStream, handler, metadata); String content = handler.toString(); ``` 3. 使用POI解析表格。 ``` XWPFDocument doc = new XWPFDocument(new FileInputStream("file.docx")); List<XWPFTable> tables = doc.getTables(); for (XWPFTable table : tables) { // 处理表格数据 for (XWPFTableRow row : table.getRows()) { List<XWPFTableCell> cells = row.getTableCells(); for (XWPFTableCell cell : cells) { // 处理单元格数据 System.out.print(cell.getText() + "\t"); } System.out.println(); } } ``` 这些步骤可以帮助您开始解析Word文件中的表格。您可以根据自己的需求进行调整和扩展。 ### 回答2: 用Java解析Word文件中的表格可以使用Apache POI库来实现。Apache POI是一个开源的Java API库,提供了访问和操作Microsoft Office格式文件(如Word、Excel和PowerPoint)的功能。 首先需要导入Apache POI库的相关jar包,然后可以使用以下步骤来解析Word文件中的表格: 1. 创建一个Word文档对象,使用POIFSFileSystem类加载Word文件: ``` FileInputStream fis = new FileInputStream("path/to/word.doc"); POIFSFileSystem fileSystem = new POIFSFileSystem(fis); HWPFDocument document = new HWPFDocument(fileSystem); ``` 2. 获取文档的表格数量和表格内容: ``` Range range = document.getRange(); int tableCount = range.numTables(); for (int i = 0; i < tableCount; i++) { Table table = range.getTable(i); int rowCount = table.numRows(); for (int j = 0; j < rowCount; j++) { TableRow row = table.getRow(j); int cellCount = row.numCells(); for (int k = 0; k < cellCount; k++) { TableCell cell = row.getCell(k); String cellText = cell.text(); // 可以在这里对表格中的内容进行处理或输出 } } } ``` 3. 解析完表格后,记得关闭文件流: ``` document.close(); fis.close(); ``` 通过上述步骤,我们可以使用Java解析Word文件中的表格内容,并对表格内容进行处理或其他操作。请注意,以上代码仅适用于旧版的Word文档(.doc格式),如果是新版的Word文档(.docx格式),可以使用XWPFDocument类来解析。希望可以帮助到你! ### 回答3: 要用Java解析Word文件中的表格,可以使用Apache POI库来处理。Apache POI是一个开源的Java库,用于访问和操作各种Office文档,包括Word文件。 首先,需要引入Apache POI的相关依赖包,例如poi、poi-ooxml和poi-ooxml-schemas。然后,可以通过XWPFDocument类加载Word文件,并使用XWPFTable类来获取表格。 以下是一个简单的代码示例,演示如何解析Word文件中的表格: ```java import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFTable; import java.io.FileInputStream; import java.io.IOException; public class WordTableParser { public static void main(String[] args) { try { FileInputStream file = new FileInputStream("word.docx"); // Word文件的路径 XWPFDocument document = new XWPFDocument(file); // 获取文档中的所有表格 for (XWPFTable table : document.getTables()) { // 解析表格数据 for (int i = 0; i < table.getRows().size(); i++) { for (int j = 0; j < table.getRow(i).getTableCells().size(); j++) { String cellText = table.getRow(i).getCell(j).getText(); System.out.print(cellText + "\t"); } System.out.println(); } } document.close(); file.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例中,首先使用 FileInputStream 来读取Word文件,然后使用 XWPFDocument 加载文件。然后,使用 document.getTables() 方法获取文档中的所有表格,并使用嵌套循环遍历每个单元格获取表格中的数据。 这只是一个简单的示例,实际的需求可能会更加复杂,例如处理合并单元格、设置表格样式等。但通过这个示例可以了解如何使用Java解析Word文件中的表格。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值