IO

Java 使用 File 类来直接处理文件和文件系统。File 类没有指定信息怎样从文件读取或向文件存储;它描述了文件本身的属性。File 对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。此外,File 还浏览子目录层次结构。Java 中的目录当成 File 对待,它具有附加的属性——一个可以被 list() 方法检测的文件名列表。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
java.io 包中提供了文件操作类:
1.用于读写本地文件系统中的文件:FileInputStream 和 FileOutputStream
2.描述本地文件系统中的文件或目录:File、FileDescriptor 和 FilenameFilter 3.提供对本地文件系统中文件的随机访问支持:RandomAccessFile

//打开一个以 f 描述的文件作为输入 FileInputStream(File f) //打开一个文件路径名为 name 的文件作为输入 FileInputStream(String name) //创建一个以 f 描述的文件作为输出 //如果文件存在,则其内容被清空 FileOutputStream(File f) //创建一个文件路径名为 name 的文件作为输出 //文件如果已经存在,则其内容被清空 FileOutputStream(String name) //创建一个文件路径名为 name 的文件作为输出 //文件如果已经存在,则在该输出上输出的内容被接到原有内容之后 FileOutputStream(String name, boolean append)

RandomAccessFile 提供了支持随机文件操作的方法:
1.readXXX() 或者 writeXXX(): 如 readInt(), readLine(), writeChar(), writeDouble() 等。
2.int skipBytes(int n): 将指针向下移动若干字节。
3.int length(): 返回文件长度。
4.long getFilePointer(): 返回指针当前位置。
5.void seek(long pos): 将指针调用所需位置。

mode 的取值:
1.r: 只读,任何写操作都讲抛出 IOException
2.rw: 读写,文件不存在时会创建该文件,文件存在是,原文件内容不变,通过写操作改变文件内容。
3.rws: 打开以便读取和写入,对于 “rw”,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
4.rwd: 打开以便读取和写入,对于 “rw”,还要求对文件内容的每个更新都同步写入到底层存储设备。

CopyOption 参数支持以下 StandardCopyOption 和 LinkOption 枚举: 1.REPLACE_EXISTING:即使目标文件已存在,也执行复制。如果目标是符号链接,则复制链接本身(而不是链接的目标)。如果目标是非空目录,则复制将失败并显示 FileAlreadyExistsException 异常。 2.COPY_ATTRIBUTES:将与文件关联的文件属性复制到目标文件。支持的确切 - 文件属性是文件系统和平台相关的,但 last-modified-time 跨平台支持并复制到目标文件。 NOFOLLOW_LINKS:表示不应遵循符号链接。如果要复制的文件是符号链接,则复制链接(而不是链接的目标)。

options 参数支持 StandardCopyOption 的以下枚举: 1.REPLACE_EXISTING:即使目标文件已存在,也执行移动。如果目标是符号链接,则替换符号链接,但它指向的内容不受影响。 2.ATOMIC_MOVE:将移动作为原子文件操作执行。如果文件系统不支持原子移动,则抛出异常。使用,ATOMIC_MOVE 您可以将文件移动到目录中,并保证观察目录的任何进程都可以访问完整的文件。 move 方法除了可以移动之外,也可以用与重命名。 可以通过 Files 的 delete(Path path) 方法或者 deleteIfExists(Path path) 方法删除文件。 Java 使用 File 类表示文件或者目录,可以通过 File 类获取文件或者目录的相关属性。

在 Java 中,我们把这些不同类型的输入输出源抽象地称为 流,也就是 Stream;在里面输入输出的数据则称为数据流(Data Stream),它们通常具有统一的接口。
于是我们得到了数据流的定义: 一个 Java I/O 对象叫做数据流。读取数据到内存的对象叫做输入流,内存写出数据的对象叫做输出流。

针对其面向的不同角度,我们大致可以将流分为下面几种类型:
1.按照数据流的方向不同分为 输入流 和 输出流。这种分类不是绝对的,例如在向一个文件写入数据时,它就是输出流;而在读取数据时,它就是输入流。
2.按照处理数据的单位不同分为 字节流 和 字符流
3.按照功能的不同分为 节点流 和 处理流。 需要特别说明,节点流是从特定的数据节点(文件、数据库、内存等)读写数据;处理流是连接在已有的流上,通过对数据的处理为程序提供更多功能。

字节流:表示以字节为单位从 stream 中读取或往 stream 中写入信息。通常用来读取二进制数据。

字符流:以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。 字节流能处理所有类型的数据(如图片、avi 等)。

在 InputStream 类中,方法 read() 提供了三种从流中读数据的方法:
1.int read():从输入流中读一个字节,形成一个 0~255 之间的整数返回(是一个抽象方法)
2.int read(byte b[]):从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
3.int read(byte b[],int off,int len):从输入流中读取长度为 len 的数据,写入数组 b 中从索引 off 开始的位置,并返回读取得字节数。

字符流以字符为单位,根据码表映射字符,一次可能读多个字节,只能处理字符类型的数据。

1.对字符数组进行处理: CharArrayReader、CharArrayWrite。
2.对文本文件进行处理:FileReader、FileWriter。
3.对字符串进行处理:StringReader、StringWriter。
4.过滤字符流:FilterReader、FileterWriter。
5.管道字符流:PipedReader、PipedWriter。
6.行处理字符流:LineNumberReader。
7.打印字符流:PrintWriter。

整行字符处理方法:
1.public String readLine():BufferedReader 的方法,从输入流中读取一行字符,行结束标志 \n、\r 或者两者一起(这是根据系统而定的)
2.public void newLine():BufferedWriter 的方法,向输出流中写入一个行结束标志,它不是简单地换行符 \n 或\r,而是系统定义的行隔离标志(line separator)。

数据流类 DataInputStream 和 DataOutputStream 的处理对象除了是字节或字节数组外,还可以实现对文件的不同数据类型的读写:
1.分别实现了 DataInput 和 DataOutput 接口。
2.在提供字节流的读写手段同时,以统一的形式向输入流中写入 boolean,int,long,double 等基本数据类型,并可以再次把基本数据类型的值读取回来。
3.提供了字符串读写的手段。

Java NIO(New IO) 发布于 JDK1.4,用于代替 Java 标准 IO 。Java NIO 是面向缓存的、非阻塞的 IO,而标准 IO 是面向流的,阻塞的 IO。
首先理解 NIO 的重要概念:Buffer(缓冲区)

1.NIO 读取或者写入数据都要通过 Buffer
2.通过 allocate() 方法分配 Buffer,Buffer 不可实例化,Buffer 是抽象类,需要使用具体的子类,比如 ByteBuffer。
3.Buffer 的参数
(1)capacity :缓冲区的容量
(2)position :当前指针位置,没读取一次缓冲区数据或者写入缓冲区一个数据那么指针将会后移一位
(3)limit :限制指针的移动,指针不能读取 limit 之后的位置
(4)mark :如果设置该值,那么指针将移动到 0 - position 的位置
(5)最后可以这几个参数的关系如下:mark <= position <= limit <= capacity

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值