File和IO
读写文件
如前所述,一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图。
字节流和字符流的区别:
文件 都是用二进制存储,就是0和1。所以我们可以使用字节流操作任何文文档 视频 图片(可以一半) 音频
如果是文档的话,因为有编码格式。不同编码格式对字节的操作不同,所以为了方便用字符流。字符流=字节流+编码格式、
FileInputStream
该流用于从文件读取数据,它的对象可以用关键字 new 来创建。
有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f = new FileInputStream("C:/java/hello");
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:
File f = new File("C:/java/hello");
InputStream in = new FileInputStream(f);
创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作。
方法 | 描述 |
---|---|
close() | 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
finalize() | 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
read(int r) | 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。 返回下一字节数据,如果已经到结尾则返回-1。 |
read(byte[] r) | 这个方法从输入流读取r.length长度的字节。 返回读取的字节数。如果是文件结尾则返回-1。 |
available() | 返回下一次对此输入流调用的方法可以不 受阻塞地从此输入流读取的字节数。返回一个整数值。 |
FileOutputStream
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:/java/hello",true); //拼接写入
OutputStream f = new FileOutputStream("C:/java/hello",false);//覆盖写入
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("C:/java/hello");
OutputStream fOut = new FileOutputStream(f);
创建OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作。
序号 | 方法及描述 |
---|---|
1 | public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
2 | protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
3 | public void write(int w)throws IOException{} 这个方法把指定的字节写到输出流中。 |
4 | public void write(byte[] w) 把指定数组中w.length长度的字节写到OutputStream中。 |
File类
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
File对象代表磁盘中实际存在的文件和目录。通过以下构造方法创建一个File对象。
通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。
File(File parent, String child);
通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
File(String pathname)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(String parent, String child)
通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
File(URI uri)
创建File对象成功后,可以使用以下列表中的方法操作文件。
递归删除
//先判断是否是文件夹
if(file.isDirectory()){
File[] files = file.listFiles();
for (File file2 : files) {
deleteFile(file2);
}
}
file.delete();
复制文件夹
public static void copyDir(File file,File file1) throws IOException {
/文件夹不存在 创建文件夹
if (!file1.exists()) {
file1.mkdirs();
}
//获取文件夹下文件
File[] files = file.listFiles();
for (File f : files) {
//是文件夹 继续递归
if (f.isDirectory()) {
copyDir(f,new File(file1.getPath(),f.getName()));
} else if (f.isFile()){
//是文件,实现复制
copy(f,new File(file1.getPath(),f.getName()));
}
}
}
复制文件
/复制文件
public static void copy(File resource,File target) throws IOException{
FileInputStream fis = new FileInputStream(resource);
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream(target);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = bis.read(bytes))!=-1){
bos.write(bytes,off,len);
}
bos.close();
bis.close();
fos.close();
fis.close();
}
Buffer流
字符流有缓冲区,先讲数据存放在缓冲区,数据读完在统一序列化。字节流+缓冲区