Java.io.File类用于展示文件或目录的信息,但是无法用来进行对文件的操作。
通过io流来对文件进行读写操作。
io流分为字节流和字符流
1、字节流
InputStream、OutputStream
InputStream抽象了应用程序读取数据的方式
OutputStream抽象了应用程序写出数据的方式
EOF = End 读到-1就读到结尾
输入流基本方法
int b = in.read();读取一个字节无符号填充到int低八位.-1是 EOF
in.read(byte[] buf)
in.read(byte[] buf,int start,int size)
输出流基本方法
out.write(int b) 写出一个byte到流,b的低8位
out.write(byte[] buf)将buf字节数组都写入到流
out.write(byte[] buf,int start,int size)
读取文件可以通过FileInputStream,DataInputStream,BufferedInputStream (全部继承InputStream)
FileInputStream 实例化可以传递一个File(文件) 或者一个String(文件路径)
通过read来读取文件,当返回值 为 -1时代表文件读取完毕。
DataInputStream是对流功能的一些扩展,封装了对Int、Double、UTF等类型的操作。
实例化参数是一个 InputStream类型参数。
BufferedInputStream是带缓冲的流,在对较大文件操作时效率会更快。提高了IO的性能
实例化参数是一个 InputStream类型参数。
写出文件可以通过FileOutputStream,DataOutputStream,BufferedOutputStream (全部继承OutputStream,与input成对使用)
具体实现:
File (遍历目录中的所有文件及其子目录文件,打印文件名称)
private static void findFiles(File fileDir) {
if (!fileDir.exists()) {
throw new IllegalArgumentException(fileDir + "目录不存在"); }
if (!fileDir.isDirectory()) {
throw new IllegalArgumentException(fileDir + "不是一个目录"); }
File[] files = fileDir.listFiles();
for (File file : files) {
if (file != null && file.length() > 0) {
if (file.isDirectory()) {
findFiles(file);
} else {
System.out.println(file);
}
}
}
}
字节流
private static void copyFile(File srcFile, File destFile) throws IOException{
FileOutputStream out = null;
try{
if (!srcFile.exists()){
System.out.println(srcFile + "文件不存在");
}
if (!srcFile.isFile()){
System.out.println(srcFile + "不是一个文件");
}
FileInputStream in = new FileInputStream(srcFile);
out = new FileOutputStream(destFile);
byte[] bytes = new byte[1024];
int b;
while ((b = in.read(bytes,0,bytes.length)) != -1){
out.write(bytes,0,b);
out.flush();
}
}catch (Exception e){
System.out.println("系统错误");
}finally {
out.close();
}
}
private static void copyFileByBuffer(File srcFile, File destFile) throws IOException{
BufferedOutputStream out = null;
try{
if (!srcFile.exists()){
System.out.println(srcFile + "文件不存在");
}
if (!srcFile.isFile()){
System.out.println(srcFile + "不是一个文件");
}
BufferedInputStream in = new BufferedInputStream(new FileInputStream(srcFile));
out = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] bytes = new byte[1024];
int b;
while ((b = in.read(bytes)) != -1){
out.write(bytes,0,b);
out.flush();
}
}catch (Exception e){
System.out.println("系统错误");
}finally {
out.close();
}
}
2.字符流
java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)
文件以byte存储
字符流(Reader Writer)操作的是文本
字符的处理,一次处理一个字符
字符的底层依然是通过字节处理
字符流的基本实现
InputStreamReader 完成byte流解析为char流,按照编码解析
OutputStreamWriter 提供char流到byte流,按照编码处理
FileReader/FileWriter
字符流的过滤器
BufferedReader ---->readLine 一次读一行
BufferedWriter/PrintWriter ---->写一行
实现:
private static void fileReadAndFileWrite() throws IOException {
FileReader fr = new FileReader("/Users/yukaiji/java/ab.txt");
FileWriter fw = new FileWriter("/Users/yukaiji/java/cd.txt");
try {
char[] chars = new char[2056];
int i;
while ((i = fr.read()) != -1) {
fw.write(chars, 0, i);
fw.flush();
}
} catch (Exception e) {
System.out.println("系统错误");
} finally {
fw.close();
}
}