`

Java编程那些事儿87——文件操作之读取文件

阅读更多

Java编程那些事儿87——文件操作之读取文件

陈跃峰

出自:http://blog.csdn.net/mailbomb

11.3.1.3 读取文件

虽然前面介绍了流的概念,但是这个概念对于初学者来说,还是比较抽象的,下面以实际的读取文件为例子,介绍流的概念,以及输入流的基本使用。

按照前面介绍的知识,将文件中的数据读入程序,是将程序外部的数据传入程序中,应该使用输入流——InputStreamReader。而由于读取的是特定的数据源——文件,则可以使用输入对应的子类FileInputStreamFileReader实现。

在实际书写代码时,需要首先熟悉读取文件在程序中实现的过程。在Java语言的IO编程中,读取文件是分两个步骤:1、将文件中的数据转换为流,2、读取流内部的数据。其中第一个步骤由系统完成,只需要创建对应的流对象即可,对象创建完成以后步骤1就完成了,第二个步骤使用输入流对象中的read方法即可实现了。

使用输入流进行编程时,代码一般分为3个部分:1、创建流对象,2、读取流对象内部的数据,3、关闭流对象。下面以读取文件的代码示例:

import java.io.*;

/**

* 使用FileInputStream读取文件

*/

public class ReadFile1 {

public static void main(String[] args) {

//声明流对象

FileInputStream fis = null;

try{

//创建流对象

fis = new FileInputStream("e:\\a.txt");

//读取数据,并将读取到的数据存储到数组中

byte[] data = new byte[1024]; //数据存储的数组

int i = 0; //当前下标

//读取流中的第一个字节数据

int n = fis.read();

//依次读取后续的数据

while(n != -1){ //未到达流的末尾

//将有效数据存储到数组中

data[i] = (byte)n;

//下标增加

i++;

//读取下一个字节的数据

n = fis.read();

}

//解析数据

String s = new String(data,0,i);

//输出字符串

System.out.println(s);

}catch(Exception e){

e.printStackTrace();

}finally{

try{

//关闭流,释放资源

fis.close();

}catch(Exception e){}

}

}

}

在该示例代码中,首先创建一个FileInputStream类型的对象fis

fis = new FileInputStream("e:\\a.txt");

这样建立了一个连接到数据源e:\a.txt的流,并将该数据源中的数据转换为流对象fis,以后程序读取数据源中的数据,只需要从流对象fis中读取即可。

读取流fis中的数据,需要使用read方法,该方法是从InputStream类中继承过来的方法,该方法的作用是每次读取流中的一个字节,如果需要读取流中的所有数据,需要使用循环读取,当到达流的末尾时,read方法的返回值是-1

在该示例中,首先读取流中的第一个字节:

int n = fis.read();

并将读取的值赋值给intn,如果流fis为空,则n的值是-1,否则n中的最后一个字节包含的时流fis中的第一个字节,该字节被读取以后,将被从流fis中删除。

然后循环读取流中的其它数据,如果读取到的数据不是-1,则将已经读取到的数据n强制转换为byte,即取n中的有效数据——最后一个字节,并存储到数组data中,然后调用流对象fis中的read方法继续读取流中的下一个字节的数据。一直这样循环下去,直到读取到的数据是-1,也就是读取到流的末尾则循环结束。

这里的数组长度是1024,所以要求流中的数据长度不能超过1024,所以该示例代码在这里具有一定的局限性。如果流的数据个数比较多,则可以将1024扩大到合适的个数即可。

经过上面的循环以后,就可以将流中的数据依次存储到data数组中,存储到data数组中有效数据的个数是i个,即循环次数。

其实截至到这里,IO操作中的读取数据已经完成,然后再按照数据源中的数据格式,这里是文件的格式,解析读取出的byte数组即可。

该示例代码中的解析,只是将从流对象中读取到的有效的数据,也就是data数组中的前n个数据,转换为字符串,然后进行输出。

在该示例代码中,只是在catch语句中输出异常的信息,便于代码的调试,在实际的程序中,需要根据情况进行一定的逻辑处理,例如给出提示信息等。

最后在finally语句块中,关闭流对象fis,释放流对象占用的资源,关闭数据源,实现流操作的结束工作。

上面详细介绍了读取文件的过程,其实在实际读取流数据时,还可以使用其它的read方法,下面的示例代码是使用另外一个read方法实现读取的代码:

import java.io.FileInputStream;

/**

* 使用FileInputStream读取文件

*/

public class ReadFile2 {

public static void main(String[] args) {

//声明流对象

FileInputStream fis = null;

try{

//创建流对象

fis = new FileInputStream("e:\\a.txt");

//读取数据,并将读取到的数据存储到数组中

byte[] data = new byte[1024]; //数据存储的数组

int i = fis.read(data);

//解析数据

String s = new String(data,0,i);

//输出字符串

System.out.println(s);

}catch(Exception e){

e.printStackTrace();

}finally{

try{

//关闭流,释放资源

fis.close();

}catch(Exception e){}

}

}

}

该示例代码中,只使用一行代码:

int i = fis.read(data);

就实现了将流对象fis中的数据读取到字节数组data中。该行代码的作用是将fis流中的数据读取出来,并依次存储到数组data中,返回值为实际读取的有效数据的个数。

使用该中方式在进行读取时,可以简化读取的代码。

当然,在读取文件时,也可以使用Reader类的子类FileReader进行实现,在编写代码时,只需要将上面示例代码中的byte数组替换成char数组即可。

使用FileReader读取文件时,是按照char为单位进行读取的,所以更适合于文本文件的读取,而对于二进制文件或自定义格式的文件来说,还是使用FileInputStream进行读取,方便对于读取到的数据进行解析和操作。

读取其它数据源的操作和读取文件类似,最大的区别在于建立流对象时选择的类不同,而流对象一旦建立,则基本的读取方法是一样,如果只使用最基本的read方法进行读取,则使用基本上是一致的。这也是IO类设计的初衷,使得对于流对象的操作保持一致,简化IO类使用的难度。

分享到:
评论

相关推荐

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    华南农业大学 java课程设计 mp3播放器

    通过这个项目,学生不仅可以深化对Java编程的理解,还能锻炼到GUI设计、多媒体处理、文件操作和多线程编程等多方面的技能。同时,这个项目也是一个很好的实例,展示了如何将理论知识转化为实际应用,为未来进入软件...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    JSP网络编程从基础到实践

    实例34 随机读取文件程序示例 实例35 故事接龙 实例36 文件上传 实例37 在浏览器中打开文件 实例38 文件下载 实例39 用jspSmartUpload组件实现文件上传 实例40 应用jspSmartUpload组件进行...

    SuperKunrio.zip

    《坤坤的奇妙冒险——Java编程之旅》 在“坤坤的奇妙冒险”这个压缩包文件“SuperKunrio.zip”中,隐藏着一个神秘的世界,那就是Java编程的海洋。坤坤,作为我们故事的主角,即将踏上一段充满挑战与乐趣的编程之旅...

    TUP第七期赵劼:微软异步编程模型的演变 演讲PPT

    赵劼还通过一个具体的例子——异步文件传输——展示了不同异步编程模型之间的区别: 1. **同步版本**: - 使用`WebRequest.Create`获取请求对象。 - 使用`GetResponse`方法获取响应流。 - 逐段读取并写入数据。 ...

    flying brid

    《飞翔的桥梁——JAVA开发小游戏解析》 "飞翔的桥梁"是一款由JAVA语言开发的趣味小游戏,其简单易上手的特性使得它深受玩家喜爱。JAVA作为一种广泛应用的编程语言,以其跨平台、面向对象和安全性强的特点,在游戏...

    田忌赛马: POJ 2287(贪心解法)

    "田忌赛马"这个题目来源于古代中国的一个著名故事,而在这个故事的基础上,被引入到了编程竞赛的场景中。POJ(Programming Online Judge)是国内外广受欢迎的在线编程评测系统,其中的2287题正是以"田忌赛马"为背景...

    xml解析中文笔记.docx

    为了使程序能够读取并利用XML文件中的数据,需要使用专门的工具——XML解析器。例如,在Java中,.properties文件通常使用`Properties`类进行解析,而XML则需借助特定的解析器。 - **多语言支持**:XML不仅限于Java...

    英文分词统计词频

    总的来说,这个项目提供了一个基础的英文文本分析工具,对于学习Java编程、NLP和数据可视化的人来说,是一个很好的实践案例。通过理解这个程序的工作原理,你可以深入学习如何处理文本数据,以及如何使用Java和相关...

    RPG游戏战斗源码

    《RPG游戏战斗源码》是一款专为初学者设计的学习资源,它涵盖了RPG游戏开发中的核心部分——战斗系统。这个源码可以帮助开发者理解如何构建一个基本的角色扮演游戏,特别是战斗环节的设计与实现。 首先,我们要了解...

    TextGame:基于文本的视频游戏,故事由 Nate Kreiger 撰写

    《TextGame: 文本冒险,Java编程的艺术》 在计算机游戏的世界里,有一种独特而富有魅力的游戏类型——基于文本的视频游戏(Text-Based Video Game),它们以文字为载体,通过玩家的想象力构建出无限可能的游戏场景...

    PuzzledLove:受情人节启发的小游戏

    《PuzzledLove: 受情人节启发的小游戏》是一款基于Java编程语言开发的互动娱乐软件。这款游戏以浪漫的节日——情人节为背景,旨在为玩家提供一个充满爱意和趣味的游戏体验。通过解决各种谜题,玩家可以深入游戏的...

    BasicRPG:一款没有任何华丽图形或声音的移动 RPG 游戏

    总的来说,"BasicRPG"是一款展示Java编程能力和游戏设计思想的作品。虽然它没有华丽的外表,但其内在的逻辑和设计足以让人沉浸在文字构筑的冒险世界中。对于想要学习游戏开发的程序员来说,这是一个极好的实践项目,...

    myHero

    《我的英雄——myHero》 在信息技术领域,项目命名往往具有深远的意义,"myHero"这一标题可能代表了开发者心中的理想或目标,它可能是一个软件应用、一个游戏或者是某种技术解决方案。在这里,我们可以将"myHero...

Global site tag (gtag.js) - Google Analytics