Io流
输入:读取-----文件到电脑内存查看
输出:写入-----内存到文件对文件进行编辑.
Java中的IO主要包括三个部分:
1.流式部分----IO的主体部分
2.非流式部分----辅助流式部分.如File类
3.文件读取部分和安全相关的类
主要讲解File类与如何操作IO流
Java IO流可以概括为:两个对应,一个桥梁、
两个对应:字节流、字符流的对应,输入和输出流的对应
一个桥梁:字节流到字符流的桥梁。
表示流的四个抽象类:InputStream、OutputStream、Reader、Writer
File类:(配合FileInputStream和FileOutputStream使用)
1.是文件和目录路径名的抽象形式,它提供了与平台无关的方法来对磁盘上的文件或目录进行操作。
2.使用File类可以获取文件本身的一些信息,例如文件所在的目录,文件长度,文件读取权限等java中,File类是java.io包中唯一代表磁盘文件本身的对象。
3.File表示处理文件和文件系统的相关信息。File类不具有从文件读取信息和向文件写入信息的功能,它仅描述文件本身的属性。(只能进行文件和目录的删除和创建不能进行读取和写入)
创建File对象File file=new File(“文件路径”);----只了解第二种–通过给定的路径名字符串转换成抽象路径–该路径不一定存在--------在使用时如果没有该路径那么将会出现异常
File类的常用方法:
file.getPath();获取给定的构造方法中的路径
file.getAbsolutePath();获取给定构造方法的绝对路径—具体路径
file.getName();获取文件夹或文件的名字-----对绝对路径的最后一个名字
file.isFile();判断是否是文件—返回boolean值
file.exists();判断是否存在文件或目录----对绝对路径的最后一个文件(目录)名,与真实路径进行对比返回boolean值
file.isDirectory();判断是否是目录–判断对绝对路径的最后一个名字
file.canRead();判断是否可读—对绝对路径的最后一个名字(文件)–返回boolean值
file.canWriter();判断是否可写–对绝对路径的最后一个名字(文件)–返回boolean值
file.canExecute();判断是否可执行—返回boolean值—判断给定的路径是否可行
file.length();获取文件直接大小----返回long
file.createNewFile();创建文件----返回boolean对绝对路径的最后一个名字(文件)
file.mkdir();创建一个文件夹—返回boolean值—对绝对路径的最后一个文件夹
file.mkdirs();创建多重目录—返回boolean值—对绝对路径所有文件夹–前提是不存在
file.delete();删除文件或文件夹—返回boolean值—对绝对路径的最后一个文件夹(为空)或文件
file.list();返回此文件夹所在的所有文件或文件名—返回String[]–对绝对路径的最后一个文件夹内的文件或文件夹
file.listFiles();返回(File[])此文件夹内所有文件或文件夹的File对象—对绝对路径的最后一个文件夹内的文件或文件夹具体使用如下{
使用绝对路径创建对象—指定一个具体文件路径
File file=new File(“D:/DATA/学生名单”);
使用相对路径创建对象
File file=new File("./");//.代表系统当前路径—指定当前路径
返回构造方法中的路径----获取构造方法的内容4
该路径不一定存在–方法都是对这个字符串路径操作
System.out.println(file.getPath());
获取此文件夹或文件的绝对路径----获取构造方法代表的具体路径
System.out.println(file.getAbsolutePath());
获取文件或文件夹(目录)的名字----根据绝对路径获取路径最后一个文件或文件夹的名称
System.out.println(file.getName());
------------------------------对真实路径操作
判断文件或文件夹是否存在、根据绝对路径获取路径最后一个文件或文件夹的名称–与计算机真实路径进行对比
System.out.println(file.exists());
新建一个文件—是给定字符串路径不存在时、根据绝对路径获取路径最后一个文件的名称–
此方法可能会出现异常–要进行异常处理
try {
System.out.println(file.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
新建一个文件夹–创建不存在的单层目录—根据绝对路径获取路径最后一个文件夹的名称–
System.out.println(file.mkdir());
新建多重文件夹—当指定字符串路径的文件夹都不存在时
System.out.println(file.mkdirs());
删除文件或文件夹—删除文件夹时文件夹必须为空—根据绝对路径获取路径最后一个文件夹或文件的名称–
System.out.println(file.delete());
获取文件夹内的文件和文件夹名称—根据绝对路径获取路径最后一个文件夹或的名称–
String[] str=file.list();
for (String s : str) {
System.out.println(s);
}
获取文件夹内的文件及文件夹对象----可对内部文件夹在进行操作
该方法一般用于获取目录中所有文件及其子目录中的所有文件
根据绝对路径获取路径最后一个文件或文件夹的名称
File []f1=file.listFiles();
for (File fs : f1) {
if (fs.isFile()) {//是文件则获取名称
System.out.println(fs.getName());
}else {//不是文件则获取其子目录的文件—
File []f2=fs.listFiles();
for (File fss : f2) {
if (fss.isFile()) {//是文件则获取名称
System.out.println(fss.getName());-----同理
}
}
}
判断是否是文件—根据绝对路径获取路径最后一个文件或文件夹的名称–与计算机真实路径进行对比
System.out.println(file.isFile());
}
字节流(计算机中所有文件都是以字节的形式存在)
1.java中的字节流根据流向不同,分为输入和输出流。
2.字节输入流的父类是InputStream,它是一个抽象类。
3.字节输出流的父类是OutputStream,它是一个抽象类。
4.字节流可以处理所有文件类型的数据(图片、视频、文本…)
输入流:
根据需要使用-----------------------------------------------------三种方法–可能引发的异常
Read方法读取一个字节返回的是读取数据的编码
int n=0;
while((n=Fi.read())!=-1){//一个字节一个字节的读取
char a=(char) n;//返回的是该字节代表的编码//用char类型转化
System.out.print(a);
}
Read(byte[]b)方法返回的是读取的字节数
// 一次读取的字节数使用while反复使用直到读取完文件
// 最后一次读取不到指定的字节数时会重复-----解决:
//使用 String str = new String(b,0,n);
//b是字节数组,0是开始转化的索引位置,n是结束的索引位置
byte[] b = new byte[10];
int n = 0;// 该方法返回的是读取字节数
while ((n = Fi.read(b)) != -1) {
String str = new String(b);
System.out.println(n);
System.out.println(str);
}
第三种方法…定义一个数组----读取的数据从哪一个数组索引处开始存起off–存多少个len
--------无论是输入流函数输出流都要使用.close();方法进行关闭—还要判断输入/输出==null;
输出流:
Write(int n)写入指定的n字节编码所代表的的字符
FO = new FileOutputStream(“D:/XYL/TXT2.txt”);// 如果结尾文件不存在则会创建一个文件
String str = “chen”;// 如果要写入的文件中有信息那么这些信息将会被覆盖
FO.write(str.getBytes());// 将字符串转化为字节编码数组写入
String str2 = “ying”;// 结合for循环可多行使用
FO.write(str2.getBytes());
FO.write(97);//将编码所代表的的字符写入到指定文件中
// byte[]b=new byte[10];
// FO.write(b);
//将字节数组b中的数字转化为对应的字符写入
// FO.write(b, 0, n);//b是字节数组,0是开始写入的索引位置,n是结束的索引位置
字符流:
Reader是一个字符输入流,以char为单位读取
Writer是一个字符输出流,以char为单位读取
为了提高字符流的读写效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。BufferedReader
用于加快读取字符的速度,BufferedWriter用于加快写入速度。
使用字符串的文件名类输入/输出流创建对象或使用文件对象来创建输入/输出对象
BufferedReader BR=new BufferedReader(“D:/XYL/TXT.txt”); BufferedWriter bw=new BufferedWriter(“D:/XYL/TXT.txt”);
或 或
FileReader fr = new FileReader(“D:/XYL/TXT.txt”); FileWriter fr = new FileWriter(“D:/XYL/TXT.txt”);
BufferedReader BR=new BufferedReader(fr); BufferedWriter bw=new BufferedWriter(fr);
文件的读取和写入都要先存入缓冲区--------缓冲区存满或者是文件存完后进行读取和写入—再存入缓冲区—直到文件读取写入完毕
read();读取一个字符返回该字符的编码
int n=0;
while((n=BR.read())!=-1){----一个字符一个字符的读取返回该字符的编码
char a1=(char) n;
System.out.println(a1);
}
read(char[]cbuf ,int off ,int len);将字符读入char数组的某一部分–返回读取的字符数
存入数—读取的数据从哪一个数组索引处开始存起off–存多少个len
readLine();-------读取一行—返回String
String str=" ";//结合while使用读取多行
while ((str=BR.readLine())!=null) {
System.out.println(str);
}
skip(long n);-----跳过某个字符—返回该字符的下标
ready();----判断此流是否准备好呗读取—读取之前进行判断—返回boolean值
close();----关闭流----进行判断—流是否为空
------------------------------------------
mark();标记流中的当前位置
reset();将流重置到最新的标记
-------------------------------------------------------
writer();----写入单个字符----括号内填写字符代表的编码
writer(char[]cbuf ,int off ,int len);-----写入字符数组的某一部分类比读取
将char数组指定部分的内容写入
String str=“我是谁”;或char []str=new char[]{‘我’,‘是’,‘谁’};
bw.write(str,0,2);从0下标开始写入2个
writer(String s,int off ,int len);----写入字符串的某一部分
将字符串指定部分的内容写入
writer(String s);------写入字符串
String str=“我”;或char str=‘我’;
bw.write(str);
newLine();----换行
flush();刷新流该流的缓冲
字节流处理单元为1个字节,操作字节和字节数组。
字节流可以读写字符,二进制,音频,可以是各种各样的文件,只要符合字节形式存储的都可以
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,
字符流只能读写字符这一种类型文件
Java IO流中提供了两种用于将字节流转换为字符流的转换流
InputStreamReader字节输入流转换为字符输入流
OutputStreamWriter字节输出流转换为字符输出流。
使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集
InputStreamReader:字节输入流转换为字符输入流,创建使用指定字符集的 InputStreamReader,如果不指定字符集就使用默认字符集创建InputStreamReader。转换之后可以不用关闭InputStream
InputStreamReader含有方法有:
1、close():关闭此流
2、getEncoding():获取此流使用的字符编码的名称
3、ready():判断此流是否已经准备好用于读取
4、read():读取单个字符。
read(char[],int offset ,int length),将字符读入数组的某一部分
OutputStreamWriter::字节输出流转换为字符输出流,创建使用指定字符集的 OutputStreamWriter,如果不指定字符集就使用默认字符集创建OutputStreamWriter。转换之后可以不用关闭OutputStream
OutputStreamWriter含有方法有:
1、flush():刷新该流的缓冲
2、close():关闭此流,关闭前需要刷新
3、getEncoding():获取此流使用的字符编码的名称。
4、write():write(char[] ,int offset ,int length),写入字符数组的某一部分
5、write(String ,int offset ,int length),写入字符串的某一部分
6、write(String ),写入单个字符