IO流
File类
-
一个File对象代表磁盘上的某个文件或文件夹
-
构造方法
- File(String pathname)
- File(String parent,String child)
- File(File parent,String child)
package day06; import java.io.File; //测试File类 public class demo04 { public static void main(String[] args) { // 第一种方式 File file = new File("/Users/admin/Desktop/a.png"); System.out.println(file); // 第二种方式 File file1 = new File("/Users/admin/Desktop"); File file2 = new File(file1, "a.png"); System.out.println(file2); // 第三种方式 File file3 = new File("/Users/admin/Desktop", "a.png"); System.out.println(file3); } }
-
成员方法:
- createNewFile():创建文件
- Mkdir()和mkdirs():创建目录
- isDirectory():判断File对象是否为目录
- isFile():判断File对象是否为文件
- exists():判断File对象是否存在
- getAbsolutePath():获取绝对路径
- getPath():获取相对路径
- getName():获取文件名
- list():获取指定文件夹下的所有文件的文件名字
- listFiles():获取指定文件夹下的所有文件
package day06; import java.io.File; import java.io.IOException; //测试File成员方法 public class Demo05 { public static void main(String[] args) throws IOException { // 在固定位置创建一个文件 File file = new File("/Users/admin/Desktop/b.png"); boolean newFile = file.createNewFile(); System.out.println(newFile); // 在固定位置创建一个文件(这个在开发中不会使用) File file2 = new File("/Users/admin/Desktop/a"); boolean a = file2.mkdir(); System.out.println(a); // 在固定位置创建多级文件夹(可以创建多级也可以创建单级目录,实际开发使用) File file3 = new File("/Users/admin/Desktop/a/b/c"); boolean b = file3.mkdirs(); System.out.println(b); // 判断file3是否为文件夹 System.out.println(file3.isDirectory()); // 判断file3是否为文件 System.out.println(file3.isFile()); // 判断file3文件夹是否存在 System.out.println(file3.exists()); File file1 = new File("a.txt"); // 获取绝对路径 String absolutePath = file1.getAbsolutePath(); System.out.println(absolutePath); // 获取相对路径 String path = file1.getPath(); System.out.println(path); // 获取文件名 System.out.println(file1.getName()); // 获取某个文件夹下面的所有文件名字,结果为文件名 File file4 = new File("/Users/admin/Desktop/"); String[] list = file4.list(); for (String s : list) { System.out.println(s); } // 获取某个文件夹下面的所有文件,结果为文件 File[] files = file4.listFiles(); for (File file5 : files) { System.out.println(file5); } } }
IO流
-
按数据流向分:
- 输入流(将硬盘数据读取到内存中)
- 输出流(将内存数据输出到硬盘中)
-
按操作方式分:
-
字节流(001101101010)
- InputStream(抽象类)
- OutputSteam(抽象类)
-
字符流(ABCDEFGH)
- Reader(抽象类)
- Writer(抽象类)
-
字符流
Reader抽象类
- FileReader(普通字符输入流)
- BufferedReader(高效字符输入流)
Writer抽象类
- FileWriter(普通字符输出流)
- BufferedReader(高效字符输出流)
字符流读写文件
字符流只能拷贝文本文件
字符流读数据
- 按单个字符读取(使用完之后,一定要关闭资源)
package day06;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
//测试字符流读写文件
public class Demo06 {
public static void main(String[] args) throws IOException {
Reader fileReader = new FileReader("/Users/../IdeaProjects/JavaSE/src/day06/a.txt");
// 本方法不推荐使用,笨拙,一般使用下面的while循环
// int read = fileReader.read();
// System.out.println(read);
// 不知道循环次数,使用while
int ch;
while ((ch = fileReader.read()) != -1){
System.out.println(ch);
}
// 关闭资源
fileReader.close();
}
}
- 一次读取一个字符数组
package day06;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
//测试字符流读取数据:一次读取一个字符数组
public class Demo07 {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("/Users/zwei_3_3/IdeaProjects/JavaSE/src/day06/a.txt");
// 按数组大小读取字符,结果放在数组中
// char[] chars = new char[3];
// int leng1 = fileReader.read(chars);
// System.out.println(chars);
// System.out.println(leng1);
//
// 读取当字符会放入容器中,覆盖之前内容
// int leng2 = fileReader.read(chars);
// System.out.println(chars);
// System.out.println(leng2);
//
// int leng3 = fileReader.read(chars);
// System.out.println(chars);
// System.out.println(leng3);
// 优化上面当代码
char[] chars1 = new char[3];
int leng;
while ((leng = fileReader.read(chars1)) != -1){
// 将读取到内容转换成字符串,打印
// chars1:表示要操作的数组、0:表示开始位置、leng:表示要操作的字符个数
String s = new String(chars1, 0, leng);
System.out.println(s);
}
// 关闭资源
fileReader.close();
}
}
字符流写数据
按单个字符写入、直接写入字符数组、写入部分数组、写入一个字符串
package day06;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
//测试字符流写数据:按单个字符写入
public class Demo08 {
public static void main(String[] args) throws IOException {
Writer fileWriter = new FileWriter("/Users/../IdeaProjects/JavaSE/src/day06/a.txt");
// 直接写入一个字符
fileWriter.write("abc");
// 直接写入一个字符的整数表示
fileWriter.write(99);
// 直接写入一个字符数组
char[] chars = {'一','二','三'};
fileWriter.write(chars);
// 写入一个字符数组的部分内容
fileWriter.write(chars,0,2);
fileWriter.close();
}
}
字符流拷贝文件
- 先用字符流读文件,在用字符流写文件实现拷贝。是上面两部分的综合。
字符缓冲流拷贝文件
package day06;
import sun.text.resources.zh.FormatData_zh_HK;
import java.io.*;
//测试缓存流拷贝文件
public class Demo09 {
public static void main(String[] args) throws IOException {
Reader fileReader = new FileReader("/Users/../IdeaProjects/JavaSE/src/day06/a.txt");
BufferedReader r1 = new BufferedReader(fileReader);
Writer fileWriter = new FileWriter("/Users/../IdeaProjects/JavaSE/src/day06/b.txt");
BufferedWriter w1 = new BufferedWriter(fileWriter);
int leng;
while ((leng = r1.read()) != -1){
w1.write(leng);
}
r1.close();
w1.close();
}
}
字符缓冲流一次读取一行
package day06;
import java.io.*;
//测试字符缓冲流:一次读取一行
public class Demo10 {
public static void main(String[] args) throws IOException {
Reader fileReader = new FileReader("/Users/admin/IdeaProjects/JavaSE/src/day06/a.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
Writer fileWriter = new FileWriter("/Users/admin/IdeaProjects/JavaSE/src/day06/b.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
String str;
while ((str = bufferedReader.readLine()) != null){
bufferedWriter.write(str);
// 一定要换行
bufferedWriter.newLine();
}
// 关闭资源
bufferedReader.close();
bufferedWriter.close();
}
}
字节流
其他类型文件处理
InputStream抽象类
- FileInputStream(普通字节输入流)
- BufferedInputStream(高效字节输入流)
OutputStream抽象类
- FileOutputStream(普通字节输出流)
- BufferedOutputStream(高效字节输出流)
字节流读取文件
字节流按单个字节读写
package day06;
import org.omg.CORBA.WrongTransactionHolder;
import java.io.*;
//测试普通字节流一次读取一个字节
public class Demo11 {
public static void main(String[] args) throws IOException {
InputStream fileInputStream = new FileInputStream("/Users/admin/Desktop/a.png");
OutputStream fileOutputStream = new FileOutputStream("/Users/admin/Desktop/b.png");
int leng;
while ((leng = fileInputStream.read()) != -1){
fileOutputStream.write(leng);
}
// 释放资源
fileInputStream.close();
fileOutputStream.close();
}
}
字节流按字节数组读写
package day06;
import java.io.*;
//测试字节流拷贝文件,按字节数组读写
public class Demo12 {
public static void main(String[] args) throws IOException {
InputStream fileInputStream = new FileInputStream("/Users/admin/Desktop/a.png");
OutputStream fileOutputStream = new FileOutputStream("/Users/admin/Desktop/c.png");
byte[] bytes = new byte[1024];
int leng;
while ((leng = fileInputStream.read(bytes)) != -1){
fileOutputStream.write(bytes,0,leng);
}
// 释放资源
fileInputStream.close();
fileOutputStream.close();
}
}
字节缓冲流拷贝文件
package day06;
import java.io.*;
//测试字节缓冲流拷贝文件
public class Demo13 {
public static void main(String[] args) throws IOException {
InputStream fileInputStream = new FileInputStream("/Users/admin/Desktop/a.png");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
OutputStream fileOutputStream = new FileOutputStream("/Users/admin/Desktop/b.png");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int leng;
while ((leng = bufferedInputStream.read()) != -1){
bufferedOutputStream.write(leng);
}
// 释放资源
bufferedInputStream.close();
bufferedOutputStream.close();
}
}