Java I/O流 输入输出流
IO流:Input(输入)、Output(输出)、stream(流)
输入流:把文件或者内容 读入到程序中。
输出流:把程序中的数据 写入 到文件中。
输入输出流解决什么问题呢?
输入流:如果没有输入流,所有的内容需要你在程序内置。有了输入流,就可
以把程序外的内容读入到程序里。
输出流:我们程序里的内容都是存在内存里的,程序运行结束后,内存被系统
回收,就导致内容丢失。想要数据持久化,必须把数据放到硬盘上。
Java里的io流有以下分类:
按流向:输入流、输出流
按功能:字节流、字符流
字符流:以字符为单位,处理文本文件。例如: .txt, .java
字节流:以字节为单位,处理各种文件。例如:.avi,.rmvb,
.mp4,.mp3,.jpg,.txt
按角色分:节点流、处理流
IO流有4个抽象类
字节输入流 字节输出流 字符输入流 字符输出流
InputStream OutputStream Reader Writer
FileInputStream FileOutputStream FileReader FileWriter
使用字节流读取文件内容:
第一步:
创建字节输入流对象。(建立输入流管道)
第二步:
读取数据(read())。
第三步:
关闭输入流。写在finally里,判断如果输入流不为null,要close()
字节输出流把数据写入文件
第一步:
创建字节输出流对象。(建立输出流管道)
第二步:
写入数据(write())
第三部:
关闭输出流。写在finally里,判断如果输入流不为null,要close()
举一个应用的小例子:
package com.lanou3g.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void copyFile(String src, String desc) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(src);
fos = new FileOutputStream(desc);
byte[] b = new byte[1024];
int len = 0;
while((len = fis.read(b)) != -1) {
fos.write(b);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
String src = "C:\\Users\\neal\\Desktop\\a.mp4";
String desc = "C:\\Users\\neal\\Desktop\\e.mp4";
copyFile(src,desc);
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
File这个类用于描述一个文件或者目录(文件夹)
public class LessonFile {
public static long total = 0;
public static void file() {
//File这个类用于描述一个文件或者目录(文件夹)
//File f = new File("C:\\Users\\neal\\Desktop\\hello.txt");
File f = new File("src\\b.txt");
System.out.println(f);
String name = f.getName();
System.out.println(name);
long length = f.length();
System.out.println(length);
String parent = f.getParent();
System.out.println(parent);
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
//判断
boolean b1 = f.exists();
System.out.println(b1);
if(b1 == false) {
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}else {
f.delete();
}
}
public static void directory() {
/*File f = new File("C:\\Users\\neal\\Desktop\\bcd");
System.out.println(f.getName());
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.length());
//目录是获得不了大小的。永远返回0。
//如果想计算大小,分别对每个文件大小求和
//判断
System.out.println(f.exists());
System.out.println(f.isFile());
System.out.println(f.isDirectory());
//创建文件夹(路径上所有的文件夹)
//f.mkdirs();
//删除文件夹//一个文件夹里有内容的话,不能删除,需要先删除文件夹里的文件(或文件夹)
//再删除文件夹 只能循环先删里面的再删外面的。
f.delete();
*/
//查看文件夹里的文件列表。
File f = new File("C:\\Users\\neal\\Desktop\\abc");
String[] files = f.list();
for (String string : files) {
System.out.println(string);
}
}
//遍历某文件夹下面所有的文件
public static void listDirectory(File f) {
if(f.isDirectory()) {
File[] files = f.listFiles();
for (File file : files) {
listDirectory(file);
}
}else {
System.out.println(f);
}
}
//计算文件夹的大小
// public static void calculateDirectorySize(File f) {
// if(f.isDirectory()) {
// File[] files = f.listFiles();
// for (File file : files) {
// calculateDirectorySize(file);
// }
// }else {
// long size = f.length();
// total += size;
// System.out.println(f);
// }
// }
//删除指定的文件夹
public static void deleteDirectory(File f) {
if(f.isDirectory()) {
File[] files = f.listFiles();
for (File file : files) {
deleteDirectory(file);
}
f.delete();
}else {
System.out.println(f);
f.delete();
}
}
public static void main(String[] args) {
//directory();
// File f = new File("C:\\Users\\neal\\Desktop\\abc");
// deleteDirectory(f);
//
// System.out.println(total);
//文件重命名
//原文件要存在,第二目标文件不存在
File f1 = new File("C:\\Users\\neal\\Desktop\\3.java");
File f2 = new File("C:\\Users\\neal\\Desktop\\bcd\\3.java");
f1.renameTo(f2);
}