面试题答案
一键面试- 具体流及使用顺序:
URLConnection
获取输入流:首先使用java.net.URL
和java.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);
FileOutputStream
及BufferedOutputStream
:将加密后的数据写入本地文件。先使用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();
- 设计原因:
- 网络连接获取输入流:
URLConnection
及InputStream
是获取网络文件数据的基础方式,是整个流程的起始点。 BufferedInputStream
:提高网络数据读取效率,减少网络I/O操作对性能的影响。CipherInputStream
:在数据读取过程中进行加密处理,符合先接收数据再加密的需求。FileOutputStream
与BufferedOutputStream
:FileOutputStream
作为将数据写入本地磁盘的节点流,而BufferedOutputStream
则提高写入磁盘的效率,减少磁盘I/O操作次数。整个设计方案通过合理搭配节点流和处理流,实现了从网络接收大文件、加密并保存到本地磁盘的功能,同时兼顾了性能和功能的实现。
- 网络连接获取输入流: