Java IO
Posted lym152898
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO相关的知识,希望对你有一定的参考价值。
一、流的概念
流(Stream)的概念源自UNIX中管道的概念,管道是一条不间断的字节流,用来实现程序或进程之间的通信。一个流必有源端和目的端(可以是内存、磁盘文件等。)流的源端和目的端可以简单的看成字节的生产者和消费者。
二、流的分类
根据 读写位置 流分为:
- 结点流 :接从指定的位置(如磁盘文件或内存区域)读或写
- 过滤器 :输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,输出流的原理也类似。
根据 流的方向 分为:
- 输入流 :用户可以从输入流中读取信息 ,但是不能往里写信息。
- 输出流 :用户可以往里写信息,但是不能从中读出信息。
根据 操作对象的类型是字符还是字节 分为两类:
- 字节流
- 字符流
Java IO流的继承结构图如下:
三、常用流的详解
文件操作类:File
在讲解流之前,先讲解一下之后和流操作紧密相关的文件操作类
File类
File类是一个与文件本身操作相关的类——文件的创建、删除、重命名、取得文件大小和修改日期等。
File类中常用的构造方法和操作方法
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public File(String pathName) | 构造 | 给定一个要操作文件的完整路径 |
2 | public boolean exists() | 普通 | 判定给定路径是否存在 |
3 | public File getParentFile() | 普通 | 找到一个指定路径的父路径 |
4 | public boolean mkdirs() | 普通 | 创建指定目录 |
5 | public boolean createNewFile() | 普通 | 创建文件 |
6 | public boolean delete() | 普通 | 删除文件 |
7 | public boolean isDirectory() | 普通 | 判断给定路径是否是文件夹 |
8 | public boolean isFile() | 普通 | 判断给定路径是否是文件 |
9 | public boolean isHidden() | 普通 | 判断是否隐藏 |
10 | public boolean renameTo(File dest) | 普通 | 为文件重命名 |
11 | public long lastModified() | 普通 | 文件的最后一次修改时间 |
12 | public long length() | 普通 | 取得文件的大小 |
13 | public String getName() | 普通 | 取得文件名称 |
14 | public [] File listFiles() | 普通 | 将目录中的文件以File对象数组的方式返回 |
代码示例
import java.util.Date;
import java.text.SimpleDateFormat;
import java.io.File;
public class TestDemo{
public static void main(String [] args)throws Exception{
File file = new File("/home/linyimin/DaSi/java/demo.txt");
// 如果文件存在,获取并输出文件信息
if(file.exists()){
getInfo(file);
}
// 如果不存在,先判断文件的父路径是否存在,不存在先创建目录在创建文件,否则直接创建文件
else if(file.getParentFile().exists()){
// 创建文件
file.createNewFile();
// 获取文件信息
getInfo(file);
}
else{
// 创建目录
file.getParentFile().mkdirs();
// 创建文件
file.createNewFile();
// 获取文件信息
getInfo(file);
}
// 为文件重命名,并取得重命名后的文件信息
File f = new File("/home/linyimin/DaSi/java/TestDemo.txt");
file.renameTo(f);
File newFile = new File("/home/linyimin/DaSi/java/TestDemo.txt");
System.out.println("崇重命名之后的文件信息:");
getInfo(newFile);
// 删除文件
newFile.delete();
}
/*
* 获取文件的各种信息
* @param file 目标操作文件
**/
public static void getInfo(File file){
// 判断指定路径是否是目录
System.out.println(file.getName() + (file.isDirectory()?"是一个目录":"不是一个目录"));
// 判断是否是文件
System.out.println(file.getName() + (file.isFile()?"是一个文件":"不是一个文件"));
// 判断是否为隐藏文件
System.out.println(file.getName() + (file.isHidden()?"是隐藏文件":"不是隐藏文件"));
// 获取文件的最后修改时间
long temp = file.lastModified();
// 将long型数据转换称Date型数据
Date date = new Date(temp);
// 将Date型数据转换称时间字符串
String str = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(date);
System.out.println(str);
// 输出文件大小
System.out.println(file.getName() + ":" + file.length() + "B");
}
}
字节流
所有的 字节输入流都直接或间接继承自InputStream抽象类 ,输入流作为数据的来源,我们可以通过输入流的read方法读取字节数据;
所有的 输出流都直接或间接继承自OutputStream抽象类 ,输出流接收数据,可以通过write方法写入字节数据。
对于InputStream、OutputStream类而言,本身定义的是一个抽象类(abstract class),按照抽象类的使用原则来讲,需要定义抽象类的子类,根据功能的不同,使用不同的子类完成。 按照面向对象的开发原则,子类要为抽象类进行对象的实例化,而后调用的方法以父类中定义的方法为主以上是关于Java IO的主要内容,如果未能解决你的问题,请参考以下文章