Java11.13

目录

API

java.util.*

set集合

·HashSet:

·LinkedHashSet:

·TreeSet

方法:

Collections

方法:

Lambda表达式(Java8新特性)

Stream

定义:

特点:

创建方式

方法

Map

HashMap:哈希表


API

java.util.*

set集合

无序且不可重复

·HashSet:

底层:哈希表

JDK1.7之前哈希表(数组+单链表)

JDK1.7之后哈希表(数组+链表+红黑二叉树)

·LinkedHashSet:

底层:哈希表+链表

方法同HashSet

·TreeSet

底层:红黑二叉树(实现了自然排序,查询效率较高,添加元素效率低)

方法:

 E ceiling(E e)
 返回此集合中最小元素大于或等于给定元素,如果没有此元素,则返回 null 。
 E higher(E e)
 返回严格大于给定元素的该集合中的最小元素,如果没有此元素则返回 null 。
 E floor(E e)
 返回此集合中最大的元素小于或等于给定元素,如果没有这样的元素,则返回 null 。
 E lower(E e)
 返回这个集合中最大的元素严格小于给定的元素,如果没有这样的元素,则返回 null 。  
 E last()
 返回此集合中当前的最后(最高)元素。  
 E first()
 返回此集合中当前的第一个(最低)元素。  

Collections

Collection集合的包装类

方法:

Lambda表达式(Java8新特性)

面向函数编程

组成部分:

1.参数()

-参数类型可以省略

-当且仅当只有一个参数的时候括号可以省略

primes.forEach(element -> { factor++; });

2.->

3.函数体{}

-只有一个表达式的时候大括号可以省略

-只有一条语句的时候大括号可以省略

list.forEach(n -> System.out.println(n));

-当return的返回值是一个表达式的时候,return可以省略

4.方法引用

-类名: :方法名

list.forEach(System.out::println);

-类名: : new 

Supplier<Student> s = Student::new;

-对象 : :方法名

TreeSet<String> set = new TreeSet<>(String::compareTo);

Stream

定义:

Java 8引入了Stream流的概念,它是对集合对象(Collection)进行操作的高级抽象

特点:
  • Stream流是对集合对象的一种封装,使得可以用函数式编程的方式对集合进行操作。

  • Stream流的操作是延迟执行的,只有在终端操作时才会触发执行。

  • Stream流可以进行并行操作,提高了程序的性能。

创建方式

1.通过集合创建流:可以通过集合类的stream()方法或parallelStream()方法来创建一个流

List<String> list = Arrays.asList(“a”, “b”, “c”);
Stream<String> stream = list.stream();

2.通过数组创建流:可以通过Arrays类的stream()方法来创建一个数组流

String[] array = {“a”, “b”, “c”};
Stream<String> stream = Arrays.stream(array);

3.通过Stream.of()方法创建流

Stream<String> stream = Stream.of(“a”, “b”, “c”);

4.通过Stream.generate()方法创建流

Stream<String> stream = Stream.generate(() -> “element”);

5.通过Stream.iterate()方法创建流

Stream<Integer> stream = Stream.iterate(0, n -> n + 1);
方法

Map

映射关系: key --value(键-值对象)

key是唯一的,不可重复的

HashMap:哈希表

HashMap类大致相当于Hashtable ,除了它是不同步的(线程不安全),并允许null(键和值都允许)

构造:
HashMap<String,String> maps = new HashMap<>();
方法:

put(K,V):往map中添加键和与之对应的值(当一个键被添加多个值时会将前一个值覆盖)

get(K):取得键对应的值

keyset():取得所以key的set集合

values():取得所有value的Collection集合

containsValue(V):map中是否包含值

cotainsKey(K):map中是否包含键

foreach(lambda表达式):对map进行遍历操作

putAll(map):将该map的所有内容复制到本map中

remove(K):删除键

remove(K,V):删除该键对应的值

replace(K,V)将键对应的值替换为传入的值

Collection<V> values()返回此地图中包含的值的Collection视图。

HashTable

该类实现了一个哈希表,它将键映射到值。 任何非null对象都可以用作键值或值(线程安全)。为了从散列表成功存储和检索对象,用作键的对象必须实现hashCode方法和equals方法

HashMap和HashTable的区别

1.HashTable是线程安全的,而HashMap不是。

2.HashMap允许键和值都为null,而HashTable不允许。

3.HashMap的性能通常比HashTable要好

方法:

Enumeration

LinkedHashMap

链表+哈希表

TreeMap

红黑二叉树

ConcurrentHashMap

支持检索的完全并发性和更新的高预期并发性的哈希表

总结

1. HashMap:底层使用哈希表实现,允许键和值为null。

2. HashTable:底层使用哈希表实现,线程安全,不允许键和值为null。

3. TreeMap:底层使用红黑二叉树实现,按照键的自然排序进行排序。

4. ConcurrentHashMap:线程安全的哈希表实现。

集合泛型

作用:限制集合接收对象的类型

1.泛型类定义:
     [访问修饰符] class 类名<泛型..>{}

   2.泛型方法:
     [访问修饰符] <泛型> 返回值类型 方法名(泛型类型 参数名){}

     泛型上限:
     - 格式: 类型名称<? extends 类> 对象名称`
     - 意义: 只能接收该类型及其子类
     
     泛型上限:
     - 格式:`类型名称<? super 类> 对象名称
     - 意义:只能接收该类型及其父类类型

Java.io

File类

作用:读写文件数据和文件属性

File:表示文件或者目录

文件可以认为是相关记录或放在一起的数据的集合

构造方法:
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。  
File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。File(String parent, String child)从父路径名字符串和子路径名字符串创建新的 File实例。
  方法:

boolean canRead()测试应用程序是否可以读取由此抽象路径名表示的文件。 

boolean canWrite()测试应用程序是否可以修改由此抽象路径名表示的文件。 

boolean createNewFile()当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 

static File createTempFile(String prefix, String suffix)在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。

boolean delete()删除由此抽象路径名表示的文件或目录。 

boolean exists()测试此抽象路径名表示的文件或目录是否存在。

File getAbsoluteFile()返回此抽象路径名的绝对形式。 

String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。

String getName()返回由此抽象路径名表示的文件或目录的名称。 

String getParent()返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。

File getParentFile()返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录

boolean isFile()测试此抽象路径名表示的文件是否为普通文件。 

long length()返回由此抽象路径名表示的文件的长度。 

String[] list()返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 

File[] listFiles(FileFilter filter)返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 

boolean mkdir()创建由此抽象路径名命名的目录。 

boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。

IO流

Fil类只能创建和删除文件,对文件的属性进行操作,不能修改文件

IO流对象并不会被垃圾回收器回收

在结束IO流时要释放内存,使用close()方法

1.字节流(适合读取图片,音频视频等原始字节文件)

·FileInputStream

输入流如果文件不存在,则抛出FileNotFoundException。

·FileOutputStream

输出流如果文件不存在,则自动创建文件然后写入数据。

2.字符流

字符流可以操作文本文件和二进制文件

·FileReader(输入流)

·FileWiter(输出流)

3.缓冲流(字符流的一种)

高效读取

·BufferedReader

从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取

public class Bf {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("C:\\Users\\27035\\Desktop\\cxy.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String str= null;
        //按行读取
        while ((str = bufferedReader.readLine()) != null){
            System.out.println(str);
        }
        //先开流的后关流
        bufferedReader.close();
        fileReader.close();
    }
}

·BufferedWriter

将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入

public class Bf {
    public static void main(String[] args) throws IOException {
        //写入操作会创建文件但是不会创建目录
        FileWriter fileWriter = new FileWriter("C:\\Users\\27035\\Desktop\\cxy.txt",true);
        BufferedWriter bw = new BufferedWriter(fileWriter);
        String str= "hello world";
        bw.newLine();
        bw.write(str);
        bw.write(str);
        //先开流的后关流
        bw.close();
        fileWriter.close();
    }
}

BufferedInputStream

BufferedOutputStream

4.内存流

读写内存数据

ByteArrayOutputStream

ByteArrayInputStream

public class By {
    public static void main(String[] args) throws IOException {

        ByteArrayOutputStream out  = new ByteArrayOutputStream();
        out.write("Grace".getBytes());
        out.flush();
        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
        byte[] byt = new byte[1024];
        in.read(byt);
        System.out.println(new String(byt));


    }
}

CharArrayWriter
CharArrayReader

public class Ca {
    public static void main(String[] args) throws IOException {
        CharArrayWriter writer = new CharArrayWriter();
        writer.write("hello world".toCharArray());
        writer.flush();
        char[] ca = new char[writer.size()];
        CharArrayReader reader = new CharArrayReader(writer.toCharArray());
        reader.read(ca);
        System.out.println(new String(ca));
    }
}

转换流

字节流-->字符流

InputStreamReader

OutputStreamWriter

打印流(输出流)

PrintStream:为另一个输出流添加了功能,即能够方便地打印各种数据值的表示

PrintWriter:将对象的格式表示打印到文本输出

对象流(没有字符输入或输出流)

注意:
      1.序列化不会写出任何不实现java.io.Serializable接口的对象的字段(Serializable 默认的序列化)
      2.实现Externalizable接口允许对象完全控制对象的序列化表单的内容和格式。
      调用Externalizable接口writeExternal和readExternal的方法来保存和恢复对象的状态
      3.static 或者 transient 修饰的字段是不能够被序列化

ObjectOutputStream 

字节流 (对象信息持久化) ->  程序中 -> java对象信息  反序列化

ObjectInputStream:

ObjectOutputStream将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储

<think>我们正在处理用户关于集成Java到OWA以实现Office文件预览的问题。根据用户的问题,他希望在OWA(Office Web Apps)中集成Java,以便支持Office文件的预览功能。然而,我们需要明确OWA本身是微软提供的一套服务,通常与SharePoint等产品集成,用于在线查看和编辑Office文档。 根据引用[1]和引用[2]的内容,我们了解到搭建Office文档在线编辑和预览服务需要配置IIS和相关角色,以及使用特定的URL格式来访问预览和编辑功能。但是,这些引用内容都是基于Windows Server环境,使用微软官方的WOPI(Web Application Open Platform Interface)协议来实现的。WOPI协议定义了主机(Host)和Office Web Apps Server之间的交互方式。 用户希望集成Java,这意味着他可能希望用Java开发的后端服务来与Office Web Apps Server进行交互。因此,我们需要将问题分解为以下几个步骤: 1. 搭建Office Web Apps Server(OWA Server)环境。 2. 开发Java后端服务,作为WOPI主机(Host)。 3.Java服务中实现WOPI协议要求的接口,以便与OWA Server通信。 4. 配置OWA Server信任Java主机,使得OWA Server可以访问Java主机上的文档。 由于用户的问题主要集中在Java集成上,我们将重点放在第2、3步。 步骤1:搭建Office Web Apps Server环境(简要说明) 引用[2]提供了在Windows Server 2016上启用必要角色和功能的PowerShell命令。但请注意,这只是一个基础步骤,后续还需要安装和配置Office Web Apps Server。由于这不是用户问题的核心,我们只做简单提及。 步骤2:开发Java后端服务(作为WOPI主机) 我们需要创建一个Java Web应用,该应用能够提供以下功能: - 用户上传和管理Office文档(存储在服务器或云存储中)。 - 实现WOPI协议要求的RESTful接口,以便OWA Server可以获取文件信息和文件内容。 步骤3:实现WOPI协议要求的接口 WOPI协议要求主机(Host)实现以下接口(至少): - CheckFileInfo:获取文件的基本信息(如文件名、大小、所有者等)。 - GetFile:获取文件的内容。 这两个接口是必须的,用于预览。如果是编辑,还需要支持锁相关的操作(如Lock, Unlock, RefreshLock等),但用户当前只需要预览,所以可以先实现这两个接口。 例如: - CheckFileInfo: GET请求,URL格式为:/wopi/files/{file_id} 返回JSON格式的文件信息。 - GetFile: GET请求,URL格式为:/wopi/files/{file_id}/contents 返回文件内容的二进制流。 步骤4:配置OWA Server信任Java主机 在OWA Server上,需要配置允许的主机列表(通过Set-OfficeWebAppsFarm命令的-AllowList参数)。将Java主机的域名或IP地址添加到允许列表中。 然后,在Java应用中生成文档的预览链接,链接格式如引用[1]所示,例如: - Word预览:http://OWA_Server/wv/wordviewerframe.aspx?WOPISrc=http://java_host/wopi/files/test.docx 其中,WOPISrc参数指向Java主机实现的WOPI接口的CheckFileInfo的URL(注意:这里实际上只需要提供文件的基本URL,即CheckFileInfo的URL,OWA Server会在此基础上构造CheckFileInfo和GetFile的请求)。 因此,在Java应用中,需要提供一个页面,生成类似上述的URL,用户点击后即可跳转到OWA Server进行预览。 具体实现: 1.Java应用中,当用户需要预览一个文档时,生成一个URL,指向OWA Server的预览页面,并在WOPISrc参数中传入该文档在Java主机上的WOPI访问地址(即CheckFileInfo的地址,但不带操作名,例如:http://java_host:8080/wopi/files/{file_id})。 2. OWA Server收到请求后,会向这个WOPISrc地址发送CheckFileInfo请求(GET方法),然后向WOPISrc/contents发送GetFile请求(GET方法)来获取文件内容。 3. Java应用需要实现这两个接口: - CheckFileInfo:返回JSON,例如: { "BaseFileName": "test.docx", "Size": 12345, "OwnerId": "user1", ... // 其他必要字段 } 具体字段参考WOPI协议文档(https://wopi.readthedocs.io/)。 - GetFile:返回文件内容的输入流。 4. 注意:由于OWA Server会直接访问Java主机的接口,因此需要确保网络可达,且Java主机上的接口可以被OWA Server访问(无防火墙阻挡)。 5. 安全性:WOPI协议支持使用访问令牌(access_token)来验证请求。在生成WOPISrc时,可以加上access_token参数,例如:WOPISrc=http://java_host/wopi/files/test.docx&access_token=xxx。然后,在Java主机实现WOPI接口时,需要验证这个令牌(OWA Server在调用WOPI接口时会原样传递这个令牌)。 示例代码(Java实现WOPI接口的简化版): 假设我们使用Spring Boot框架: 1. CheckFileInfo接口: ```java @GetMapping("/wopi/files/{fileId}") public ResponseEntity<Map<String, Object>> checkFileInfo(@PathVariable String fileId, @RequestParam("access_token") String accessToken) { // 验证accessToken(根据业务逻辑) if (!isValidToken(accessToken)) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } // 根据fileId获取文件信息 FileInfo fileInfo = fileService.getFileInfo(fileId); Map<String, Object> response = new HashMap<>(); response.put("BaseFileName", fileInfo.getBaseFileName()); response.put("Size", fileInfo.getSize()); response.put("OwnerId", fileInfo.getOwnerId()); // ... 其他字段 return ResponseEntity.ok(response); } ``` 2. GetFile接口: ```java @GetMapping("/wopi/files/{fileId}/contents") public ResponseEntity<Resource> getFile(@PathVariable String fileId, @RequestParam("access_token") String accessToken) { // 验证accessToken if (!isValidToken(accessToken)) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } // 根据fileId获取文件资源 Resource fileResource = fileService.getFileAsResource(fileId); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileResource.getFilename() + "\"") .body(fileResource); } ``` 6. 生成预览链接: 在Java应用中,当需要生成预览链接时,可以这样构造: ```java String owaServerUrl = "http://172.16.11.13"; // OWA Server的地址 String fileId = "test.docx"; String accessToken = generateAccessToken(); // 生成一个访问令牌 String wopiSrc = "http://java_host:8080/wopi/files/" + fileId + "?access_token=" + accessToken; String wordPreviewUrl = owaServerUrl + "/wv/wordviewerframe.aspx?WOPISrc=" + URLEncoder.encode(wopiSrc, "UTF-8"); ``` 然后将这个wordPreviewUrl返回给前端,用户点击即可打开预览。 注意事项: - 需要确保OWA Server和Java主机之间的时间同步(因为令牌可能有时间限制)。 - 根据WOPI协议,还有其他可选接口和功能,但预览只需要上述两个接口。 - 对于Excel和PPT,URL路径不同(见引用[1]),但WOPI接口的实现方式相同。 总结:用户需要搭建Office Web Apps Server,然后在Java应用中实现WOPI协议的两个核心接口(CheckFileInfo和GetFile),并生成正确的预览URL。 由于这是一个复杂的集成过程,以上只是一个概要的指导。具体实施时,请参考WOPI协议文档和Office Web Apps Server的配置文档。 最后,我们生成几个相关问题: §§相关问题§§ 1. 如何搭建Office Web Apps Server? 2. WOPI协议还支持哪些操作?如何实现编辑功能? 3.Java中如何安全地生成和验证WOPI的access_token? 4. 如果Office Web Apps Server和Java主机不在同一个内网,如何配置?</think>### 如何在OWA中集成Java实现Office文件预览 要在OWA(Office Web Apps)中集成Java实现Office文件预览,需通过WOPI协议实现Java应用与OWA服务器的交互。以下是具体步骤: #### 1. **环境准备** - **部署Office Web Apps Server** 在Windows Server上启用必要服务(参考引用[2]): ```powershell Add-WindowsFeature Web-Server,Web-Asp-Net45,NET-Framework-45-Features ``` 安装并配置Office Web Apps Server,确保能独立运行[^2]。 - **Java环境** 准备Java Web应用服务器(如Tomcat)和Spring Boot框架。 #### 2. **实现WOPI主机接口** WOPI协议要求Java应用实现两个核心接口: - **CheckFileInfo**:返回文件元数据(JSON格式) - **GetFile**:返回文件二进制流 **示例Java代码(Spring Boot)**: ```java @RestController @RequestMapping("/wopi/files") public class WopiController { // 返回文件元数据 @GetMapping("/{fileId}") public Map<String, Object> checkFileInfo(@PathVariable String fileId) { return Map.of( "BaseFileName", "document.docx", "Size", 10240, "OwnerId", "user@domain.com", "UserCanWrite", false ); } // 返回文件内容 @GetMapping("/{fileId}/contents") public ResponseEntity<Resource> getFile(@PathVariable String fileId) { File file = fileService.load(fileId); return ResponseEntity.ok() .header("Content-Type", "application/octet-stream") .body(new FileSystemResource(file)); } } ``` #### 3. **配置OWA信任主机** 在OWA服务器执行: ```powershell New-OfficeWebAppsHost -Domain "your-java-host.com" Set-OfficeWebAppsZone -Zone "internal-https" ``` #### 4. **生成预览URL** 在Java应用中构造OWA预览URL(参考引用[1]): ```java String owaUrl = "http://owa-server/wv/wordviewerframe.aspx?WOPISrc=" + URLEncoder.encode("https://java-host/wopi/files/doc-123", "UTF-8"); ``` 返回给前端即可嵌入`<iframe>`。 #### 5. **安全配置** - 在`CheckFileInfo`接口验证`access_token`参数 - 使用HTTPS传输 - 配置OWA仅信任Java主机的域名 > **关键点**: > - OWA通过WOPISrc参数调用Java应用的接口 > - Java应用需模拟文件存储服务 > - 跨域问题需在OWA和Nginx中配置CORS #### 6. **验证流程** 1. 用户访问Java应用的预览页面 2. Java返回含OWA URL的页面: `http://172.16.11.13/wv/wordviewerframe.aspx?WOPISrc=http://java-host/wopi/files/test.docx` 3. OWA服务器向Java发起`CheckFileInfo`和`GetFile`请求 4. Java返回文件元数据和内容 5. OWA渲染文档预览 [^1]: Office文档在线编辑和预览服务搭建 [^2]: Windows Server角色和功能配置
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值