关于java I/O 看这一篇就够了

io

概览

java的I/O知识体系大概分成以下组成部分:

  • 文件基本操作:
    • 二进制文件字节操作:InputStream 和 OutputStream(字节流)
    • 文本文件字符操作:Reader 和 Writer(字符流)
    • 文件和目录操作:File
  • 文件高级操作:
    • 常见文件类型处理:属性文件,csv,excel,html(jsoup java爬虫),压缩文件
    • 随机读写文件:RandomAccessFile
    • 内存映射文件
    • 序列化
  • io模型:BIO,NIO,AIO
  • NIO

目录

本文目录:

文件概述

基本概念和常识:

  • 二进制思维
  • 文件类型
  • 文本文件的编码
  • 文件系统
  • 文件的读写
  • java文件概述
二进制思维

​ 为了透彻理解文件,我们首先要有一个二进制思维。所有文件,不论是可执行文件,图片文件,视频文件,word文件,压缩文件,txt文件,都没什么可神秘的,他们都是以0和1的二进制形式保存的。我们看到的图片,视频,文本都是应用程序对这些二进制的解析结果。

​ 作为一个程序员,我们应该有一个编辑器,可以查看文件的二进制形式,如UltraEdit,它支持以16进制的形式查看和编辑文件。

下载链接:

http://www.ultraedit.cn/downloads/ultraedit_download.html

文件类型

​ 虽然所有的数据都是以二进制形式保存的,但是为了方便处理数据,高级语言引入了数据类型的概念。文件处理也相似,所有的文件都是以二进制的形式保存的,但是为了方便理解和处理文件,文件也有文件类型的概念。

​ 文件类型通常是以扩展名的形式体现的,比如pdf文件类型的扩展名是.pdf,图片文件的一种常见扩展名是.jpg,压缩文件的一种常见扩展名是.zip。每种文件类型都有一定的格式,代表着文件含义和二进制之间的映射关系。有的文件类型格式是公开的,有的是私有的,我们可以自己定义自己私有的文件格式。

​ 对于一种文件类型,往往有一种或者多种应用程序可以解读他,进行查看和编辑,一个应用程序往往可以解读一种或者多种文件类型。在操作系统中,一种扩展名,往往关联一个应用程序,比如.doc后缀关联word应用。用户通过双击试图打开某扩展名的文件时,操作系统查找关联的应用程序,启动该程序,传递该文件的路径给它,程序再打开文件。

​ 文件类型可以粗略的分为两类:一类是文本文件;另一类是二进制文件。

​ 文本文件:.txt,.java,.html 等

​ 二进制文件:.zip,.pdf,.mp3,.xlsx 等

文本文件的编码

​ 对于文本文件,还有编码方式的属性。文本文件中 字符到二进制之间的映射(即编码)有多种方式。如:UTF-8,GB2312等。

​ 对于UTF-8编码方式,会在文件最开头的地方加入三个特殊字节(0xEf,0xBB,0xBF),这三个特殊字节被称为BOM头,BOM是byte order mark (即字节序标记)的缩写。

不要只看文件的显示,还要看文件背后的 二级制。

​ 换行符:在win系统中,换行符一般是两个字符“\r\n”,即ascii 码的 13 (‘\r’) 和 10 (‘\n’) ;在linux系统中,换行符一般是一个字符 “\n”。

文件系统

​ 文件一般是放在硬盘上的,在windows中,可以有多个逻辑盘,比如C,D等,相当于有多个逻辑的根目录。在linux中,只有一个逻辑的根目录,用/斜线表示。每个文件都有文件路径的概念,路径有两种形式:绝对路径和相对路径

​ 所谓绝对路径,是从根目录到当前 文件的完整路径,在windows中,目录之间用反斜线分割,如 C:\code\hello.java ,在linux中,目录之间用斜线分割,如:/user/desktop/code/hello.java。在java中,java.io.File 类定义了一个静态变量 File.separator,表示路径分割符,编程时应使用该变量,而避免硬编码。

​ 所谓相对路径,是相对于 当前目录 而言。在命令终端上,通过cd命令进入的目录就是当前目录;在 java中,通过 System.getProperty(“user.dir”)可以得到运行java程序的当前目录。相对路径不以根目录开头,比如在windows上,当前目录为 D:\zp ,相对路径为 code\hello.java。

​ 文件除了具体内容,还有元数据信息,如果文件名,创建时间,修改时间,文件大小等,文件还有一个是否隐藏的性值,在linux系统中,如果文件名以.开头,则为隐藏文件;在windows系统中,隐藏是文件的一个属性,可以进行设置。

​ 大部分文件系统的文件和目录具有 访问权限 的概念,对所有者,用户组可以有不同的权限,权限包括 读,写,执行等。

​ 文件名大小写是否敏感的概念,在windows中,一般是大小写不敏感的,而linux中一般是大小写敏感的。

​ 操作系统中有一个临时文件的概念,windows中一般位于:C:\user\用户名\AppData\Local\Temp;而linux中,位于 /tmp

文件读写

​ 文件是放在硬盘上的,程序处理文件需要将文件读入内存,修改后,需要写回硬盘。

​ 一个基本常识是:硬盘的访问延时,相比内存是很慢的。操作系统和硬盘一般是按块批量传输的,而不是按字节,以摊销延时开销,块大小一般为512字节,即使应用程序只需要文件的一个字节,操作系统也会至少将一个块读进来。一般而言,应减少接触硬盘。

​ 另一个常识是:一般读写文件需要两次数据复制,比如读文件,需要先从硬盘复制到操作系统内核,再从内核复制到应用程序分配的内存中。操作系统运行所在的环境和应用程序是不一样的,操作系统所在的环境是内核态,应用程序是用户态,应用程序调用操作系统的功能,需要两次环境的切换,先从用户态切换到内核态,再从内核态切换到用户态,这种用户/内核态之间的切换是有开销的,应尽量减少这种切换

​ 为了提高文件操作效率,应用程序经常使用 缓冲区。读文件时,即使目前只需要少了内容,但是预知还是会接着读取,就一次读取比较多的内容,放到缓冲区,下次读取时,如果缓冲区有,就直接从缓冲区读,减少访问操作系统和硬盘。写文件时,先写到缓冲区,写缓冲区写满的时候,再一次性调用操作系统写到硬盘。不过需要注意的时是,在写结束的时候,要记得把缓冲区的剩余内容同步到硬盘。操作系统自身也会使用缓冲区,但是应用程序更了解读写模式,恰当使用往往可以有更高的效率。

​ 操作系统操作文件 一般有打开和关闭的概念、打开文件会在操作系统内核简历一个有关该文件的内存结构,这个结构一般通过一个整数索引来引用,这个索引一般称为 文件描述符。这个结构是消耗内存的,操作系统能同时打开的文件一般也是有限的,不用文件的时候,记得 关闭文件。关闭文件一般会同步缓冲区到硬盘,并释放占据的内存结构。

​ 操作系统一般支持一种称为 内存映射文件的高效随机读取大写文件的方法,将文件直接映射到内存,操作内存就是操作文件。在内存映射文件中,只有访问到的数据才会被实际复制到内存,且数据只会被复制一次,被操作系统以及多个应用程序共享。

文件基本操作

文件基本操作:

  • 二进制文件字节操作:InputStream 和 OutputStream(字节流)
  • 文本文件字符操作:Reader 和 Writer(字符流)
  • 文件和目录操作:File
字节流

InputStream 和 OutputStream

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值