IO:就是数据的输入输出。对于输入输出问题,java将其抽象为流对象来解决。
对于不同的输入输出问题,会有相应的流对象提供解决方案。
IO流用来处理不同设备间的数据传输。(意义在于结合网络一起用)
java中用于操作流的类都封装在IO包中。
IO流分类:
A:按操作数据不同:字节流和字符流(1字符=2字节)文件存储的基本单位是字节。
B:按数据的流向不同:输入流和输出流
用window记事本打开能读懂的就用字符流(如.TXT文件)。其他的用字节流(如图像、音频文件)
File类
File既可以表示文件也可以表示文件夹。
构造方法
File(String pathname)
根据指定的路径创建File对象(
常用)
通过将给定路径名字符串转换为抽象路径名来创建一个新
File
实例。
File(String parent,String child)
根据指定的父文件夹和子文件或文件夹创建File对象。
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File
实例。
File(File parent,String child)
根据指定的父文件夹对象和子文件或文件夹创建File对象
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File
实例。
创建功能:
创建文件:
public boolean createNewFile()
throws IOException
true
;如果指定的文件已经存在,则返回
false
创建文件夹:
1、创建单级目录
public boolean mkdir();创建此抽象路径名指定的目录。
返回:当且仅当已创建目录时,返回true
;否则返回false
-
-
抛出:
- 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。
-
-
-
返回:
-
当且仅当已创建目录以及所有必需的父目录时,返回
true
;否则返回false
抛出:
-
SecurityException
- 如果存在安全管理器,且其
方法不允许验证指定目录和所有必需的父目录是否存在;或者SecurityManager.checkRead(java.lang.String)
方法不允许创建指定的目录和所有必需的父目录SecurityManager.checkWrite(java.lang.String)
-
当且仅当已创建目录以及所有必需的父目录时,返回
SecurityException
- 如果存在安全管理器,且其
方法不允许创建指定的目录 2、创建多级目录SecurityManager.checkWrite(java.lang.String)
public boolean mkdirs()
创建文件不写路径名称,则以当前项目目录为路径。
绝对路径:以盘符开始的路径
相对路径:不以盘符开始的路径
删除功能:
public boolean delete() 既可以删除文件也可以删除文件夹
- 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该 目录必须为空才能删除。
- java语言的删除不走回收站。
-
-
-
返回:
-
当且仅当成功删除文件或目录时,返回
true
;否则返回false
抛出:
-
SecurityException
- 如果存在安全管理器,且其
方法拒绝对文件进行删除访问SecurityManager.checkDelete(java.lang.String)
-
当且仅当成功删除文件或目录时,返回
判断功能:
public boolean exists():判断File对象是否存在public boolean isDirectory():判断File对象是否是文件夹public boolean isFile():判断File对象是否是文件public boolean isHidden():判断File对象是否隐藏public boolean canRead():判断File对象是否可读public boolean canWrite():判断File对象是否可写
获取功能:
public String getAbsolutePath():获取File对象的绝对路径public String getPath():获取File对象的相对路径public String getName():文件名称public long length():文件大小,单位是字节public long lastModified():返回File对象最后一次被修改的时间。
获取的时间是long型,转换成时间的表示形式Data d=new Data(1388307134000L);SimpleDataFormat sdf=new SimpleDataFormat("yyyy-MM-dd HH:mm:ss");System.out.println(sdf.format(d));public static File[] listRoots():列出可用的文件系统根目录。public String[] list():返回一个字符串数组,返回指定目录下的所有目录和文件的名称。public File[] listFiles():返回一个File对象数组,这返回指定目录下的所有目录和文件的对象。文件名过滤器
public interface FilenameFilter
实现此接口的类实例可用于过滤器文件名。Abstract Window Toolkit 的文件对话框组件使用这些实例过滤 File
类的 list
方法中的目录清单。
public String[] list(FilenameFilter filter)
-
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的字符串必须满足过滤器外,此方法的行为与
方法相同。如果给定list()
filter
为null
,则接受所有名称。否则,当且仅当在此抽象路径名及其表示的目录中的文件名或目录名上调用过滤器的
方法返回FilenameFilter.accept(java.io.File, java.lang.String)
true
时,该名称才满足过滤器。
/*
* 获取指定目录下指定后缀的文件名称:
* A:先获取指定目录下所有文件或者文件夹的File数组,然后再遍历的时候进行判断。满足条件的就输出该File的名称。
* B:直接获取指定目录下满足条件的String(File)数组。然后遍历数组即可。
*
* 文件名称过滤器:FilenameFilter
* public String[] list(FilenameFilter filter)
*/
public class FileDemo {
public static void main(String[] args) {
// 封装目录
File file = new File("d:\\");
// 获取满足条件的数组
String[] strArray = file.list(new FilenameFilter() {//匿名内部类
@Override
public boolean accept(File dir, String name) {//dir -->new File("d:\\");
// 判断是否是文件,是否是以.mp4结尾
// System.out.println(dir + "---" + name);
File file = new File(dir, name); // d:\我的文档
boolean flag = file.isFile();
boolean flag2 = name.endsWith(".mp4");
return flag && flag2;
}
});
// 遍历字符串数组
for (String str : strArray) {
System.out.println(str);
}
}
}
IO流:
字节流:
字节流输入 读取数据InputStream
字节流输出 写入数据OutputStream
字符流:
字符流输入 读取数据Reader --- FileReader
字符流输出 写入数据Writer ---FileReader
FileWriter底层自动创建文件
创建字符输出流对象做了几件事情:
A:调用系统功能创建了文件
B:创建字符输出流对象
C:把字符输出流对象指向创建的文件
字符输出流写入数据步骤:
FileWriter fw=new FileWriter("a.txt");
fw.write("hello,wrold");//写入数据
fw.flush();//刷新缓冲区
fw.close();//释放资源
为什么要close();(先刷新,再关闭,再释放资源)
1、让流对象变成垃圾
2、通知系统去释放和文件相关的资源。系统功能创建的文件,系统就会消耗资源去管理文件。
把字符流写入到文件中的步骤:
1、把字符数据存到缓冲区
2、刷新缓冲区
3、释放资源
字节流是直接写入文件中
为什么FileWriter没有无参构造方法:因为写数据一定要明确写到哪里。
flush()和close()的区别
flush():只刷新缓冲区,流对象还可以继续使用
close():先刷新缓冲区,再关闭流对象,流对象不可以继续被使用
写字符流数据的方法:
public void write(int c)写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。
public void write(char[] cbuf)写入字符数组。public abstract void write(char[] cbuf,int off,int len)写入字符数组的某一部分。public void write(String str)写入字符串。public void write(String str,int off,int len)写入字符串的某一部分。
写数据如何换行:
不同的操作系统对换行符的要求不一样。
Windows是:\r\n
linux:\n mac:\r
数据每次都把以前的数据覆盖了,如何追加写入?
修改构造方法:用FileWriter(String fileName, boolean append)
;追加写入如果文件存在不重写创建,不是追加写入,文件存在也会重新创建
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。 |
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。 |
FileWriter(FileDescriptor fd) 构造与某个文件描述符相关联的 FileWriter 对象。 |
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。 |
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。 |
close()要放到fanally中。
读文件:FilrReader类
public class FileReader extends InputStreamReader
用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
FileReader
用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream
。
A:创建字符输入流对象
B:调用读取数据功能,并显示
C:释放资源
读取数据时要保证读取的文件一定存在。
读取数据:
public int read() 读取数据并自动移动到下一位。 throws IOException
-
读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
用于支持高效的单字符输入的子类应重写此方法。
-
-
-
返回:
- 作为整数读取的字符,范围在 0 到 65535 之间 ( 0x00-0xffff),如果已到达流的末尾,则返回 -1 抛出:
-
IOException
- 如果发生 I/O 错误
read() 读取数据返回int类型,并自动移动到下一个数据位置等待读取。数据的读取和显示操作是重复的,用循环。控制条件(如果已到达流的末尾,则返回 -1)如果数据没有了,则返回-1.
int ch=0;
while((ch=fr.read())!=-1){
System.out.println((char) ch);
}
public int read(char[] cbuf)一次读取一个字符数组 char[]数组的长度一般定义为1024的整数倍。
throws IOException
- 将字符读入数组。在某个输入可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
-
-
-
参数:
-
cbuf
- 目标缓冲区
返回:
- 读取的字符数,如果已到达流的末尾, 则返回 -1 抛出:
-
IOException
- 如果发生 I/O 错误
-
0-len是防止空字符显示。