目录
第1章 成为程序员 1.1 选择编程语言 1.2 告诉计算机做什么 1.3 程序的工作原理 1.4 为什么程序不能正常工作 1.5 选择 Java编程工具 1.6 安装 Java开发工具 1.7 总结 1.8 问与答 1.9 测验 1.9.1 问题 1.9.2 答案 1.10 练习 第2章 编写第一个程序 2.1 编写程序所需的工具 2.2 创建 Saluton 程序 2.3 开始输入程序 2.3.1 class语句 2.3.2 main语句的作用 2.3.3 大括号 2.4 在变量中存储信息 2.5 保存编写好的程序 2.6 将程序编译为 class文件 2.7 修复错误 2.8 运行 Java程序 2.9 总结 2.10 问与答 2.11 测验 2.11.1 问题 2.11.2 答案 2.12 练习 第3章 Java之旅 3.1 第一站:Oracle 3.2 去 Java学校 3.3 在 JavaWorld 用午餐 3.4 在 NASA仰望天穹 3.5 回归正题 3.6 到 Java Boutique 去问路 3.7 在手机上运行 Java 3.8 总结 3.9 问与答 3.10 测验 3.10.1 问题 3.10.2 答案 3.11 练习 第4章 理解Java程序的工作原理 4.1 创建应用程序 4.2 向应用程序传递参数 4.3 创建 applet 4.4 总结 4.5 问与答 4.6 测验 4.6.1 问题 4.6.2 答案 4.7 练习 第5章 在程序中存储和修改信息 5.1 语句和表达式 5.2 指定变量类型 5.2.1 整数和浮点数 5.2.2 字符和字符串 5.2.3 其他数值类型的变量 5.2.4 布尔型变量 5.3 给变量命名 5.4 在变量中存储信息 5.5 运算符 5.5.1 变量的递增与递减 5.5.2 运算符优先级 5.6 使用表达式 5.7 总结 5.8 问与答 5.9 测验 5.9.1 问题 5.9.2 答案 5.10 练习 第6章 使用字符串来交流 6.1 在字符串中存储文本 6.2 在程序中显示字符串 6.3 在字符串中使用特殊字符 6.4 拼接字符串 6.5 将其他变量用于字符串中 6.6 字符串的高级处理 6.6.1 比较两个字符串 6.6.2 确定字符串的长度 6.6.3 改变字符串的大小写 6.6.4 查找字符串 6.7 导演及演员名单 6.8 总结 6.9 问与答 6.10 测验 6.10.1 问题 6.10.2 答案 6.11 练习 第7章 使用条件测试进行判断 7.1 if语句 7.1.1 小于和大于的比较 7.1.2 相等和不等 7.1.3 使用块语句组织程序 7.2 if-else 语句 7.3 switch语句 7.4 条件运算符 7.5 观察时钟 7.6 总结 7.7 问与答 7.8 测验 7.8.1 问题 7.8.2 答案 7.9 练习 第8章 使用循环重复执行操作 8.1 for循环 8.2 while 循环 8.3 do-while 循环 8.4 退出循环 8.5 给循环命名 8.6 测试计算机的运行速度 8.7 总结 8.8 问与答 8.9 测验 8.9.1 问题 8.9.2 答案 8.10 练习 第9章 使用数组存储信息 9.1 创建数组 9.2 使用数组 9.3 多维数组 9.4 对数组进行排序 9.5 对字符串中的字符计数 9.6 总结 9.7 问与答 9.8 测验 9.8.1 问题 9.8.2 答案 9.9 练习 第10章 创建第一个对象 10.1 面向对象编程的工作原理 10.2 对象示例 10.3 什么是对象 10.4 理解继承 10.5 建立继承层次 10.6 转换对象和简单变量 10.6.1 简单变量的类型转换 10.6.2 对象类型转换 10.6.3 在简单变量和对象之间进行转换 10.6.4 自动封装和拆封 10.7 创建对象 10.8 总结 10.9 问与答 10.10 测验 10.10.1 问题 10.10.2 答案 10.11 练习 第11章 描述对象 11.1 创建变量 11.2 创建类变量 11.3 用方法来创建行为 11.3.1 声明方法 11.3.2 参数不同的类似方法 11.3.3 构造函数 11.3.4 类方法 11.3.5 方法中变量的作用域 11.4 将一个类放在另一个类中 11.5 使用关键字this 11.6 使用类方法和类变量 11.7 总结 11.8 问与答 11.9 测验 11.9.1 问题 11.9.2 答案 11.10 练习 第12章 充分利用现有对象 12.1 继承的威力 12.1.1 继承行为和属性 12.1.2 覆盖方法 12.2 建立继承 12.3 使用现有的对象 12.4 将相同类型的对象存储到 Vector 中 12.5 创建子类 12.6 总结 12.7 问与答 12.8 测验 12.8.1 问题 12.8.2 答案 12.9 练习 第13章 创建简单的用户界面 13.1 Swing 和抽象窗口工具包 13.2 使用组件 13.2.1 窗口和框架 13.2.2 按钮 13.2.3 标签和文本框 13.2.4 复选框 13.2.5 组合框 13.2.6 文本区域 13.2.7 面板 13.3 创建自己的组件 13.4 总结 13.5 问与答 13.6 测验 13.6.1 问题 13.6.2 答案 13.7 练习 第14章 用户界面的布局 14.1 使用布局管理器 14.1.1 GridLayout管理器 14.1.2 BorderLayout管理器 14.1.3 BoxLayout管理器 14.1.4 使用Insets将组件隔开 14.2 应用程序的界面布局 14.3 总结 14.4 问与答 14.5 测验 14.5.1 问题 14.5.2 答案 14.6 练习 第15章 响应用户输入 15.1 让程序监听 15.2 设置要监听的组件 15.3 处理用户事件 15.3.1 复选框和组合框事件 15.3.2 键盘事件 15.3.3 启用和禁用组件 15.4 完善图形应用程序 15.5 总结 15.6 问与答 15.7 测验 15.7.1 问题 15.7.2 答案 15.8 练习 第16章 创建复杂的用户界面 16.1 滚动窗格 16.2 滑块 16.3 变更监听器 16.4 使用图像图标和工具栏 16.5 总结 16.6 问与答 16.7 测验 16.7.1 问题 16.7.2 答案 16.8 练习 第17章 创建交互式Web程序 17.1 标准applet方法 17.1.1 在applet窗口中绘画 17.1.2 初始化applet 17.1.3 启动和停止applet 17.1.4 销毁applet 17.2 将applet放到Web页面中 17.3 创建applet 17.3.1 在applet窗口中绘画 17.3.2 测试SalutonApplet程序 17.4 从Web页面传递参数 17.5 在applet中接收参数 17.6 在applet中处理参数 17.7 使用object标记 17.8 总结 17.9 问与答 17.10 测验 17.10.1 问题 17.10.2 答案 17.11 练习 第18章 处理程序中的错误 18.1 异常 18.1.1 在try-catch块中捕获异常 18.1.2 捕获多种不同的异常 18.1.3 出现异常后进行处理 18.1.4 抛出异常 18.1.5 忽略异常 18.2 抛出和捕获异常 18.3 总结 18.4 问与答 18.5 测验 18.5.1 问题 18.5.2 答案 18.6 练习 第19章 创建线程程序 19.1 线程 19.1.1 降低程序的速度 19.1.2 创建线程 19.2 使用线程 19.2.1 声明类 19.2.2 创建变量 19.3 从init( )开始 19.4 在创建URL时捕获错误 19.5 在paint( )方法中处理屏幕更新 19.6 启动线程 19.6.1 运行线程 19.6.2 停止线程 19.7 处理鼠标单击 19.8 循环显示链接 19.9 总结 19.10 问与答 19.11 测验 19.11.1 问题 19.11.2 答案 19.12 练习 第20章 读写文件 20.1 流 20.1.1 文件 20.1.2 从流中读取数据 20.1.3 缓冲输入流 20.2 将数据写入流中 20.3 读写配置属性 20.4 总结 20.5 问与答 20.6 测验 20.6.1 问题 20.6.2 答案 20.7 练习 第21章 读写XML数据 21.1 创建XML文件 21.2 读取XML文件 21.3 读取 RSS 聚合内容(Syndication Feeds) 21.4 总结 21.5 问与答 21.6 测验 21.6.1 问题 21.6.2 答案 21.7 练习 第22章 利用JAX-WS开发Web服务 22.1 定义服务端点接口 使用注解来简化Java代码 22.2 创建服务实现Bean 22.3 发布Web服务 22.4 使用Web服务描述语言文件 22.5 创建Web服务客户端 22.6 总结 22.7 问与答 22.8 测验 22.8.1 问题 22.8.2 答案 22.9 练习 第23章 创建Java2D图形 23.1 使用Font类 23.2 使用Color类 23.3 创建自定义颜色 23.4 绘制直线和形状 23.4.1 绘制直线 23.4.2 绘制矩形 23.4.3 绘制椭圆和圆 23.4.4 绘制弧线 23.5 绘制饼图 23.6 总结 23.7 问与答 23.8 测验 23.8.1 问题 23.8.2 答案 23.9 练习 第24章 编写Android app 24.1 Android简介 24.2 创建 Android app 24.2.1 剖析一个Android新项目 24.2.2 创建app 24.2.3 安装Android模拟器 24.2.4 创建调试配置 24.3 运行app 24.4 设计真实的app 24.4.1 组织资源 24.4.2 配置app的Manifest文件 24.4.3 设计用户界面 24.4.4 编写Java代码 24.5 总结 24.6 问与答 24.7 测验 24.7.1 问题 24.7.2 答案 24.8 练习 附录A 使用NetBeans IDE A.1 安装NetBeans A.2 创建新项目 A.3 创建新的Java类 A.4 运行应用程序 A.5 修复错误 附录B Java资源 B.1 可以考虑的其他书 B.2 Oracle公司的 Java官方站点 B.3 其他Java站点 B.3.1 本书英文版的配套网站 B.3.2 Café au Lait B.3.3 Workbench B.3.4 Java 7 Developer Blog B.3.5 其他Java博客 B.3.6 InformIT B.3.7 Stack Overflow B.3.8 Java Review Service B.3.9 JavaWorld杂志 B.3.10 Developer.com’s Java Directory 附录C 本书站点 附录D 设置Android开发环境 D.1 起步 D.2 安装Eclipse D.3 安装 Android SDK D.4 安装在Eclipse中使用的Android插件 D.5 设置你的手机 其他 版权

Java初级教程

Java入门经典
第20章 读写文件

本章介绍如下内容:

将文件中的字节读取到程序中;

在计算机上创建新文件;

将字节数组存储到文件中;

更改存储在文件中的数据。

在计算机中有很多表示数据的方式,读者使用过的一种是创建并引用对象,对象包含以变量方式存储的数据,还包含使用数据来完成任务的方法。

要使用其他类型的数据,如存储在硬盘中的文件和Web服务器中的文档,可使用java.io包中的类。其中的io表示input/output,这些类用于访问数据源,如硬盘、CD-ROM或计算机内存。

可以使用称为流(将信息从一个地方传到另一个地方的对象)的通信系统,将数据传入程序或从程序中传出数据。

20.1 流

要在Java程序中永久地保存数据或要检索已存储的数据,至少必须有一个流。

“流”是一种对象,将信息从一个地方发送到另一个地方。其名称来自溪流,溪流可以将鱼、船和工业污染都从一个地方带到另一个地方。

流可以连接到各种数据源,包括计算机程序、硬盘、Internet 服务器、计算机内存和DVD-ROM。由于它们都使用流,因此学会如何使用其中的一种数据后,就能够以相同的方式处理其他类型的数据。

本章将使用流来读写计算机上文件中的数据。

有如下两种类型的流。

输入流:从数据源读取数据。

输出流:将数据写入数据源。

所有输入和输出流都由字节组成,字节是0~255的整数。可以用这种格式来表示数据,如可执行程序、字处理文档和MP3音乐文件,但这只是字节可表示的一小部分数据。字节流用于读写这种数据。

注意:

Java类文件以字节码(bytecode)的形式存储为字节。Java解释器运行字节码,而字节码并不一定是由Java语言生成。Java解释器也能运行其他语言生成的字节码,包括NetRexx和Jython语言。Java解释器也被称为“字节码解释器”。

一种更专用的数据表示方式是字符——字母、数字、标点符号等。读写文本数据源时,可以使用字符流。

无论是使用字节流、字符流还是其他类型的信息,整体过程是相同的:

创建一个与数据相关联的流对象;

调用流的方法,将信息加入流中或从流中取出信息;

调用流对象的 close( )方法关闭流。

20.1.1 文件

在Java中,文件用File类表示,它也位于java.io包中。可以读取硬盘、CD-ROM或其他存储设备中的文件。

File对象可以表示已有的文件或要创建的文件。要创建File对象,使用文件名作为构造函数的参数,如下例所示:

这条语句创建一个位于当前文件夹中的address.dat文件的对象,也可以在文件名中包括路径:

注意:

上述代码适用于Windows系统,它使用反斜线(\)字符作为文件名和路径的分隔符。Linux和其他基于UNIX的系统使用斜线(/)字符作为分隔符。编写 Java 程序时,要以适用于任何操作系统的方式引用文件,可使用类变量File.pathSeparator而不是反斜线和斜线,如下面的语句所示:

File bookName = new File("data" + File.pathSeparator + "address.dat");

有了File对象后,就可以调用该对象的几个有用的方法。

exist( ):如果文件存在,返回 true;否则返回 false。

getName( ):将文件名作为 String 返回。

length( ):将文件长度作为 long 值返回。

createNewFile( ):如果文件不存在,创建它。

delete( ):如果文件存在,将其删除。

renameTo(File):使用通过参数指定的File对象的名称来重命名文件。

也可以使用File对象表示系统中的文件夹而不是文件。为此,在构造函数File中指定文件夹名,这可以是绝对路径(如C:\\MyDocuments\\),也可以是相对路径(如java\\database)。

有了代表文件夹的对象后,就可以调用其 listFiles( )方法来看文件夹的内容。该方法返回一个File对象数组,表示文件夹包含的每个文件和子文件夹。

20.1.2 从流中读取数据

本章的第一个项目将使用输入流从文件中读取数据。为此,可使用FileInputStream类,它代表可通过它从文件中读取字节的输入流。

要创建文件输入流,可调用 FileInputStream( )构造函数并将一个文件名或 File 对象作为参数。

创建文件输入流时对应的文件必须存在,否则在创建该流时将引发 IOException 异常。很多与文件读写相关的方法都会引发这种异常,因此最好将与文件相关的所有语句放到try-catch块中,如下例所示:

文件输入流以字节方式读取数据。要读取单个字节,可调用流的 read( )方法且不指定任何参数。如果因已到达文件尾导致流中没有可读取的字节,将返回字节值-1。

读取输入流时,从流中的第一个字节开始读取,如文件的第一个字节。可以调用带有一个参数的 skip( )方法来跳过一些字节,该参数是一个 int 参数,表示要跳过的字节数。下面的语句跳过scanData流中接下来的1024个字节:

如果要一次读取多个字节,可以这样做:

创建一个字节数组,其大小等于要读取的字节数;

使用该数组作为参数调用 read( )方法,将使用从流中读取的字节填充该数组。

下面创建一个从MP3音频文件读取ID3数据的应用程序。MP3是一种非常流行的音乐文件格式,因此经常在ID3文件的末尾添加128个字节,用于存储与歌曲相关的信息,如歌名、创作者及其所属的唱片。

应用程序ID3Reader使用文件输入流来读取MP3文件,它跳过最后128个字节前的所有内容。然后检查余下的字节是否包含ID3数据,如果包含,前3个字节应为84、65和71。

注意:

Java支持的Unicode标准字符集包含ASCII字符集,在ASCII字符集中,这3个数字分别代表大写字母T、A和G。

创建一个名为ID3Reader的Java空文件,然后输入程序清单20.1中的所有文本。

程序清单 20.1 ID3Reader.java 的源代码

在作为应用程序运行该类之前,必须将一个MP3文件指定为命令行参数。该程序可以对任何 MP3 文件都生效,比如 Come on and Getit.mp3(这是由 Marion Black 演唱的一首歌曲)。如果你的系统中有这首歌曲(应该有),则图20.1就是ID3Reader应用程序运行时的输出。

图20.1 运行ID3Reader应用程序

提示:

如果你的计算机中没有 Come on and Getit.mp3文件(在我看来,这是严重的错误),可在 Creative Commons 查找 MP3 歌曲,Creative Commons可通过 Yahoo! Search(http://search.yahoo.com/cc)搜索到。

Creative Commons 是一组版权许可协议,规定了可如何分发、编辑或复制歌曲和书籍等作品。Rock Proper 站点(www.rockproper.com)提供了大量 MP3 专辑,这些专辑可以在 Creative Commons的许可下共享。

在程序清单20.1的第10~11行,应用程序读取MP3文件的最后128个字节,并将其存储到一个字节数组中。该数组在第12行被用于创建一个String对象,后者包含这些字节表示的字符。

如果字符串中的前3个字符为“TAG”,表明该MP3文件包含的ID3信息是应用程序能够识别的格式。

在第 15~18 行,调用字符串的 substring( )方法来显示字符串的各个部分。要显示的字符为 ID3 格式,这种格式总是将艺术家、歌曲、曲名和年度等信息存储在 MP3 文件最后 128字节的相同位置。

有些MP3文件不包含ID3信息或包含的ID3信息为应用程序不能识别的格式。

如果Come on and Getit.mp3文件来自你购买的Eccentric Soul CD,它将包含可读取的ID3信息,因为使用音频CD创建MP3文件的程序从音乐行业数据库CDDB中读取歌曲信息。

从MP3文件的输入流中读取与ID3相关的信息后,第23行关闭这个流。使用完流后,应关闭它,这样可以节省Java解释器的资源。

注意:

读者可能想从BitTorrent服务(这是一种非常流行的文件共享服务)中查找 Come on and Getit.mp3 文件的拷贝,就这首 MP3 而言,我非常理解这种做法。然而,根据美国唱片行业协会的规定,任何人下载不属于自己的CD的MP3文件,将被起诉。因此,最好先从Amazon.com、eBay、Applet iTunes以及其他主流零售商那里购买 Eccentric Soul CD。

20.1.3 缓冲输入流

对于读取输入流的程序,提高其性能的一个方法是将输入放到缓冲区中。缓冲(buffering)是将数据放到内存中供程序需要时使用的一个过程。当 Java 程序需要缓冲输入流中的数据时,将首先在缓冲区中查找,这比从文件等数据源读取数据快。

要使用缓冲输入流,需要创建一个输入流,如FileInputStream对象,然后使用该对象创建缓冲的流。为此,将输入流作为唯一的参数调用BufferedInputStream(InputStream)构造函数,这样,从输入流中读取数据时,数据将被存储到缓冲区中。

要从缓冲的流中读取数据,可调用其 read( )方法且不指定任何参数。这将返回一个 0~255的整数,表示该流中下一字节的数据。如果没有字节可读取,将返回−1。

为了演示缓冲的流,将创建的下一个程序将使用Java的一项功能:控制台输入,这项功能在很多其他语言中是没有的。

控制台输入指的是程序运行时从控制台(也叫命令行)读取字符。

System类包含一个out变量,语句System.out.print( )和System.out.println( )使用了该变量;它还有一个名为in的类变量,表示一个InputStream对象,该对象从键盘接收输入并以流的方式提供它们。

可以像使用其他输入流那样使用这个输入流,下面的语句创建一个缓冲的输入流,它与输入流System.in相关联:

接下来的项目(Console类)包含一个类方法,可在任何Java程序中用于接收控制台输入。在名为Console的Java空文件中输入程序清单20.2中的所有文本。

程序清单 20.2 Console.java 的完整源代码

Console 类包含一个 main( )方法,用于演示如何使用它。当运行该程序时,输出结果如图20.2所示。

图20.2 运行Console应用程序

Console 类包含一个类方法:readLine( ),它从控制台接收字符。用户按回车键后, readLine( )方法返回一个 String 对象,其中包含收到的所有字符。

如果将Console类放在CLASSPATH环境变量(在Windows上)列出的文件夹中,则可以从你编写的任何 Java 程序中调用 Console.readLine( )方法。

注意:

Console类也是世界上最不能让人省心的一款文字冒险游戏,在该游戏中,你不能进入大楼,无法在溪流中涉水前进,也无法四处闲逛。该游戏也称为Adventure,有关该游戏的完整版本,请访问互动小说文档(Interactive Fiction archive),网址为 www.wurb.com/if/game/1。

20.2 将数据写入流中

在 java.io 包中,与流相关的类都是成对出现的。对于字节流,有 FileInputStream 类和FileOutputStream类;对于字符流,有FileReader类和FileWriter类,还有很多其他成对的用于处理流数据的类。

要将数据写入字节流中,首先需要创建一个与输出流相关联的File对象。该文件不必是系统中现有的文件。

可以通过两种方式创建FileOutputStream。如果要在现在的文件中追加字节,使用两个参数调用构造函数 FileOutputStream( ):一个是代表文件的 File对象,另一个是布尔值 true。这样,写入流中的字节就会追加到文件的末尾。

如果要将字节写入一个新文件中,只使用一个 File 对象作为参数调用构造函数FileOutputStream( )。

有了输出流后,就可以调用不同的 write( )方法来写入字节。

用一个字节作为参数调用 write( )方法时,将该字节写入流中。

用一个字节数组作为参数调用 write( )方法时,将数组的所有字节写入流中。

给 write(byte[], int, int )方法指定 3 个参数:一个字节数组、一个表示要写入流中的数组的第一个元素的整数、要写入的字节总数。

下面的语句创建一个包含10个字节的字节数组,并将最后5个字节写入到输出流:

将数据写入到流中后,调用流的 close( )方法关闭它。

现在编写一个简单的应用程序,它通过将字节写入到文件输出流中的方式,将几行文本存储到一个文件中。创建一个名为ConfigWriter的Java空文件,然后输入程序清单20.3中的所有文本。

程序清单 20.3 ConfigWriter.java 的完整源代码

运行该应用程序时,将创建一个名为program.properties的文件,该文件包含下面3行文本:

20.3 读写配置属性

当使用命令行参数对 Java 程序进行配置之后(就像前面几章中创建的应用程序那样), Java程序将更有用。java.util包中有一个Properties类,可用于从源文件(文本文件)中载入配置设置。

在Java中,可以像其他文件那样读取属性文件:

创建一个代表该文件的File对象;

使用该File对象创建一个FileInputStream对象;

调用 load( )方法从输入流中检索属性。

属性文件由一组属性名、等号和属性值组成,如下例所示:

每个属性占一行,因此上述内容将属性username、lastCommand和windowSize的值分别设置为 lepton、open database 和 32(ConfigWriter 类也使用相同的格式)。

下面的代码载入一个名为config.dat的属性文件:

配置设置也称为属性,作为字符串存储在 Properties 对象中。每个属性都用一个类似于applet 参数的键标识。方法 getProperty( )根据键来检索属性,如下面的语句所示:

由于属性被存储为字符串,要将其用作数字值,必须采用某种方式对其进行转换,如下面的代码所示:

要存储属性,可调用 setProperty( )方法并指定两个参数——键和值:

可以调用Properties对象的list(PrintStream)方法来显示所有的属性。PrintStream是System类中 out 类的变量。在本书前面,我们已经在 System.out.println( )语句中使用 out 来显示输出。下面的代码将调用 list( )方法来显示所有的属性。

在对属性作出修改之后,可将其存回到文件中:

创建一个代表文件的File对象;

根据该File对象创建一个FileOutputStream对象;

调用方法 store( OutputSteam,String)将属性存储到指定的输出流中,而且参数 String是属性文件的描述。

接下来创建 ConfigWriter 应用程序,它将多个文件属性设置写入到一个文件中。而Configurator应用程序将这些属性设置读入到一个Java属性文件中,并添加一个名为runtime的新属性(具有当前日期和时间),然后保存该文件。

创建一个名为Configurator的Java空文件,然后输入程序清单20.4中的所有文本。

程序清单 20.4 Configurator.java 的完整源代码

运行该应用程序的输出结果如图20.3所示。

图20.3 运行 Configurator应用程序

文件program.properties现在应该包含如下文本:

Output

上面用到的反斜线字符(\)格式与应用程序的输出不同,可以确保属性文件被正确地存储。

20.4 总结

本章介绍了用于读写字节的输入流和输出流,这是通过流提供数据的最简单方式。

java.io 包有很多用于以其他方式处理流的类;还有一个名为 java.net 的包,它可以让你通过Internet连接读和写流。

字节流的用途广泛,因为可以轻松地将字节转换为其他数据类型,如整数、字符和字符串。

本章的第一个项目(应用程序 ID3Reader)从流中读取字节,然后将其转换为字符串,因为以这种格式从歌曲(如 Marian Black 在专辑EccentricSoul 中演唱的 Come on and Getit)中读取ID3数据更加容易。

20.5 问与答

问:为什么本章的一些字节流方法使用整型参数?不是应使用字节型参数吗?

答:流中的字节与byte类表示的字节是有区别的,在Java中,byte变量的取值范围为−127~128,但流中的字节的取值范围为0~255。因此,处理字节时,经常需要使用int类型,它可以存储128~255的值,而byte变量不能。

20.6 测验

为检验是否掌握了本章的大部分知识,请回答下面关于Java的输入流和输出流的问题。

20.6.1 问题

1.下面哪种方法可用于将字节数组转换为字符串?

a.调用数组的 toString( )方法。

b.将每个字节转换为字符,再将每个字符赋给String数组的元素。

c.用数组作为参数调用构造函数 String( )。

2.哪种流用于在Java程序中读取文件?

a.输入流。

b.输出流。

c.都可以。

3.File类的哪个方法可用于确定文件的长度?

a.getSize( )。

b.read( )。

c.length( )。

20.6.2 答案

1.c.可以像答案b那样单独处理每个字节,但是可以使用其他数据类型来更简单地创建字符串。

2.a.使用File对象创建一个输入流,或调用输入流的构造函数并提供文件名作为参数来创建输入流。

3.c.该方法返回一个long值,表示流中的字节数。

20.7 练习

为体验跋涉到另一条河流的新鲜感,通过下面练习来检测其水质:

编写一个应用程序,它读取一个文件夹中所有MP3文件的ID3标记,并使用创作者、曲名和唱片信息(如果有的话)来重命名这些文件。

编写一个应用程序,它读取一个Java程序的源文件,然后不加修改地写入到一个新文件中。

有关为完成这些练习而编写的Java程序,请访问本书的配套网站www.java24hours.com。

没有精选讨论主题。

全部讨论主题 查看精选主题

没有讨论主题。
😃 😅 😆 😁 😂 😊 😄 😠 😩 😲 😞 😵 😰 😒 😍 😤 😜 😝 😋 😘 😚 😷 😳 😢 😭 😨 😣 😡 😌 😖 😔 😱 😪 😏 😓 😥 😫 😉 👊 👍 👆 👇 👈 👉 👋 👏 👌 👎 👐 💓 💔 💕 💖 💗 💘 💙 💚 💛 💜 💝 💞 💟