File, IO字节流和字符流
一,File
1.File 文件或者目录的抽象表现形式
public class Class001_File {
public static void main(String[] args) {
//File(String pathname)
File file = new File("D://");
File file2 = new File("D:/AAA/BBB");
File file3 = new File("D:\\install_package\\ZoomIt");
File file4 = new File("D:\\test.txt");
//File(String parent, String child)
File file5 = new File("D:\\","test.txt");
//File(File parent, String child)
File file6 = new File(file,"test.txt");
System.out.println(file);
System.out.println(file2);
System.out.println(file3);
System.out.println(file4);
System.out.println(file6);
}
}
2.File常用方法
public class Class002_FileMthod {
public static void main(String[] args) throws IOException {
File file = new File("D://test.txt");
File file2 = new File("D://AAA/BBB/test.txt");
File file3 = new File("D://test.txt");
//boolean setReadOnly() 标记此抽象路径名指定的文件或目录,以便仅允许读取操作。
//System.out.println(file.setReadOnly());
//boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。
//System.out.println(file.canWrite());
//boolean createNewFile() 当且仅当具有此名称的文件尚不存在时,以原子方式创建由此抽象路径名命名的新空文件。 注意: 不能创建文件夹,只能创建文件
System.out.println(file.createNewFile()); //true
//boolean delete() 删除此抽象路径名表示的文件或目录。
System.out.println(file.delete());
//boolean equals(Object obj) 测试此抽象路径名与给定对象的相等性。
System.out.println(file==file3);
System.out.println(file.equals(file3));
//boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
if(!file.exists()){
System.out.println("文件不存在,创建"+ file.createNewFile());
}
//File getAbsoluteFile() 返回此抽象路径名的绝对形式。
//String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
File file4 = new File("gaga/haha.txt"); //相对路径 : 默认相对于项目
System.out.println(file4.getAbsolutePath());
System.out.println(file4.getAbsoluteFile());
//long getFreeSpace() 通过此抽象路径名返回分区 named中未分配的字节数。
File file5 = new File("D://");
System.out.println(file5.getFreeSpace());
//long getTotalSpace() 通过此抽象路径名返回分区 named的大小。
System.out.println(file5.getTotalSpace());
//String getName() 返回此抽象路径名表示的文件或目录的名称。
System.out.println(file.getName());
//String getParent() 返回此抽象路径名父项的路径名字符串,如果此路径名未指定父目录,则返回 null 。
//File getParentFile() 返回此抽象路径名父项的抽象路径名,如果此路径名未指定父目录,则返回 null 。
System.out.println(file.getParent());
System.out.println(file.getParentFile());
//boolean isAbsolute() 测试此抽象路径名是否为绝对路径。
//boolean isDirectory() 测试此抽象路径名表示的文件是否为目录。
//boolean isFile() 测试此抽象路径名表示的文件是否为普通文件。
//boolean isHidden() 测试此抽象路径名指定的文件是否为隐藏文件。
System.out.println(file.isFile());
System.out.println(file.isDirectory());
//long lastModified() 返回上次修改此抽象路径名表示的文件的时间。
System.out.println(new SimpleDateFormat().format(new Date(new File("D://vvv.txt").lastModified())));
//long length() 返回此抽象路径名表示的文件的长度。
File file7 = new File("D://vvv.txt");
System.out.println(file7.length());
File file8 = new File("D:\\DDD\\AAA");
//File[] listFiles() 返回一个抽象路径名数组,表示此抽象路径名表示的目录中的文件。
System.out.println(Arrays.toString(file8.listFiles()));
//String[] list() 返回一个字符串数组,用于命名此抽象路径名表示的目录中的文件和目录。
System.out.println(Arrays.toString(file8.list()));
File file9 = new File("D:\\AAA\\BBB");
//boolean mkdir() 创建此抽象路径名指定的目录。
//System.out.println(file9.mkdir());
//boolean mkdirs() 创建此抽象路径名指定的目录,包括任何必需但不存在的父目录。
System.out.println(file9.mkdirs());
//boolean renameTo(File dest) 重命名此抽象路径名表示的文件。
//下课测试: renameTo能否实现跨盘符重命名
System.out.println(file7.renameTo(new File("D://haha.txt")));
}
}
二,IO流
File 类 只能操作文件外部的内容,无法操作文件内部内容的读写
流:
数据以先入先出的顺序进行传输,流就是管道,就是用来 传输数据的IO 流
java提供了一个io包,提供了很多类,提供了很多功能能够实现数据的读写数据源 : 数据从数据源写出
目的地 : 从目的地中把数据读如来
数据源 --> 数据 --> 目的地流的分类:
流向分: 以大脑为中心 | 以程序为中心
输入流
输出流
操作单元分:
字节流 : 万能流-> 管道中的数据以字节为单位 ****
字符流 : 以字符为单位
功能分:
节点流 : 能够实现读写能力的
功能流 : 增强节点功能与性能的流 站在不同的层面进行以上的分类,但是都是相辅相成的
节点流 字节流
字节输入流 InputStream -> 输入字节流的父类->抽象类->不能实例化
文件字节输入流 FileInputStream -> 具体的类 ->可以实例化
数组流
public class Class001_IODemo {
public static void main(String[] args) throws Exception {
//1.创建输入流
//FileInputStream(String name) 参数: name 数据源文件的路径
//FileInputStream(File file) 参数: file 数据源文件的路径的file对象
InputStream src = new FileInputStream("D://test.txt");
//2.读入数据
//int read() 从此输入流中读取一个字节的数据。 已经到达文件末尾没有读到数据 返回-1
/*int num = src.read();
System.out.println((char)num);
System.out.println((char)(src.read()));
System.out.println((char)(src.read()));
System.out.println(src.read());*/
//优化 : 重复读入--> 循环读取
int result = -1; //存储每次读入的数据
while((result = src.read())!=-1){
System.out.println((char)result);
}
//3.关闭
src.close();
}
}
1.字节输入流
每次读入一个字节的数据,循环读入
优化:每次读取一车数据(字节数组),重复读入int read(byte[] b)
package com.xx.io;
import java.io.*;
public class Class_InputStream02 {
public static void main(String[] args) throws IOException {
File file=new File("D://AAA/test.txt");
InputStream is=new FileInputStream(file);//输入流
byte[] a=new byte[1024];
int len=0;
while ((len=is.read(a))!=-1){
System.out.println(new String(a,0,len));
}
}
}
2.字节输出流
字节流 节点流 输出流
字节输出流 OutputStream 抽象父类 不能实例
文件字节输出流FileOutputStream 具体子类 实例
注意;
写出内容默认覆盖源文件内容
目标文件不存在会在系统默认构建
目标文件所在的路径不存在,系统不会构建
public class Class001_OutputStream {
public static void main(String[] args) throws IOException {
//1.构建输出流
//FileOutputStream (String name) 参数name为目的地路径字符串
//FileOutputStream (File file) 参数file为目的地路径file对象
//FileOutputStream (File file, boolean append) 参数append是否追加数据,默认不追加覆盖,true->追加
//FileOutputStream(String name, boolean append)
OutputStream os = new FileOutputStream("D://test.txt",true);
//2.写出数据
//void write(int b) 将指定的字节写入此文件输出流。
os.write(98);
os.write(99);
//3.刷出
os.flush();
//4.关闭
os.close();
}
1.一车字节数据写出 (byte[])
2.异常捕获
*/
package com.xx.io;
import java.io.*;
public class Class_OutputStream02 {
public static void main(String[] args) {
//创建输出流
OutputStream os=null;
try {
os=new FileOutputStream("D://AAA/tst.txt");
//准备数据
String str="安慰的淘汰";
byte[] a=str.getBytes();
os.write(a);//写出
os.flush();//刷出
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.字节文件拷贝
源文件
字节输入流
程序(中转站)
字节输出流
目的地新文件
package com.xx.io;
import java.io.*;
public class Copyfile01 {
public static void main(String[] args) {
//创建输入,输出流
InputStream is=null;
OutputStream os=null;
try {
is=new FileInputStream("D://AAA/tst.txt");
os=new FileOutputStream("D://AAA/haha.txt");
//数组车
byte[] a=new byte[1024];
int len=0;
while ((len=is.read(a))!=-1){
os.write(a,0,len);
os.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4,字符输入输出流
字符流 节点流
字符输入流 Reader
文件字符输入流 FileReader
字符输出流 Writer
文件字符输出流 FileWriter
注意:
子类无新增方法需要使用,可以多态指向
public class Class001_IO {
public static void main(String[] args) throws IOException {
//1.构建流
Reader rd = new FileReader("D://haha.txt");
//2.读入
//System.out.println((char)(rd.read())); 每次读入一个字符数据
//字符数组
char[] car = new char[1024];
int len = -1;
//int read(char[] cbuf) 将字符读入数组。
while((len = rd.read(car))!=-1){
System.out.println(new String(car,0,len));
}
//3.关闭
rd.close();
}
}
字符输出流 Writer
文件字符输出流 FileWriter
public class Class002_IO {
public static void main(String[] args) throws IOException {
//1.构建流
Writer wt = new FileWriter("D://xixi.txt",true);
//2.准备数据
String msg = "喜洋洋与灰太羊";
//3.写出
wt.write(msg);
//4.刷出
wt.flush();
//5.关闭
wt.close();
}
}
5.字符流文件拷贝
package com.xx.io;
import java.io.*;
public class Class_chario03 {
public static void main(String[] args) {
Reader rd = null;
Writer wt = null;
try {
rd = new FileReader("D://AAA/tst.txt");
wt = new FileWriter("D://AAA/haha.txt");
char[] a = new char[1024];
int len = 0;
while ((len = rd.read(a)) != -1) {
wt.write(a, 0, len);
wt.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (wt!=null){
try {
wt.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(rd!=null){
try {
rd.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}