`
- 浏览:
86668 次
- 性别:
- 来自:
南京
-
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的朋友有所帮助
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Java输入输出流(I/O流)是Java编程中不可或缺的一部分,它允许程序处理数据的读取和写入操作。在Java中,一切皆为对象,所以输入和输出操作也被抽象成了一系列的类,这些类构成了Java I/O系统的核心。本章主要涵盖...
Java IO(输入输出)是Java编程语言中处理数据输入和输出的核心部分,它提供了一系列类和接口用于在程序与外部资源之间传输数据。在Java中,IO操作涉及到文件的读写、流的处理以及网络通信等。以下是关于Java IO中的...
Java输入输出系统是Java编程语言中的重要组成部分,主要用于程序与外部世界的交互,包括读取文件、网络通信等数据传输。这个PPT教案主要涵盖了Java I/O的基础知识,旨在帮助学习者掌握流的概念以及如何在Java中有效...
根据提供的文件信息,我们可以将知识点总结为以下几个方面: ### 1. DES 加密算法实现 ...- 本文件提供了 DES 加密算法的具体实现,以及 Java 输入输出操作的基础介绍,对于理解这两种技术都有一定的帮助。
Java中的基本输入输出操作 #### 1.1 `System.in`与`System.out` - **`System.in`**: 是标准输入流,通常用于从控制台读取数据。在Java中,可以使用`InputStream`类或`Scanner`类来读取`System.in`的数据。 - **`...
本章节将深入探讨《Java语言程序设计》中关于第6章输入输出流的知识点,结合提供的源代码文件,我们可以看到以下几个关键主题: 1. **基础I/O流**:Java中的I/O流被设计为类层次结构,分为字节流(处理单个字节)和...
1. **基础输入输出操作** - 使用`Scanner`类进行控制台输入。 2. **字符串处理** - 字符串转换为小写。 - 获取字符串中的特定字符。 3. **流程控制** - `if-else`语句。 - 循环结构(`while`循环)。 4. **异常...
Java中标准输入输出 Java中标准输入输出是Java编程语言中的一种基本输入输出机制,它允许程序从键盘读取数据并将其输出到显示器上。在Java中,标准输入输出是通过System.in和System.out两个对象来实现的,其中...
总之,解决“输入年月日,输出那天是星期几”的问题,需要掌握Java日期时间API的使用,包括`LocalDate`、`DayOfWeek`等类,以及闰年和平年的判断。通过编写Java代码,我们可以方便地完成这个任务,从而提高程序的...
10. 用户交互:程序的交互设计非常简单,通过标准输入输出与用户进行交互。用户被提示输入一个日期,然后程序根据这个日期输出相应的日历。这种简单的交互方式对于初学者理解程序如何响应用户输入非常有帮助。 以上...
对比操作前后不同,我们可以关注以下几点: 1. **时间戳**:记录操作开始和结束的时间戳,以便了解操作的持续时间。 2. **资源消耗**:如果可能,记录操作过程中内存、CPU或其他资源的使用情况。 3. **状态变化**:...
这个程序的主要特点包括使用二进制方式存储用户数据、控制台输入输出以及记录用户操作日志。对于初学者而言,这是一个很好的实践项目,可以帮助他们深入理解Java的基础知识以及文件处理和日志记录等实际应用。 首先...
Java输出文件涉及到的主要知识点集中在Web开发中的HTTP响应处理,特别是如何通过Servlet技术向客户端提供文件下载服务。在Java中,通常使用HttpServletResponse对象来完成这一任务。以下是对这些知识点的详细解释: ...
4. **IO流与NIO**:熟练使用Java的输入输出流进行文件操作,理解流的分类和工作原理。对Java NIO(New IO)有一定的了解,知道它如何提高IO操作的效率。 5. **多线程**:掌握线程的创建和管理,理解同步机制,如...
### Java第三十五至三十六讲知识点总结:输入输出流 #### 一、输入输出流概述 在Java中,输入输出流是进行数据读写的重要工具。主要包括以下几类: 1. **字节流**:主要涉及`InputStream`(输入字节流)和`...
理解这个题目时需要注意以下几点: 1. **输入**:用户需要提供一个整数N,表示矩阵的行数和列数。 2. **矩阵构建**:程序需要根据用户提供的N来构建一个N×N的矩阵,并填充元素。 3. **输出**:最后按照螺旋顺序输出...
3. **验证安装**:通过命令行(如Windows的CMD或Linux/Mac的Terminal)输入`java -version`和`javac -version`,如果能正确显示Java版本信息,说明JDK安装成功。 4. **编写并运行Java程序**:使用文本编辑器创建`....
Java提供了丰富的类库来处理不同类型的输入输出操作,如文件、网络连接、内存缓冲等。输入流用于从源读取数据,而输出流用于向目的地写入数据。它们都有一个共同的基类`java.io.InputStream`和`java.io.OutputStream...
本文将对输入输出及数据库操作进行详细的讲解,涵盖流的概念、流的层次结构、标准输入输出、File类、FileInputStream类和FileOutputStream类、DataInputStream类和DataOutputStream类、随机访问文件、Reader类和...
输入输出流的操作可以总结为以下几点: * 读取数据:使用输入流读取数据 * 写入数据:使用输出流写入数据 * 读取数据的方式:可以使用缓冲区读取数据,也可以使用直接读取数据 * 写入数据的方式:可以使用缓冲区...