Java中的输入输出流(一)
输入输出流
就是对文件进行读【打开】写【修改】操作的java类库文件
就是把数据持久化到磁盘的载体文件的组成
1.文件的属性【文件名称,文件大小,文件类型,创建时间…】
2.文件内容【输入输出流】
我们要想通过java提供的输入输出流读写文件中的内容就得先学会操作文件。
Java中为我们提供了一个专门操作文件的java类 —> java.io.File类
一、File类的对象创建和常用方法
File类的定义
public class File
File类的静态成员变量
static String | pathSeparator 与系统相关的路径分隔符字符,为方便起见,表示为字符串 |
---|---|
static char | pathSeparatorChar 与系统相关的路径分隔符 |
static String | separator 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串 |
static char | separatorChar 与系统相关的默认名称分隔符 |
例如:
package com.wangxing.test1;
import java.io.File;
public class TestFile1 {
public static void main(String[] args) {
//static String pathSeparator 与系统相关的路径分隔符字符,为方便起见,表示为字符串。
//static char pathSeparatorChar 与系统相关的路径分隔符。
//static String separator 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。
//static char separatorChar 与系统相关的默认名称分隔符。
System.out.println("static String pathSeparator=="+File.pathSeparator);
System.out.println("static char pathSeparatorChar=="+File.pathSeparatorChar);
System.out.println("static String separator=="+File.separator);
System.out.println("static char separatorChar=="+File.separatorChar);
//separator/separatorChar---路径分割符号【\】
//假设我输出一个文件的路径【F:\test\name.text】
System.out.println("文件的路径--F:\test\name.text");
//此时我们输出的文件路径不正确,因为java程序将字串中的“\t”解释成制表符,
//将“\n”解释成了回车输出,此时我们就无法正确的输出/描述一个文件路径。
//我们要怎么办,可以通过“\\”将文件的路径分割符转义。
System.out.println("文件的路径--F:\\test\\name.text");
//既然我们可以通过“\\”转义路径分隔符,那么为什么还需要File类提供静态成员变量来表示路径分割符???
//原因1:在=使用的时候并不全知道"\"与哪一个字母组合就会是一个特殊字符。
//原因2:不同的计算机操作系统的路径分割符是不一样 例如"\"windows操作系统分隔符 "/"Linux分隔符.
//为了不配特殊字符和可以在任何操作系统上完整的表示一个路径分割符号,
//所以java就将路径分割符号做成了静态成员变量,以适应不同的操作系统和排除特殊字符。
System.out.println("文件的路径--F:"+File.separator+"test"+File.separator+"name.text");
}
}
运行结果:
构造方法:
File(String pathname) | 通过给定的文件路径字符串创建新的 File实例 |
---|---|
File(String parent, String child) | 通过给定的文件位置字符串和给定的文件名称字符串创建新的 File实例 |
File(File parent, String child) | 通过给定的文件位置File对象和给定的文件名称字符串创建新的 File实例 |
例如:
package com.wangxing.test1;
import java.io.File;
public class TestFile2 {
public static void main(String[] args) {
//File(String pathname) 通过给定的文件路径字符串创建新的 File实例。
String filepath1="F:"+File.separator+"test"+File.separator+"names.text";
File file1=new File(filepath1);
//File(String parent, String child) 通过给定的文件位置字符串和给定的文件名称字符串创建新的 File实例。
String path1="F:"+File.separator+"test";
String name="names.txt";
File fil2=new File(path1,name);
//File(File parent, String child) 通过给定的文件位置File对象和给定的文件名称字符串创建新的 File实例。
String path2="F:"+File.separator+"test";
File filepath2=new File(path2);
String name2="names.txt";
File file3=new File(filepath2,name2);
}
}
注意:文件File类的对象创建以后,不会生成实际的文件。
实例方法:
boolean exists() 判断路径名表示的文件或目录是否存在。
boolean createNewFile() 创建新文件
boolean mkdirs() 创建新的文件夹
boolean delete() 删除文件/文件夹
删除文件夹的时候要将该文件夹下的文件和子文件夹全部删除
boolean canRead() 判断文件是否可读
boolean canWrite() 判断文件是否可写
boolean isHidden() 判断文件是否为隐藏文件。
boolean isFile() 判断文件对象是否为普通文件。
boolean isDirectory() 判断文件对象是否为目录。
String getPath() 得到文件对象的路径名字符串。
String getName() 得到文件对象所表示的文件或目录的名称。
String getParent() 得到文件对象所表示的路径的父目录路径
long length() 得到文件对象所表示的文件的长度。
long lastModified() 得到文件对象所表示的文件上次修改的时间。
String[] list() 得到文件对象代表的文件夹中的所有文件和文件夹名称返回一个字符串数组
File[] listFiles() 得到文件对象代表的文件夹中的所有文件和文件夹的文件对象,返回一个文件对象数组
例如:
package com.wangxing.test1;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestFile3 {
public static void main(String[] args)throws Exception {
String path="F:"+File.separator+"test";
String filepath="F:"+File.separator+"test"+File.separator+"names.txt";
//创建保存文件夹的文件对象
File file1=new File(path);
//创建保存文件的文件对象
File file2=new File(filepath);
/*
//创建文件夹
//boolean exists() 判断路径名表示的文件或目录是否存在。
System.out.println(file1.exists());
if(!file1.exists()) {
//boolean mkdirs() 创建新的文件夹
boolean dirfile=file1.mkdirs();
if(dirfile) {
if(!file2.exists()) {
//boolean createNewFile() 创建新文件
file2.createNewFile();
}
}
}else {
//boolean delete() 删除文件/文件夹
//删除文件夹的时候要将该文件夹下的文件和子文件夹全部删除
file1.delete();
}
*/
//boolean canRead() 判断文件是否可读
System.out.println("canRead=="+file2.canRead());
//boolean canWrite() 判断文件是否可写
System.out.println("canWrite=="+file2.canWrite());
//boolean isHidden() 判断文件是否为隐藏文件。
System.out.println("isHidden=="+file2.isHidden());
//boolean isFile() 判断文件对象是否为普通文件。
System.out.println("isFile=="+file2.isFile());
//boolean isDirectory() 判断文件对象是否为目录。
System.out.println("isDirectory=="+file1.isDirectory());
//String getPath() 得到文件对象的路径名字符串。
System.out.println("getPath=="+file2.getPath());
//String getName() 得到文件对象所表示的文件或目录的名称。
System.out.println("getName=="+file2.getName());
//String getParent() 得到文件对象所表示的路径的父目录路径
System.out.println("getParent=="+file2.getParent());
//long length() 得到文件对象所表示的文件的长度。
System.out.println("length=="+file2.length()+"字节");
//long lastModified() 得到文件对象所表示的文件上次修改的时间。
String time=new SimpleDateFormat("yyyy/MM/dd E HH:mm").format(new Date(file2.lastModified()));
System.out.println("lastModified=="+time);
}
}
运行结果:
package com.wangxing.test1;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestFile4 {
public static void main(String[] args)throws Exception {
/*
//得到指定的文件夹下的文件和子文件夹名称
String path="F:"+File.separator+"20200728"+File.separator+"java基础"+File.separator+"20200822java(19)";
File file1=new File(path);
String names[]=file1.list();
for(String name:names) {
System.out.println(name);
}
*/
//得到指定的文件夹下的文件和子文件夹对象
String path="F:"+File.separator+"20200728"+File.separator+"java基础"+File.separator+"20200822java(19)";
File file1=new File(path);
File files[]=file1.listFiles();
for(File f:files) {
//得到子文件/子文件夹的名称
String name=f.getName();
//得到子文件/子文件夹的修改时间
String time=new SimpleDateFormat("yyyy/MM/dd E HH:mm").format(new Date(f.lastModified()));
//判断文件对象是否是一个文件
String len="";
String type="";
if(f.isFile()) {
len=f.length()+"字节";
type=getType(name);
}
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append(name+"\t");
stringBuilder.append(time+"\t");
stringBuilder.append(type+"\t");
stringBuilder.append(len);
System.out.println(stringBuilder.toString());
}
}
/**
* 得到文件类型
* @param name
* @return
*/
public static String getType(String name) {
String type="";
String houz=name.substring(name.lastIndexOf("."));
if(houz.equalsIgnoreCase(".mp4")) {
type="MP4文件";
}
if(houz.equalsIgnoreCase(".docx")) {
type="DOCX文档";
}
if(houz.equalsIgnoreCase(".chm")) {
type="编译的html文件";
}
if(houz.equalsIgnoreCase(".java")) {
type="java源文件";
}
if(houz.equalsIgnoreCase(".html")) {
type="网页文件";
}
return type;
}
}
二、IO流的划分与区别【字节流与字符流】
IO流用来读写文件的内容
流 —> 数据的流动轨迹。
1. 按照数据的流动方向
输入流—将数据读取到我们的处理程序中所形成的数据的流动轨迹就是输入流【读取数据】
输出流—将我们程序处理以后的数据写出到某一个文件中所形成的数据的流动轨迹就是输出流【写出数据】
2. 按照每一次读写数据的大小
字节流—每一次读写一个字节【8位2进制】的数据量的流【字节流】
由于所有的数据都可被换算成字节,所以字节流是可以读写任何类型的数据 【文本,视频,音频,图片】
字符流—每一次读写一个字符【16位2进制】的数据量的流【字符流】
不能读写任何类型的数据,只能读写文本类型的数据。
IO流的综合划分
总结
下一篇: 不用strlen获取字符串长度的汇编指令