第三章 File I/O

本文介绍了Java中文件操作的基本概念,包括File类的使用、字节流与字符流的区别及应用场景,并详细讲解了FileInputStream、FileOutputStream、DataInputStream等类的使用方法。

第三章 File  I/O

java.io包提供了一些接口和类,对文件进行基本的操作

 

File

创建File对象的语法

File file=new FileString pathName;

pathName 表示所指向的文件路径名

注意 Windows中,文件路径名中的分隔符可以用正斜杠“/”,如“C:/test.txt,也可以用反斜杠“\”,但必须写成“\\”,其中第一个表示转义符,如“C:\\test.txt

File对象是java.io 包中引用磁盘文件的唯一对象。

File类的常用方法

方法

说明

boolean exists()

判断文件或目录是否存在

boolean isFile()

判断是否是文件

boolean isDirectory()

判断是否是目录

String getPath()

返回此对象表示的文件的相对路径名

String getAbsolutePath()

返回此对象表示的文件的绝对路径名

String getName()

返回此对象表示的文件或目录的名称

boolean delete()

删除此对象指定的文件或目录

boolean createNewFile()

创建指定名称的空文件,不创建文件夹

long length()

返回文件的长度,单位为字节,若不存在返回OL

Java的流

流,是指一连串流动的字符,是以先进先出的方式发送和接受数据的通道

流的分类

 

 

 

字符流和字节流的主要区别:

1.字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。

2.字节流可以处理所有类型数据,如:图片,MP3AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

 

字节流

字节输入流类:FileInputStream

FileInputStream:在实际应用中通常使用InputStream的子类FileInputStream类来实现文件的读取,此类用于从本地文件系统中读取文件内容。

构造方法:

FileInputStream(File file):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。

FileInputStream(String name):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。

常用方法

方法

说明

int read()

读取一个字节数据

int read(byte[] b)

将数据读取到字节数组中

int read(byte[] b,int off,int len)

从输入流中读取最多len长度的字节,保存到字节数组b中,保存位置从off开始

void close()

关闭此文件输入流并释放与该流关联的所有系统资源

int available()

返回输入流读取的估计字节数

 

字节输出流类:FileOutputStream

构造方法:

FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。

FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。

FileOutputStream(String name,boolean append):append表示是否在文件末尾添加数据,若设置为true,则在文件末尾添加数据。

 

常用方法

方法

说明

void write(int c)

写入一字节数据

void write(byte[] b)

写入数组b的所有字节

void write(byte[] b,int off,int len)

将指定b数组中从偏移量off开始的len个字节写入此文件输出流。

void close()

关闭输出流

 

二进制文件的读写

DataInputStream:该类提供一些基于多字节读取方法,从而可以读取基本数据类型的数据。

构造方法:

DataInputStream(InputStream in):使用指定的底层InputStream创建一个DataInputStream

DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流。

字符流

FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。

构造方法:

FileReader(File file):在给定从中读取数据的File的情况下创建一个新的FileReader

FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新的FileReader

BufferedReader类是Reader类的子类,为Reader对象添加字符缓冲器,为数据输入分配内存存储空间,存取数据更为有效。

构造方法:

BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。

BufferedReader(Reader in,int sz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。

常用方法

方法

说明

int read()

从输入流中读取单个字符

int read(byte[]c)

从输入流中读取c.length长度的字符,保存到字符数组c中,返回实际读取的字符数

int read(char[] cbuf,int off,int len)

从输入流中读取c.length长度的字符,保存到字符数组c中,保存位置从off位置开始,返回实际读取的字符长度

void close()

关闭该流并释放与之关联的所有资源

long skip(long n)

跳过字符

 

FileWriter:用来写入字符文件的便捷类,可用于写入字符流。

构造方法:

·FileWriter(File file):根据给定的File对象构造一个FileWriter对象。

·FileWriter(String filename):根据给定的文件名构造一个FileWriter对象。

BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

 

常用方法

方法

说明

write(String str)

str字符串里包含的字符输出到指定的输出流中

void write(String str,int off,int len)

str字符串里从off位置开始长度为len的字符输出到输出流中

void close()

关闭输出流

void flush()

刷新输出流

newLine()

插入一个换行符

 

序列化和反序列化

序列化是将对象的状态存储到特定存储介质的过程

对象序列化的步骤很简单。可以概括成两大步:

1)创建一个对象输出流(ObjectOutputSrerm)。它可以包装一个其他类型的输出流。如文件输流FileOutputSream。例如:

0jectOutputStrean oos=new ObjectOutputStreannew FileOutputStrean“c\\myDoc\\stu.txt”));

它创建了对象输出流oos,包装了一个文件输出流。即C盘文件夹myDoc中的stu.txt文件流。

2)通过对象输出流的writeObject()方法写对象。也就是输出可序列化对象。

 

反序列化是将存储介质中的数据重新构建为对象的过程

反序列化的步骤大致概括为以下两步:

1)创建一个对象输入流(0bjectInputStream),它可以包装一个其他类型的输入流,如文件输入流FilelnputStream

2)通过对象输入流的readObject()方法读取对象。该方法返回一个object类型的对象,如果程序知道该Java对象的类型。则可以将该对象强制转换成其真实的类型。

 

<think>好的,我现在需要帮助用户查找APUE(Advanced Programming in the UNIX Environment)书中第五章关于标准I/O库的知识小结。首先,我要回忆一下APUE这本书的结构,通常第五章确实涵盖了标准I/O库的相关内容,比如文件操作、缓冲机制、流的概念等。用户提到他们需要这一章的小结,所以我需要整理出主要的知识点。 根据用户提供的引用内容,特别是引用[1]中提到的全缓冲、行缓冲和不带缓冲这三种缓冲类型,这应该是第五章的重要内容之一。另外,打开流的函数如fopen、freopen、fdopen也在引用[1]中被提及,这些都是标准I/O库的核心函数。因此,我需要将这些内容整合到小结中。 接下来,我需要确保结构清晰,分点列出。可能的结构包括缓冲类型、文件操作函数、流的概念、错误处理等。同时,用户要求使用中文回答,并正确使用LaTeX格式,特别是行内公式用$...$,独立公式用$$...$$。不过在标准I/O库的小结中可能公式较少,但如果有相关的示例代码或数学表达式,比如缓冲区大小的计算,可能需要使用。 然后,生成相关问题。根据用户提供的示例,问题应该围绕章节的重点,例如缓冲类型的区别、函数的使用场景、错误处理的方法等。需要确保问题能够帮助用户巩固知识点。 另外,用户提到引用的内容需要自然添加引用标识。引用[1]到[4]中,只有引用[1]和引用[3]可能与标准I/O库相关,但引用[3]更多是关于进程组的,可能与当前主题关联不大。因此主要参考引用[1]的内容,并在适当的位置添加标识。 最后,要检查LaTeX语法是否正确,比如使用$int$表示变量时是否正确,是否有遗漏的符号。同时,回答要符合用户给出的结构,先进行知识小结,再列出相关问题。 现在,我需要组织这些信息,确保覆盖第五章的主要知识点,并按照用户的要求呈现。可能遗漏的部分需要确认,比如标准I/O库的其他功能,如格式化输入输出、临时文件处理等,但根据提供的引用,用户可能更关注缓冲机制和文件操作。因此,重点放在缓冲类型、文件打开关闭函数、流的概念、以及错误处理上。</think>### APUE第五章 标准I/O库 知识小结 #### 一、核心特性 1. **缓冲机制** - **全缓冲**:填满标准I/O缓冲区后才执行实际I/O操作(如磁盘文件操作)[^1] - **行缓冲**:遇到换行符或缓冲区满时执行I/O(如终端输入输出) - **不带缓冲**:直接执行I/O操作(如标准错误流`stderr`)[^1] 2. **流与文件指针** 标准I/O库通过`FILE`类型指针操作流,包含文件描述符、缓冲区指针、当前读写位置等元数据。 3. **打开与关闭流** - `fopen`:打开文件并关联流 - `freopen`:重定向流到新文件 - `fdopen`:将文件描述符转换为流 - `fclose`:关闭流并释放缓冲区 #### 二、关键函数 1. **格式化I/O** ```c printf("Value: %d\n", x); // 格式化输出 scanf("%s", buffer); // 格式化输入 ``` 2. **二进制I/O** ```c fread(buffer, size, count, stream); // 读取二进制数据 fwrite(buffer, size, count, stream); // 写入二进制数据 ``` 3. **定位流** - `fseek`:设置文件位置指示器 - `ftell`:获取当前偏移量 - `rewind`:重置到文件起始位置 #### 三、高级特性 1. **临时文件** ```c FILE *tmpfile(void); // 创建临时文件(自动删除) char *tmpnam(char *s); // 生成唯一临时文件名 ``` 2. **缓冲控制** ```c setvbuf(stream, buf, mode, size); // 自定义缓冲模式 ``` 3. **错误处理** - `ferror`:检测流错误标志 - `feof`:检测文件结束标志 - `clearerr`:清除错误标志 $$ \text{缓冲区大小计算公式:}\quad \text{BufferSize} = \text{BUFSIZ} \times n \quad (n \in \mathbb{N}^+) $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值