首先声明一点,这种方法仅限于低频次的交互来获取翻译信息,一旦一秒内大量的哀求会被重定向,那就直接不能用了接着我们上一讲Java如何用HaspMap统计次数并排序详解 - ivanlee717 - 博客园的末端,我们获取到了一个高频次排序好的列表,接下来的任务就是要把这么一大堆的单词举行翻译,我们想要得到每个单词的音标,有什么词性以及对应的翻译。如今我们就来讲讲通过网络来实现单词的翻译。
如果希望可以批量查询英语单词翻译,可以查看我的下一篇博客。
- InputStreamReader 是字节流和字符流之间的桥梁,它用于将字节流(也就是前面获取的 connection.getInputStream() 这个字节输入流)转换为字符流,因为很多时间我们期望处理的是文本字符情势的数据,而不是单纯的字节数组。同时,指定了编码格式为 StandardCharsets.UTF_8,这一点很关键,因为要确保正确地将字节解码成对应的字符。不同的字符编码格式下,相同的字节序列可能表示完全不同的字符,如果不指定正确的编码(服务器通常会按照某种编码格式来发送文本相应,UTF-8 是如今网络通信中很常用的一种编码格式),就可能出现乱码题目,导致后续无法正确解析和处理读取到的文本内容。
又有一个题目,为什么不直接使用 connection.getInputStream() 创建 BufferedReader?总之,reader读到的信息就是获取的那个页面的源码。我们把他存到一个String对象里面。
- 字节流与字符流的差别
- connection.getInputStream()返回的是字节流(InputStream)。字节流是以字节为单位来处理数据的,它并不知道这些字节如何组合成字符。而在很多网络通信场景中,如读取网页内容、解析 JSON 或 XML 等文本格式的数据时,我们必要以字符为单位来处理数据。
- 直接使用字节流来读取文本数据会比较麻烦。例如,一个汉字在 UTF - 8 编码下可能占用 3 个字节,如果只按字节读取,很难正确地将这些字节组合成完整的字符举行处理。
- 编码题目
- 没有经过字符流转换直接使用字节流读取文本可能会导致编码题目。不同的字符编码方式(如 UTF - 8、GBK 等)对字符的字节表示是不同的。
- 通过InputStreamReader可以指定编码方式(如StandardCharsets.UTF - 8),将字节流按照正确的编码转换为字符流。如许能确保从网络中读取的文本数据被正确地解码。例如,如果服务器以 UTF - 8 编码发送数据,而客户端没有正确地按照 UTF - 8 解码,就会出现乱码。
- 缓冲和高效读取
- BufferedReader提供了缓冲功能。它内部有一个缓冲区,当读取数据时,会先从缓冲区获取数据,只有当缓冲区为空时才会从底层的输入流(这里是经过InputStreamReader转换后的字符输入流)读取数据并填充缓冲区。
- 这种缓冲机制可以减少与底层数据源(如网络连接)的交互次数,进步读取服从。直接使用connection.getInputStream()没有这种缓冲机制,每次读取操纵可能都会涉及到相对耗时的底层 I/O 操纵。例如,在读取一个较大的文本文件或网络相应中的大量文本内容时,缓冲机制可以显著进步性能。
- 方便的文本读取方法
- BufferedReader提供了方便的readLine()方法,可以逐行读取文本内容。在处理文本数据时,很多时间数据是以行分隔的,如网页的 HTML 代码、设置文件等。
- 直接使用connection.getInputStream()作为字节流没有这种按行读取的便捷方法,必要自己编写复杂的代码来实现按行读取字节流并将其转换为字符的功能
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |