`
rayloo
  • 浏览: 84779 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 输入输出操作的几点经验

阅读更多
javainput读取数据的几点经验

1.关于InputStream.read()
初学Java的朋友,在从数据流里读取数据时,为图简单经常用InputStream.read()方法,
这个方法是从流里读取一个字节。这样写代码,对于程序员来说是简单很多,但是每次只读取
一个字节,效率会非常低,如果流里有1000个字节,用这样的代码就等于要求系统进行1000次
I/O操作,程序的运行速度会受到影响。
更好的方法是用InputStream.read(byte[]b)或者InputStream.read(byte[]b,intoff,
intlen)方法,一次读取多个字节。


2.关于InputStream类的available()方法
程序员要一次读取多个字节时,经常用到InputStream.available()方法,这个方法可以
在读写操作前先得知数据流里有多少个字节可以读取。需要注意的是,如果这个方法用在从本
地文件读取数据时,一般不会遇到问题,但如果是用于网络操作,程序员就经常会遇到一些麻烦
事。比如,Socket通讯时,对方明明发来了1000个字节,但是自己的程序调用available()方法却
只得到900,或者100,甚至是0,感觉有点莫名其妙,怎么也找不到原因。
其实,这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。本地程序调用
available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据
还没有送达本地。对方发送了1000个字节给你,也许分成3批到达,这你就要调用3次available()
方法才能将数据总数全部得到。
你如果这样写代码:
intcount=in.available();
byte[]b=newbyte[count];
in.read(b);
在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,
你得到的count是0。
需要改成这样:
intcount=0;
while(count==0){
count=in.available();
}
byte[]b=newbyte[count];
in.read(b);

3.关于InputStream.read(byte[]b)和InputStream.read(byte[]b,intoff,intlen)
这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常
读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length
个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法
并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要
让程序读取count个字节,最好用以下代码:
byte[]b=newbyte[count];
intreadCount=0;//已经成功读取的字节的个数
while(readCount<count){
readCount+=in.read(bytes,readCount,count-readCount);
}
用这段代码可以保证读取count个字节,除非中途遇到IO异常或者到了数据流的结尾(EOFException)


其实以上知识都可以在Java的API文档里找到,只是程序员经常只知道函数的大概用法,而没有仔细
阅读注意事项,所以调试程序的时候遇到问题也不知道是什么原因。

希望以上文字对初学Java的朋友有所帮助

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java基本语法—字符串与数值型数据转换、从键盘输入数据

    4. 编写一个 Java 程序,让用户通过键盘输入一个 0~6 的整数,根据输入显示今天是星期几。 三、程序代码 1. IfSentence.java 在这个程序中,我们使用 if 语句来比较三个整数的大小,并输出最大的数。我们首先使用...

    Java节假日算法(免费)

    在这个方法中,我们使用了 Calendar 的 getDayOfWeek() 方法来获取每个日期的星期几,然后检查是否是周末,如果是,则减去相应的天数。这样可以避免假期和周末的重叠情况。 在这个算法中,我们还使用了 List 和 ...

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包6

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包9

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包4

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包101

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包5

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包8

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包10

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    Java第6-7章作业

    * 6.56:使用switch语句实现一个简单的计算器,要求用户输入算术运算符和两个操作数,然后输出计算结果。 * 6.76:使用循环语句实现一个简单的猜数字游戏,要求用户输入一个数字,然后输出猜测结果。 * 6.96:使用...

    java开源包3

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包1

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java对blob的存取.pdf

    在使用 Java 对 MySQL 数据库中的 BLOB 字段进行读写操作时,需要注意以下几点: * 在 MySQL 中,BLOB 字段需要设置为 longblob 类型,以便存储大型二进制数据。 * 在 Java 中,需要使用 JDBC API 来操作数据库,并...

    java初学者必看

    8.5 关于设计好继承的几点建议 8.6 实例:一卡通类的继承 8.6.1 构造方法 8.6.2 setter方法 8.6.3 getter方法 8.6.4 方法覆盖 8.6.5 equals方法 8.6.6 其他需要强调的地方 8.7 本章习题 第9章 多态与抽象类...

    Java 面试题 word文档

    2. 字符串的操作:写一个方法,实现字符串的反转,如:输入 abc,输出 cba。 - 可以使用 StringBuilder 的 reverse() 方法来实现字符串的反转。 3. 数据类型之间的转换 - 如何将数值型字符转换为数字(Integer,...

    java开源包2

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

Global site tag (gtag.js) - Google Analytics