在上一节中,我们使用FileInputStream类和FileOutputStream类来实现了一个可以自由拷贝文件的功能。为了提高效率,我们人为地定义一个缓冲区byte[] 数组。其实,我们可以使用BufferedInputStream类和BufferedOutputStream类来重写这个功能。

5、BufferedInputStream、BufferedOutputStream

看到Buffererd这个词,我们或许可以猜到,这两个类应该是带有缓冲区的流类。正如我们所想的那样,它们确实有一个buf数据成员,是一个字符数组,默认大小为2048字节。当我们在读取数据时,BufferedInputStream会尽量将buf填满;使用read()方法读取数据时,实际上是先从buf中读取数据,而不是直接从数据来源(如硬盘)上读取。只有当buf中的数据不足时,BufferedInputStream才会调用InputStream的read()方法从指定数据源中读取。

BufferedOutputStream的数据成员buf是一个512字节的字节数组,当我们调用write()方法写入数据时,实际上是先向buf中写入,当buf满后才会将数据写入至指定设备(如硬盘)。我们也可以手动地调用flush()函数来刷新缓冲区,强制将数据从内存中写出

下面用这两个类实现文件复制功能:

package cls;import java.io.*;public class BufferedStreamDemo
{public static void main(String[] args) throws Exception{// 从命令行参数中指定文件File fSource = new File(args[0]);File fDest = new File(args[1]);// 创建带缓冲的流对象BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fSource));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fDest));// 提示信息System.out.println("copy " + fSource.length() + "bytes");byte[] buf = new byte[1];while(bis.read(buf) != -1) // read()返回int类型,返回-1表示已到文件结尾bos.write(buf); // 写入数据// 刷新缓冲区bos.flush();// 关闭流bos.close();bis.close();// 提示信息System.out.println("copy " + fDest.length() + "bytes finished");}
}

6、DataInputStream和DataOutputStream

DataInputStream和DataOutputStream类提供了对Java基本数据类型写入的方法,如int,double,boolean。因为Java中基本数据类型的大小是固定的,不会因为不同的机器而改变,因此在写入的时候就不必担心不同平台数据大小不同的问题。

有一个writeUTF()方法值得我们注意。这个方法会将指定的String对象中的字符写入,但在写入的数据之前会首先写入2个字节的长度数据,这个数据指示了带写入的字符的大小。这样的好处是当我们在使用readUTF()读取数据的时候就不必考虑数据大小的问题了,直接读取就行,因为在readUTF()内部会控制好读取数据的长度。

package cls;import java.io.*;class Student
{String name;int score;// 构造方法public Student(String name,int score){this.name = name;this.score = score;}// 返回名字public String getName(){return name;}// 返回分数public int getScore(){return score;}
}public class DataStreamDemo
{public static void main(String[] args) throws Exception{// 创建3个Student对象Student[] sd = new Student[]{new Student("dog",100),new Student("pig",200),new Student("cat",300)};// 创建输出流对象DataOutputStream dos = new DataOutputStream(new FileOutputStream(args[0])); //向文件中写入// 使用增强for循环写入数据for(Student st : sd){dos.writeUTF(st.getName()); // 写入Stringdos.writeInt(st.getScore());}dos.flush(); // 刷新缓冲区dos.close(); // 关闭流// 从文件中读入数据DataInputStream dis = new DataInputStream(new FileInputStream(args[0]));for(int  i = 0 ; i < 3 ; ++i){System.out.println(dis.readUTF()); // 取入String字符串,不必担心长度的问题System.out.println(dis.readInt());}dis.close();}
}

转载于:https://www.cnblogs.com/whongfei/archive/2013/03/30/5246989.html

Java的IO操作(二) - 带缓冲区的流对象、写入基本数据类型、实现命令行中的copy命令...相关推荐

  1. 【转帖】windows命令行中java和javac、javap使用详解(java编译命令)

    windows命令行中java和javac.javap使用详解(java编译命令) 更新时间:2014年03月23日 11:53:15   作者:    我要评论 http://www.jb51.ne ...

  2. dos下编写java程序_在DOS命令行状态下,如果命令java Hello成功运行了程序,那么下面哪些叙述是正确的()...

    [判断题]在JDK命令行开发工具中,用编译程序javac.exe编译生成的文件是二进制可执行文件. [论述题]你认为堂吉诃德是一个怎样的人? [简答题]练习函数 [单选题]下列制度体现商法提高交易效率 ...

  3. bash命令行中带通配符参数何时展开??

    在bash中执行的命令,有些参数经常会带个通配符的,但是你知道这个参数是何时展开的吗? 先来看下简单的bash小代码: [zcm@debug #88]$cat del.sh #!/bin/bash i ...

  4. 从命令行中进入云主机及相关操作

    从命令行中进入云主机及相关操作 命令行(win+R->cmd)进入云主机 相关指令 命令行中 云主机中 PS: 该blog用于记录学习时遇到的一些命令,只有一小部分,后期随着学习的深入小菜鸡也会 ...

  5. java test abc_DOS命令行下成功执行命令:java Test abc 21,则以下描述正确的是()

    [单选题]假设有两个整数x和y,表达式x>=y?x:y的含义是() [单选题]下列哪项不是Java语言的关键字?() [判断题]每项经济业务发生后,都会引起企业的资产和权益总额发生增减变动,但会 ...

  6. 学以致用——命令行中使用Java模块化技术编译、打包、运行iKb知识库应用

    需求说明 Eclipse环境下,由于未知原因,运行的iKb知识库应用界面不稳定(有时全屏,有时会缩小很多,导致界面可读性很差),如下图所示: 这个问题随着本人所使用的的JDK版本和Eclipse版本的 ...

  7. EFI 分区/恢复分区不可删除?你需要使用命令行了(全命令行操作)

    Windows 系统在安装的时候,会自动为我们的磁盘划分一个恢复分区和一个 EFI 分区.如果后面不打算再用这些分区的时候,却发现无法删除. 本文将提供解决方法. 因为误操作会导致数据丢失,所以我将两 ...

  8. java main命令行参数_java使用命令行参数

    有时你想在运行程序时将信息传递到一个程序中.这通过将命令行参数(command-line arguments )传递给main() 来实现.命令行参数是程序执行时在命令行中紧跟在程序名后的信息.在Ja ...

  9. Java之IO操作总结

    所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 ...

最新文章

  1. Excel的数据分析—排位与百分比
  2. html5与python工资对比_求助各位,python和前端html5如何选择?
  3. mSystems: 中科院动物所王德华组揭示低温下野生动物肠道菌群提高存活率的机制...
  4. 宅男程序员给老婆的计算机课程之9:数据模型
  5. python之web开发“三剑客”
  6. 三层架构---理论篇
  7. C# WPF DataGrid获取单元格并改变背景色
  8. 玫曦音乐播放器开源源码
  9. 【转载】DNN6开源CMS
  10. 多路复用IO: select、sys_select、do_select源码分析
  11. java连接数据库 oracle,Oracle数据库之一分钟教你学会用java连接Oracle数据库
  12. 《工业设计史》第五章:设计改革
  13. 黑马python培训费用
  14. 51单片机中断程序大全
  15. Xunsearch体验Demo
  16. 现代信息检索——基本概念
  17. android 自定义locale,android – 以编程方式设置Locale
  18. 安徽大学计算机专业毕业论文格式,安徽大学本科毕业论文格式.doc
  19. uni-app:基于Vue的跨端框架(闪电演讲内容整理) | 掘金开发者大会
  20. 达梦数据库之TEMP表空间

热门文章

  1. 关于python文件_关于python文件操作
  2. gis 路径拟合算法_决策树算法十问及经典面试问题
  3. 在AWS S3的连接过程中发生java.lang.BootstrapMethodError: call site initialization exception
  4. 【项目管理】ITTO-成本管理
  5. Python 内置方法和属性应用:反射和单例
  6. Leaflet中加载Geoserver发布的WMS服务显示地图
  7. MyBatisPlus条件构造器中last方法怎样使用
  8. Java中实现根据一个List中的数据的两个属性相同划分为同一类
  9. SSM中实现分页与JUnit单元测试
  10. 从Python的turtle绘图开始学习图形化程序设计