File类学习
一、File类的概述
- File是文件和目录路径名的抽象表时
- 对于File而言,它封装的并不是一个真正的存在的文件,仅仅是一个路径,它可以是存在的,也可以是不存在的,通过操作这个路径变成具体存在
二、构造方法
- File(String pathname):通过给定路径名字符串来创建File实例
File f1 = new File("C:\\tool\\1.txt");
- File(String parent,String child):从父路径名字符串和子路径名字符串创建File实例
File f2 = new File("C:\\tool","1.txt");
- File(File parent,String child):从父实例存储的路径和子路径名创建File实例
File f3 = new File("C:\\tool");
File f4 = new File(f3,"1.txt");
I/O流概述
字节流
一、使用情况
如图片,视频等非纯文本,使用字节流打开,不确定就选字节流
二、字节流写数据
- OutputStream是抽象类,是所有字节输出流的超类
- FileOutputStream:文件输出流,用于将数据写入文件里
三、FileOutputStream的使用方法
- FileOutputStream(String name):创建文件输出流以指定的名称写入文件,指定的文件名称不存在则会创建,父目录不存在则报错。
- FileOutputStream(String name,Boolean append):boolean默认为false,主动修改为true则变为在上一次文件末尾追加写入
- FileOutputStream(File file):通过File类的对象,创造对应文件的文件输出流
- FileOutputStream(File file,boolean append):boolean默认为false,主动修改为true则变为在上一次文件末尾追加写入
- void write (int b):将指定的字节写入文件输出流,写入的是ASCII值,文件里呈现具体对应的字符,此方法一次只能写一字节数据
- void write (byte[] b):将b字节数组的内容写入文件输出流里面
- void write (byte[] b,int off,int len):将b数字中的数据,从off开始写,写入长度为len的数据
- void close():关闭文件输出流并释放相关资源,没有执行close,write多次使用,默认在上一次write方法后面追加写入
四、FileOutputStream举例
- 例子1:使用void write (int b)写入一个ASCII值
FileOutputStream f = new FileOutputStream("C:\\java\\mynote\\1.txt");
f.write(97);
f.write(98);
f.close();
- 例子2:使用void write (byte[] b)写入一个数组
FileOutputStream f = new FileOutputStream("C:\\java\\mynote\\1.txt");
byte[] b = {97,98,99};
f.write(b);
f.close();
- 例子3实现换行和追加
FileOutputStream f = new FileOutputStream("C:\\java\\mynote\\1.txt",true);
byte[] b = {97,98,99,100};
for(byte i:b){
f.write(i);
f.write("\n".getBytes(StandardCharsets.UTF_8)); //插入换行\n的字符形式,且设定字符为UTF-8
}
f.close();
五、字节流读数据
- InputStream是抽象类,是所有字节输入流的超类
- FileInputStream:从文件中读取字节
六、FileInputStream使用方法
FileInputStream(String name):创建文件输入流以指定的名称写入文件,指定的文件不存在则报错。
3. FileOutputStream(File file):通过File类的对象,创造对应文件的文件输入流
4. int read ():读取一个字节数据,返回的是ASCII值,多次使用此方法,读取超过了内容长度,则返回-1值
5. int read (byte[] b):读取一个字节数组的数据,返回的是存入b数组的个数,b数组中存储的是Ascii值,多次使用此方法,读取超过了内容长度,则返回-1值
6. int read (byte[] b,int off,int len):读取长度为len的数据,放入b数组中,放入的起始索引为off,b中存放的是ASCII值,多次使用此方法,读取超过了内容长度,则返回-1值
7. void close():关闭文件输出流并释放相关资源,没有执行close方法,多次使用read方法使用默认是上一次read的后面追加读取
七、输入输出流配合复制图片
FileInputStream f1 = new FileInputStream("C:\\java\\mynote\\1.PNG");
FileOutputStream f2 = new FileOutputStream("C:\\java\\mynote\\2.PNG");
byte[] b = new byte[1024];
int flag = f1.read(b);
while (flag!=-1){
f2.write(b);
flag=f1.read(b);
}
f1.close();
f2.close();
字节缓冲流
一、概述
- 输出流是将内存中的数据放进硬盘,而输入流是将硬盘中的数据读取到内存,FileInputStream与FileOutputStream每次都是操作一个字符进行内存到硬盘的转换,由于内存是高速设备,硬盘是低速设备,每次转换提交IO请求次数多,运行效率低,所以需要设置缓冲区
- 字节缓冲流,创建时默认开辟出一块缓冲区,用于内存和硬盘交互数据时,一次性交互,减少IO请求,提高运行速率
- 创建字节缓冲流是需要依靠字节流创建,字节缓冲流仅提供缓冲区,读写数据还是依靠字节流完成
二、字节输入缓冲流
- BufferedInputStream(InputStream in):创建一个字节输入缓存流
- BufferedInputStream(InputStream in,int size):创建一个指定缓冲区大小的字节输入缓冲流
- int read ():读取一个字节数据,返回的是ASCII值,多次使用此方法,读取超过了内容长度,则返回-1值
- int read (byte[] b):读取一个字节数组的数据,返回的是存入b数组的个数,b数组中存储的是Ascii值,多次使用此方法,读取超过了内容长度,则返回-1值
- int read (byte[] b,int off,int len):读取长度为len的数据,放入b数组中,放入的起始索引为off,b中存放的是ASCII值,多次使用此方法,读取超过了内容长度,则返回-1值
- void close():关闭文件输出流并释放相关资源,没有执行close方法,多次使用read方法使用默认是上一次read的后面追加读取
三、字节输出缓冲流
- BufferedOutputStream(InputStream in):创建一个字节输出缓存流
- BufferedOutputStream(InputStream in,int size):创建一个指定缓冲区大小的字节输出缓冲流
- void write (int b):将指定的字节写入文件输出流,写入的是ASCII值,文件里呈现具体对应的字符,此方法一次只能写一字节数据
- void write (byte[] b):将b字节数组的内容写入文件输出流里面
- void write (byte[] b,int off,int len):将b数字中的数据,从off开始写,写入长度为len的数据
- void close():关闭文件输出流并释放相关资源,没有执行close,write多次使用,默认在上一次write方法后面追加写入
四、字节缓冲流复制视频
long startTime = System.currentTimeMillis();
BufferedInputStream f1 = new BufferedInputStream(new FileInputStream("C:\\java\\mynote\\1.mp4"));
BufferedOutputStream f2 = new BufferedOutputStream(new FileOutputStream("C:\\java\\mynote\\2.mp4"));
byte[] b = new byte[8192];
int flag = f1.read(b);
while (flag!=-1){
f2.write(b);
flag = f1.read();
}
long endTime = System.currentTimeMillis();
System.out.println("执行时间:"+(endTime-startTime));
字符流
一、使用情况
纯文本,使用字符流打开,不确定就选字节流
二、字符流的类
- InputStreamReader:从字节到字符的桥梁,读取字节并使用指定或默认的编码解码为字符
- OutputStreamWriter:从字符到字节的桥梁,将字符使用编码解码为字节
三、OutputStreamWriter使用方法
- OutputStreamWriter (OutputStream out):创造一个默认编码的字符输出流
- OutputStreamWriter (OutputStream out,String charsetName):创造一个指定编码的字符输出流
- void write(int c):输入ASCII值,显示ASCII值对应字符
- void write(string s):输入字符串
- void write(string s,int off,int len):输入指定长度字符串,off起始位置,长度为len,off从0开始数
- void write(char[] cbuf):输入字符数组
- void write(char[] cbuf,int off,int len):输入指定长度字符数组,off起始位置,长度为len
- void close():释放相关资源
OutputStreamWriter f = new OutputStreamWriter(new FileOutputStream("C:\\java\\mynote\\1.txt"),"utf-8");
f.write("中国最棒",1,2);
f.close();
四、InputStreamReader使用方法
- InputStreamReader (InputStream in):创造一个默认编码的字符输入流
- InputStreamReader (InputStream in,String charsetName):创造一个指定编码的字符输入流
- int read():读取一个字符,多次使用,读完返回-1
- int read(char[] cbuf):读取多个字符,放进字符数组里面,多次读取,读完返回-1
字符缓冲流
- BufferedReader(Reader in):默认缓冲区的字符缓冲输入流,Reader类一般使用FileReader类
- BufferedReader(Reader in,int size):指定缓冲区的字符缓冲输入流
- BufferedWriter(Writer out):默认缓冲区的字符缓冲输出流,Reader类一般使用FileWrite类
- BufferedWriter(Writer out,int size):指定缓冲区的字符缓冲输出流
BufferedWriter f1 = new BufferedWriter(new FileWriter("C:\\java\\mynote\\1.txt"));
f1.write("请问请问");
f1.close();