概述
java io操作指使用java进行输入输出操作,所有操作类存放在java.io包中,重要的5个接口和一个类:
- File
- OutputStream
- InputStream
- Writer
- Reader
- Serializable
操作文件类-File
- java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关
- File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。
- 如果需要访问文件内容本身,则需要使用输入/输出流。
- 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录,对象可能为空
- File对象可以作为参数传递给流的构造器
常用构造器
- public File(String pathname)
以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
(1)绝对路径:是一个固定的路径,从盘符开始
(2)相对路径:是相对于某个位置开始 - public File(String parent,String child)
以parent为父路径,child为子路径创建File对象。 - public File(File parent,String child)
根据一个父File对象和子文件路径创建File对象
路径分隔符
- 路径中的每级目录之间用一个路径分隔符隔开。
- 路径分隔符和系统有关:
windows和DOS系统默认使用“\”来表示
UNIX和URL使用“/”来表示 - Java程序支持跨平台运行,因此路径分隔符要慎用。
- 为了解决这个隐患,File类提供了一个常量:
public static final String separator。根据操作系统,动态的提供分隔符。
注意:java命名规则常量定义标识符全部大写但是这里separator和pathSeparator不遵守这个规范,原因File类出现较早
File类的常用方法
- File类的获取功能
-
public String getAbsolutePath():获取绝对路径
-
public String getPath() :获取路径
-
public String getName() :获取名称
-
public String getParent():获取上层文件目录路径。若无,返回null
-
public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
-
public long lastModified() :获取最后一次的修改时间,毫秒值
-
public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
-
public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
- File类的重命名功能
- public boolean renameTo(File dest):把文件重命名为指定的文件路径
- File类的判断功能
- public boolean isDirectory():判断是否是文件目录
- public boolean isFile() :判断是否是文件
- public boolean exists() :判断是否存在
- public boolean canRead() :判断是否可读
- public boolean canWrite() :判断是否可写
- public boolean isHidden() :判断是否隐藏
- File类的创建功能
- public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
- public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
- public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建
- 注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
- File类的删除功能
- public boolean delete():删除文件或者文件夹
删除注意事项:
Java中的删除不走回收站。
要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录
练习:
(1) 创建一个新文件
@Test
public void Test(){
File file = new File("H:\\iotext\\test.txt");
try {
file.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
}
(2)File类中的两个常量
@Test
public void Test(){
System.out.println(File.pathSeparator);
System.out.println(File.separator);
}
结果:
;
\
(3)使用常量修改路径
@Test
public void Test(){
String path = "H:\\iotext"+ File.separator + "test.txt";
File file = new File(path);
try {
file.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
}
在运用中要用File.separator替代分隔符,因为windows下开发到linux上部署
(4)删除文件
@Test
public void Test() {
String path = "H:\\iotext" + File.separator + "test.txt";
File file = new File(path);
if (file.exists()){
file.delete();
}
}
(5)綜合使用
@Test
public void Test() {
String path = "H:\\iotext" + File.separator + "test.txt";
File file = new File(path);
if (file.exists()){
file.delete();
}else{
try {
file.createNewFile();
}catch (IOException e) {
e.printStackTrace();
}
}
}
(6)創建一個文件夾
@Test
public void Test() {
String path = "H:\\iotext" + File.separator + "test.txt";
File file = new File(path);
file.mkdir();
}
(7)遍历一个文件目录
- File file1[] = file.listFiles();//返回一个file对象,返回完整的路径名
- String[] files = file.list();//返回files数组,只返回文件名
@Test
public void Test() {
String path = "H:\\iotext" + File.separator ;
File file = new File(path);
File file1[] = file.listFiles();
for (int i = 0; i < file1.length ;i++){
System.out.println(file1[i]);
}
String[] files = file.list();
for (String s : files){
System.out.println(s);
}
}
(8)遍历所有文件包括子目录下的文件
private static void print(File file) {
if (file != null){
if (file.isDirectory()){
File files[] = file.listFiles();
if (files != null){
for (int i = 0 ;i < files.length ; i++){
print(files[i]);
}
}
}else {
System.out.println(file);
}
IO
引入:谷歌logo
io原理
- I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于
处理设备之间的数据传输。如读/写文件,网络通讯等。 - Java程序中,对于数据的输入/输出操作以“流(stream)” 的
方式进行。 - java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
- 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
- 输出output:将程序(内存) 数据输出到磁盘、光盘等存储设备中。
流的分类
- 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
- 按数据流的流向不同分为:输入流,输出流
- 按流的角色的不同分为:节点流,处理流
解释:节点流和处理流
节点流:直接从数据源或目的地读写数据
处理流:
处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。