Java IO
IO
IO是指Input/Output,即输入和输出。以内存为中心。在未接触IO的时候,大部分时间,我们的程序都是跟内存打交道,代码实际运行在内存中,但是内存是掉电之后数据就没有了,所以我们需要持久化。所以就有了以内存为中心的IO流。
- input : 将外部数据读入内存
- ouput : 将内存数据写入外部
IO技术是非常实用的技术,如读/写文件,网络通信中发送和接收消息等操作都需要用到IO技术。因为它采用顺序读写数据的模式,具有单向流动的特点。数据就像是水在管道中流动,我们也称之为IO流。
基本概念与计算机相关知识介绍
我们都知道,计算机的底层是识别二进制数据的,即通过高低电平代表0 和 1。所有的文件本质上也都是一堆0和1组成的。但是我们观察我们的计算机上面的文件,会发现,文件有很多种类型,我们会有word文件 ppt文件 pdf文件等等。WORD文件以.doc结尾;PPT文件以.ppt结尾。每一种文件的内容都是有特定的格式。文件类型与内容的格式都是一一匹配的。
而后缀比如.doc是干什么的呢? 实际上这个后缀是告诉操作系统,这个文件是一个word文件,使用word相关应用打开。
** 那改后缀名?**
其实改后缀名,只会影响操作系统把这个文件映射到一个不相关的应用程序打开,不相关的应用程序打不开。
我在给大家一个演示案例:
- 首先新建一个word 文件
- 随便填充一些内容
- 重命名
点击确定
通过上面的操作你发现了什么吗?
扩展名和文件类型不匹配,应用程序试图打开该文件时可能会报错,简单地通过更改后缀名并不能改变文件内容。一个文件可以选择使用多种应用程序进行解读,在操作系统中,一般通过右键单击文件,选择打开方式即可。
文件类型
文件类型分为两种类型,一种是文本文件,一种是二进制文件。
- 文本文件: 每个二进制字节都是某个可打印字符的一部分,都可以用最基本的文本编辑器进行查看和编辑
- 二进制文件: 每个字符不一定表达字符,可能表达约定地其他信息。
文本文件地编码
因为文本文件都是可打印地字符。但是地球上的人类语言都是不统一的,可打印的字符集也是多种多样的。计算机最早出现在英语国家,ASCII就基本可以满足需要了,ASCII编码,全称是American Standard Code for InformationInterchange,即美国信息互换标准代码。
还有一些非打印字符的控制字符,就不展示了,大家可以搜一下,网络上都有。很明显ASCII对于有一些国家就满足不了,很明显中国就不行。
于是各个地区都开始搞自己的一套编码系统,ASCII码是基础,使用一个字节表示,最高位设为0,其他7位表示128个字符。其他编码都是兼容ASCII的,最高位使用1来进行区分。西欧主要使用Windows-1252,使用一个字节,增加了额外128个字符。我国内地的三个主要编码GB2312、GBK、GB18030。所以如果文本是ASCII则不会有编码乱码问题,但是如果是其他编码,用另一种编码打开,就会出现乱码。
文件读写
文件一般是持久化在硬盘上的,应用程序需要文件的时候,需要将文件从硬盘读入内存,修改完成之后,写回硬盘。Java封装了操作系统的功能提供统一的API。这里我们需要了解一些额外的知识。
- 硬盘的访问延迟,相比于内存,读取硬盘的速度是很慢的。操作系统一般按照块批量传输,而不是按照字节,以摊薄延时开销,块大小一般为512字节。所以即使只需要一个字节,操作系统也会读取一个块进来。对于这种慢速设备,尽量减少接触,接触的时候尽量一次多做一些事情。
- 读写文件一般需要两次文件复制。因为操作系统运行的环境在内核态,用户运行在用户态,应用程序调用操作系统的功能,需要先从用户态切换到内核态,再从内核态切到用户态。所以读文件的时候,需要先从硬盘复制到操作系统内核,再从内核复制到应用程序分配的内存中去。
使用缓冲区可以有效提升操作文件的效率;操作系统操作文件会维护一个打开文件的索引(文件描述符),这个索引是消耗内存的,所以当我们不再使用的时候,记得关闭文件。关闭文件会同步缓冲区内容到硬盘,并释放维护的内存结构。
File类
java.io包下面有一个File类,表示通过指定路径名称来表示磁盘或者网路中的某个文件或者目录。程序不能通过File对象读取内容或者写入数据,要操作数据必须通过IO流。 简单打个比方,File类像是一个水库,我们想把水库的水接到自己家必须通过管道,不能直接操作水库。
构造方法
File中的路径可以是已经存在的,也可以是不存在的。通过new新建一个File对象,不会实际创建一个文件,只是创建一个表示文件或目录的对象,new之后,File对象中的路径是不可变的。
//pathname表示完整路径,该路径可以是相对路径,也可以是绝对路径
public File(String pathname)
//parent表示父目录,child表示孩子
public File(String parent, String child)
public File(File parent, String child)
文件信息
常见的文件操作见下面的代码,比较简单,看注释就可以了。
public String getName() //返回文件或目录名称,不含路径名
public boolean isAbsolute() //判断File中的路径是否是绝对路径
public String getPath() //返回构造File对象时的完整路径名,包括路径和文件名称
public String getAbsolutePath() //返回完整的绝对路径名
//返回标准的完整路径名,它会去掉路径中的冗余名称如".", "..",跟踪软链接(Unix系统概念)等
public String getCanonicalPath() throws IOException
public String getParent() //返回父目录路径
public File getParentFile() //返回父目录的File对象
//返回一个新的File对象,新的File对象使用getAbsolutePath()的返回值作为参数构造
public File getAbsoluteFile()
//返回一个新的File对象,新的File对象使用getCanonicalPath()的返回值作为参数构造
public File getCanonicalFile() throws IOException
public boolean exists() //文件或目录是否存在
public boolean isDirectory() //是否为目录
public boolean isFile() //是否为文件
public long length() //文件长度,字节数,对目录没有意义
public long lastModified() //最后修改时间,从纪元时开始的毫秒数
public boolean setLastModified(long time) //设置最后修改时间,返回是否修改成功
public boolean isHidden() //是否为隐藏文件
public boolean canExecute() //是否可执行
public boolean canRead() //是否可读
public boolean canWrite() //是否可写
public boolean setReadOnly() //设置文件为只读文件
//修改文件读权限
public boolean setReadable(boolean readable, boolean ownerOnly)
public boolean setReadable(boolean readable)
//修改文件写权限
public boolean setWritable(boolean writable, boolean ownerOnly)
public boolean setWritable(boolean writable)
//修改文件可执行权限
public boolean setExecutable(boolean executable, boolean ownerOnly)
public boolean setExecutable(boolean executable)
文件操作
文件操作主要有创建、删除、重命名。 前面我们说过新建一个File对象不会实际创建文件,但如下方法可以:
public boolean createNewFile() throws IOException //创建新文件
public static File createTempFile(String prefix, String suffix)
throws IOException
public static File createTempFile(String prefix, String suffix,
File directory) throws IOException
public boolean delete() // 删除文件
public void deleteOnExit() // 删除文件当退出JVM的时候
public boolean renameTo(File dest) // 重命名
public boolean mkdir() //创建目录 中间目录不存在会失败
public boolean mkdirs() //创建目录 中间目录不存在会创建出中间目录
public String[] list()
public String[] list(FilenameFilter filter)
public File[] listFiles()
public File[] listFiles(FileFilter filter)
public File[] listFiles(FilenameFilter filter)
public interface FileFilter {
boolean accept(File pathname);
}
public interface FilenameFilter {
boolean accept(File dir, String name);
}
** IO内容太多了 一篇放不下,有喜欢的可以关注一下,后面会把IO的别的知识继续补充上来**
标签:文件,Java,入门,IO,boolean,File,public,String From: https://blog.csdn.net/Zongkunxue/article/details/143920213