MST
星途 面试题库

面试题:Java复杂场景下节点流与处理流的搭配应用

假设你需要从网络上接收一个大文件,并对其内容进行加密处理后保存到本地磁盘。请设计一个使用Java输入输出流中节点流与处理流搭配的方案,说明涉及到的具体流以及它们的使用顺序,并解释为什么这样设计。
14.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 具体流及使用顺序
    • URLConnection获取输入流:首先使用java.net.URLjava.net.URLConnection来建立网络连接并获取输入流。例如:
    URL url = new URL("http://example.com/bigfile");
    URLConnection connection = url.openConnection();
    InputStream inputStream = connection.getInputStream();
    
    • BufferedInputStream包装输入流:用BufferedInputStream对从网络获取的InputStream进行包装,提高读取效率。因为网络读取相对较慢,BufferedInputStream内部有缓冲区,可以减少实际的网络I/O操作次数。
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
    
    • 加密处理流:使用加密相关的流,如CipherInputStream(假设使用Java的javax.crypto包进行加密)。它会在读取数据的同时对数据进行加密处理。
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec iv = new IvParameterSpec(ivBytes);
    cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
    CipherInputStream cipherInputStream = new CipherInputStream(bufferedInputStream, cipher);
    
    • FileOutputStreamBufferedOutputStream:将加密后的数据写入本地文件。先使用FileOutputStream作为节点流来指定输出文件路径,再用BufferedOutputStream包装以提高写入效率。写入磁盘操作相对较慢,BufferedOutputStream的缓冲区可以减少实际的磁盘I/O操作次数。
    FileOutputStream fileOutputStream = new FileOutputStream("encrypted_file.bin");
    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
    
    • 数据传输与关闭流:通过循环从CipherInputStream读取数据并写入BufferedOutputStream。最后关闭所有流,先关闭处理流,再关闭节点流。
    byte[] buffer = new byte[1024];
    int length;
    while ((length = cipherInputStream.read(buffer)) != -1) {
        bufferedOutputStream.write(buffer, 0, length);
    }
    bufferedOutputStream.close();
    fileOutputStream.close();
    cipherInputStream.close();
    bufferedInputStream.close();
    inputStream.close();
    
  2. 设计原因
    • 网络连接获取输入流URLConnectionInputStream是获取网络文件数据的基础方式,是整个流程的起始点。
    • BufferedInputStream:提高网络数据读取效率,减少网络I/O操作对性能的影响。
    • CipherInputStream:在数据读取过程中进行加密处理,符合先接收数据再加密的需求。
    • FileOutputStreamBufferedOutputStreamFileOutputStream作为将数据写入本地磁盘的节点流,而BufferedOutputStream则提高写入磁盘的效率,减少磁盘I/O操作次数。整个设计方案通过合理搭配节点流和处理流,实现了从网络接收大文件、加密并保存到本地磁盘的功能,同时兼顾了性能和功能的实现。