A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋美成 中级黑马   /  2014-5-4 12:56  /  1628 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 宋美成 于 2014-5-8 12:46 编辑

大家有木有发现,io中的read()它返回的是int型的数值,这个很诡异啊,当我使用read方法读取一个文件中的字符,在用write写到另一个文件中的时候:while((ch=fr.read())!=-1);
{  
           fw.write(ch);
}
我突然就不明白了啊,ch他存放的是一个int型的数据,而我在用write的时候,写入的内容不也就变成了int型数据,和原来的字符型数据不配啊,但是真正实现的时候又是对的,求大神指导,这个原理是什么啊?

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
InputStream中的read() 是从输入流中读取数据的下一个字节。注意,是字节,返回的是一个32位的int型数据,而OutputStream中的write(int b)本身写入的就是一个32位的数据,所以没有问题。
回复 使用道具 举报
打错了,应该是传入一个32位的int型数据作为参数,而真正只写入其中低八位数据。
回复 使用道具 举报
write
public void write(int c)
           throws IOException写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。
用于支持高效单字符输出的子类应重写此方法。
读取的时候类型被提升,写入的时候类型截取低16位!
回复 使用道具 举报
read()是读取字符的个数,ch有多少,对应的write()方法就写多少
回复 使用道具 举报
本帖最后由 thinkervsruler 于 2014-5-8 10:47 编辑

IO字符流的读取,基本上都是基于Reader中read()方法,LZ可以参考API此方法的文档说明
int read() ,读取单个字符,并返回读取到的字符,但是是以int类型返回的,到文件末尾则返回-1
而write()方法也可以接收int型的数据,void write(int c),写入单个字符,
接收一个int型参数后,writer方法内部会将int型的单个字符自动强转成char型的字符
下面有一个简单的文本文件的复制,您可参考下:
  1. /*
  2. 需求:完成文本文件的复制,
  3. 1.创建写入流并新建一个文本文件,用于存储数据
  4. 2.创建读取流,关联目标文件
  5. 3.通过反复循环完成读写操作
  6. 4.关闭输入输出流
  7. */
  8. import java.io.*;
  9. class CopyTest1
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 FileWriter writer = null;
  14.                 FileReader reader = null;
  15.                 try
  16.                 {
  17.                         writer = new FileWriter("E:\\FileWriter副本.txt");
  18.                         //这里读取的文件,要实际存在才可以,运行时请改成自己硬盘下的文本文件路径
  19.                         reader = new FileReader("E:\\FileWriter.txt");
  20.                         int ch = 0;
  21.                         while((ch = reader.read()) != -1)
  22.                         {
  23.                                 //ch是int型,所以写入时要通过(char)强转成字符型
  24.                                 writer.write(ch);
  25.                                 writer.flush();               
  26.                         }                        
  27.                 }
  28.                 catch (IOException e)
  29.                 {
  30.                         System.out.println("文件读写失败");
  31.                 }
  32.                 finally
  33.                 {
  34.                         try
  35.                         {
  36.                                 if(writer != null)
  37.                                         writer.close();
  38.                         }
  39.                         catch (IOException e)
  40.                         {
  41.                                 System.out.println("文件写入失败");
  42.                         }

  43.                         try
  44.                         {
  45.                                 if(reader != null)
  46.                                         reader.close();
  47.                         }
  48.                         catch (IOException e)
  49.                         {
  50.                                 System.out.println("文件读取失败");
  51.                         }               
  52.                 }        
  53.         }
  54. }
复制代码



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马