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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 皮卫凯 中级黑马   /  2012-9-17 14:07  /  1285 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 皮卫凯 于 2012-9-17 21:33 编辑

import java.io.*;   
public class FileInpTest   
          {              public static void main(String[] args) throws Exception      
                       {           FileOutputStream fos=new FileOutputStream("ceshi.txt"); //1      
                                    fos.write("hello world".getBytes());//2                                
                                    FileInputStream fis=new FileInputStream("ceshi.txt");//3         
                                    byte[] bf=new byte[1024];           
                                    int len=0;           len=fis.read(bf);//4           
                                    System.out.println(new String(bf,0,len));         
                                    fis.close();           
                                    fos.close();     
                         }
           }

这一段代码 第1句 创建一个文件输出流对象 fos并指向ceshi.txt
                   第2句 fos.write() 这句话该怎么理解呢?是将 "hello world".getBytes() 写入到文件还是写入到fos这个输出流对象?
                   第3句 创建一个文件输入流对象 fis并指向ceshi.txt
                   第4句 fis.read(bf) 读入到bf数组中 请大侠帮忙回答上面问题!
上面的代码是一个例子,下面的问题则是自己初学java io部分一直搞不懂的共性问题:

问题1: 所谓的输入输出流对象 到底是该理解成为一个类似运动的传送带(传送数据)还是一个节点(静止的)?
举个例子: fileinputstream中的read(byte[] b) 方法 api中是这样表述的: read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个字节数组中。 将字节数据读入到一个字节数组中 这点可以理解 FileOutputStream中的write(byte[] b) 方法如下: write(byte[] b) 将 b.length 个字节从指定字节数组写入此文件输出流中。 这里将字节数据写入到输出流?怎么理解?写入到输出流就是写入到目的地了吗 ? 不好意思 我尽可能地表达清楚我的疑问 还是怕大家看不明白....
问题2 输入输出流的类中 最基本的有4个 分别是字节和字符的输入和输出 而后面的bufferreader类通常叫做包装类 请问这是个什么概念?






评分

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

查看全部评分

3 个回复

倒序浏览
第2句 fos.write() 这句话该怎么理解呢?是将 "hello world".getBytes() 写入到文件还是写入到fos这个输出流对象?
fos.write("hello world".getBytes());//2         在fos中写,就是写到输出流对象fos中

问题一: write(byte[] b) 将 b.length 个字节从指定字节数组写入此文件输出流中。 这里将字节数据写入到输出流?怎么理解?写入到输出流就是写入到目的地了吗 ?
write方法是fos输出流调用的,就是写入了输出流,写到了输出流是先存放在流里,然后调用flush()方法才将流里的数据清除传到目的地了。

问题二: 输入输出流的类中 最基本的有4个 分别是字节和字符的输入和输出 而后面的bufferreader类通常叫做包装类 请问这是个什么概念?
这里的包装类就是缓冲区,就是把写入流里的数据先存到缓冲区,然后读的时候可以从缓冲区高效率的读。举个例子:水龙头在滴水,水就是写出的数据,用嘴接水就比较麻烦,用一个杯子蓄水,然后拿杯子喝就爽多了,那杯子就是缓冲区,用来存数据
我是这么理解的,如果有错希望楼下能指正。

评分

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

查看全部评分

回复 使用道具 举报
上面讲的已经差不多了。
首先,fos.write("hello world".getBytes());这句是将字符数组写到fos对象所指的内存中,还并未写到硬盘文件上。需要调用flush或者close方法才能写到硬盘的文件上

write(byte[] b) 将 b.length 个字节从指定字节数组写入此文件输出流中。 这里将字节数据写入到输出流?怎么理解?写入到输出流就是写入到目的地了吗 ?
这里,写入到流并不是写入到文件,此时数据还在内存中,并未写到文件,依然要调用flush或者close方法才能写到文件中。
后面的bufferreader类通常叫做包装类 请问这是个什么概念?
bufferedReader类是为了提高FileReader类的读入效率所写的,理解为缓冲类。有了缓冲类,就可以等缓冲类装满再一次性写入到文件,而不必读一点儿写一点儿,降低效率。
回复 使用道具 举报
第二句fos.write() 是将 "hello world".getBytes() 写入到fos这个输出流对象,所谓输入输出对象就是一个从源流向目的地的数据序列,我个人觉得应该理解为类似运动的传送带。关于BufferedReader类只是在此基础上增加了缓冲的功能,当传送的数据较大时使流的效率更好而已。并且提供了readLine()方法,newLine()(跨平台)的方法等。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马