《黑马程序员》高级io作业第五题

本文介绍了一个Java程序在处理中文字符输入时遇到的字符编码问题,并提供了两种解决方案:一是直接更改输入流的编码设置;二是保持原有输入流编码不变,通过转换已读取字符串的编码方式来解决。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
 
public class Test3 {
 
/**
* @param args
* @throws IOException 
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
InputStreamReader isr = new InputStreamReader(System.in,"iso8859-1");
System.out.println(isr.getEncoding());
BufferedReader bReader=new BufferedReader(isr);
String s=bReader.readLine();
for(int i=0;i<s.length();i++){
System.out.println(Integer.toHexString(s.charAt(i)));
}
System.out.println(s);
}
 
}


输入“中国”后,程序的运行结果如下:
d6
d0
b9
fa
???u
请按照下面的两种要求修改上面的程序代码,让程序能够正常打印出输入的中文字符
(1)修改程序中的语句:
InputStreamReader isr = new InputStreamReader(System.in,"iso8859-1");
(2)不修改上面的语句,而是修改下面的语句:
System.out.println(s);
答:
(1)
改为InputStreamReader isr = new InputStreamReader(System.in);
(2)
改为System.out.println(new String(s.getBytes("iso8859-1")));
知识点:此时涉及到字符编码的问题,注意Reader是什么编码读取的,要同时按照什么编码得到字节数组,然后系统按照本地默认编码得到Unicode码的字符串。注意内存中存储的是Unicode码。显示时,再按照本地缺省编码显示。
### 黑马程序员 IO 流练习及实例代码 #### 关于 I/O 流的概念 I/O 流用于表示输入和输出的数据序列,在 Java 中,所有的 I/O 流都位于 `java.io` 包下。通过这些类可以实现程序与外部资源之间的数据传输[^1]。 #### 文件加密解密案例分析 考虑一个简单的文件加解密例子来展示如何利用字节流完成特定功能: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileEncryptDecrypt { public static void main(String[] args) { String srcFile = "source.txt"; String destFile = "encrypted.txt"; FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(srcFile); fos = new FileOutputStream(destFile); byte[] buffer = new byte[20]; int len; while ((len = fis.read(buffer)) != -1) { for (int i = 0; i < len; i++) { buffer[i] = (byte) (buffer[i] ^ 5); // 使用异或运算进行简单加密/解密 } fos.write(buffer, 0, len); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 此段代码展示了如何读取源文件并将其内容写入目标文件的同时执行简单的加密操作。这里采用的是 XOR 操作作为基础的加密手段;同样的逻辑也可以用来做解密工作[^3]。 #### 缓冲区的应用说明 当调用 `InputStream` 的 `read(byte[])` 方法时,该方法尝试一次性填充整个传递过来的缓冲数组。如果当前可用的数据量不足以填满整个缓冲,则返回实际已读取的数量,并等待后续更多数据到来继续读取直到结束标志 `-1` 出现为止[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值