读写文件,给人的初步印象是一个很简单的功能。然而在Java中,据说其数量超过数十种,初学者刚刚接触时肯定会产生许多困惑,包括笔者。现在我整理下读文件中所涉及到的基本类,以及一般使用方法。本文参考Java 1.6 官方API文档。本次将整理下读取文件时的一些知识。首先会介绍一些使用的基础类,了解每个类的功能,以及各个类的继承关系,然后会对他们的关系做出一些解释,最后会给出详细的代码以便模仿。不足之处敬请谅解。
类:
File类:
继承结构:
java.lang.Object
继承者 java.io.File
文件和目录路径名的抽象表示形式。关注的是文件在磁盘上的存储仅能代表一个文件或是目录的路径名而已。如果处理文件或者目录名,就应该使用 File 对象,而不是字符串。同时理解在Java中,所有都是面向对象来处理的。
一般使用以下构造方法来实例化File对象:
File file = new File(pathname); //pathname为String类型
主要方法见API文档,在这里不做一一解释。
FileInputStream类:
继承结构:
java.lang.Object
继承者 java.io.InputStream
继承者 java.io.FileInputStream
继承自java.io.InputStream,从文件系统中的某个文件中获得输入字节流。以二进制方式读取文件,与编码无关,不存在乱码问题。
一般使用以下构造方法来实例化,首先创建File对象,通过File对象来实例化FileInputStream。
File file = new File(pathname);
FileInputStream inputStream = new FileInputStream(file);
InputStreamReader 类:
是字节流通向字符流的桥梁,可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。其构造函数需要流参数和编码方式。
继承结构:
java.lang.Object
继承者 java.io.Reader
继承者 java.io.InputStreamReader
FileReader 类:
用来读取字符文件的便捷类,继承自InputStreamReader。
实例化方法同FileInputStream,通过参数File对象来实例化:
FileReader fr = new FileReader(file);
继承结构:
java.lang.Object
继承者 java.io.Reader
继承者 java.io.InputStreamReader
继承者 java.io.FileReader
BufferedReader类:
继承自Reader类,提供通用的缓冲方式文本读取,缓冲能大幅提高I/O的性能。构造函数接收Reader类及其子类的参数。
继承结构:
java.lang.Object
继承者 java.io.Reader
继承者 java.io.BufferedReader
一些涉及到的抽象类:Reader和InputStream
Reader 用于读入16位字符,也就是 Unicode 编码的字符,这样可以包括汉字等字符;而 InputStream 用于读入 ASCII 字符和二进制数据。
InputStream的作用是标志那些从不同数据入口产生输入的类。这些数据入口包括文件、管道、Socket等,每个都有一个相关的InputStream子类。
Reader用于读取字符流的抽象类。子类涉及到上述的BufferedReader、FileReader、InputStreamReader。子类必须实现的方法只有 read(char[], int, int) 和 close()。
下面给出我画的一幅图直观说明类之间的关系以及构造函数所需要的参数。箭头标示该类作为所指示类构造函数的参数。
一些学习心得:
FileInputStream 类关注的是文件内容,以字节方式读取,而 File 类关注的是文件在磁盘上的存储。
FileReader与FileInputStream 的根本区别:
Reader及其子类提供的是字节流的读取,char型,16位,unicode编码。InputStream及其子类提供字节流的读取,byte型,8位。所以,FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream。用FileReader读取出来的是char数组或者String ,而使用FileInputStream读取出来的是byte数组。如果处理纯文本,则建议使用FileReader,适合阅读,但有时需要注意编码问题。其他情况,比如要读取视频文件、音乐文件,只能选择FileInputStream。网络间,如使用socket使用Stream流。
FileReader与InputStreamReader:
FileReader继承自InputStreamReader,主要不同在于构造函数。InputStreamReader的构造函数参数为InputStream和编码方式,当指定编码方式时,需要使用InputStreamReader类。而FileReader的构造函数参数为File对象,或表示文件路径的String。
BufferedReader类的使用:
继承自Reader类,提供通用的缓冲方式文本读取。而且提供了很实用的readLine,读取分行文本很适合,BufferedReader是针对Reader的,不直接针对文件,也不是只针对文件读取。Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用BufferedReader进行包装, 缓冲能大幅提高I/O的性能。如:
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
通常使用的规范用法:
1)从hello.txt中读取字节流。
File file = new File ("hello.txt");
FileInputStream in=new FileInputStream(file);
2)从hello.txt中读取字符,使用BufferReader提高其性能。
File file = new File ("hello.txt");
FileInputStream in=new FileInputStream(file);
InputStreamReader inReader=new InputStreamReader(in);
BufferedReader bufReader=new BufferedReader(inReader);
或者使用如下方法:
File file = new File ("hello.txt");
BufferedReader bufReader =
new BufferedReader(new InputStreamReader(new FileInputStream(file)));
这种方法清晰地显示每个类对应的关系,有助于理解。
3) File file = new File ("hello.txt");
FileReader fileReader=new FileReader(file);
BufferedReader bufReader=new BufferedReader(fileReader);
根据不同的用途以及对性能的不同需求,选择不同的方法。
另外FileInputStream(file)会抛出NotFileFoundException异常,一般使用try catch。
分享到:
相关推荐
在Java编程中,读取文件是常见的操作,无论是...总结来说,Java提供了多种方式来读取文件,选择哪种方法取决于具体的需求,如文件类型、读取效率和数据处理方式。理解并熟练运用这些方法,是Java程序员必备的技能之一。
根据提供的文件信息,...以上就是从给定文件的标题、描述、标签以及部分内容中总结出来的知识点,涵盖了Java POST请求发送与接收文件流的基础操作以及Spring MVC中处理文件上传的相关内容。希望这些信息对你有所帮助。
4. 通过`BufferedReader`的`readLine()`方法逐行读取文件内容。 ### 二、处理文本数据的方法 #### 1. 字符串操作 在读取TXT文件时,经常需要对字符串进行分割、修剪等操作。例如,在示例代码中,使用了`split(":")...
根据提供的文件信息,我们可以归纳出以下相关知识点: ### 1. 使用 Java 进行文件上传至数据库 BLOB 字段 #### 知识点说明: 在Java Web开发中,经常需要处理用户上传的文件,比如图片、文档等。这些文件通常比较...
根据提供的文件信息,我们可以归纳总结出以下IT领域的关键知识点: ### 一、Java Web 开发框架 1. **Struts + Spring + Hibernate** - **Struts**:用于构建MVC架构的应用程序,负责处理HTTP请求和响应。 - **...
【Java程序设计试题及答案归纳】 1. **Java字节码文件扩展名**:Java源代码文件(.java)经过编译后会生成字节码文件(.class),这是Java虚拟机(JVM)能够识别的文件格式。 2. **算术运算符优先级**:在Java中,...
根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 1. Java Swing UI 构件库基础 #### 1.1 `MenuBar` 和 `Menu` 在Java中,`MenuBar` 和 `Menu` 是用来构建应用程序菜单栏的基础组件。这段代码通过...
根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 1. Java 文件操作与序列化 #### 1.1 序列化概述 在Java中,通过实现`Serializable`接口可以使一个类支持序列化功能。序列化是将对象的状态转换为...
根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 1. 文件系统对象(File System Object, FSO) 在脚本中使用 `Server.CreateObject("Scripting.FileSystemObject")` 创建了一个文件系统对象(FSO),...
总结来说,Java工程的打包和API文档的生成是软件开发中的基础操作,它们对于项目的部署和维护具有重要意义。熟练掌握这些技巧,能提高开发效率,增强代码的可维护性,也便于团队间的沟通和协作。
Java 提供了多种方式来读取文件中的数据,其中最常见的方法是通过 `FileReader` 类来实现。 #### 1. `FileReader` 类 - **作用**:`FileReader` 是 `Reader` 的子类,用于从文件中读取字符流。 - **用法**: - ...
- `readData()`方法用于读取文件中的训练数据,每一行被视为一个训练元组,并存储到`ArrayList<ArrayList<String>>`中。 #### 五、总结 本文介绍了如何使用Java实现决策树ID3算法,包括算法原理、实现细节及代码...
根据提供的文件信息,我们可以归纳出以下几个关键知识点: ### 1. Java 8 多线程安全 #### 知识点解析: 在Java编程中,**多线程安全**是确保程序在多线程环境中能够正确运行的重要方面。下面是一些可以增加Java ...
根据提供的文件信息,我们可以归纳出一系列与Java编程相关的知识点,主要集中在基本的程序结构、流程控制、变量作用域以及操作符等几个方面。下面将详细展开这些知识点。 ### Java程序结构 #### Hello.java 该程序...
2. **创建输入输出流**:使用`BufferedInputStream`从服务器读取文件数据,使用`BufferedOutputStream`将文件数据写入客户端。 3. **读写文件数据**:通过循环读取输入流中的数据,并写入到输出流中。 4. **关闭资源...
根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 一、Java中配置数据库连接的基本步骤 在Java中,配置数据库连接通常涉及到几个关键步骤,包括加载数据库驱动、定义连接参数(如数据库URL、用户名...
根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 1. Java FTP 客户端基础知识 #### FTP(File Transfer Protocol)简介: FTP 是一种用于在网络上进行文件传输的应用层协议。它提供了一种简单的...
根据提供的文件信息,我们可以归纳总结出以下几个关键的知识点: ### 1. Java 定时任务实现 #### 1.1 Timer 类与 TimerTask 类 在 Java 中,`java.util.Timer` 和 `java.util.TimerTask` 类是实现定时任务的基础...