流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。用来进行输入输出操作的流就称为IO流。
IO流是InputStream(用于读取file文件中的数据)和OutputStream(用于将数据写入file文件)的简称。
Java数据流的划分:
- 根据功能划分:输入流和输出流;
- 根据读写数据方式划分:字节流和字符流。
字符流:以字符为单为进行读写,只能对纯文本格式(txt,init,properties,rtf,log)读写。字符流的构建依赖于字节流。
File文件对象的使用(需要导入java.io包:import java.io.File;):
//创建一个文件对象 写入文件的完整路径
File file = new File("d:/myFile/a.txt");
//使用父路径构建文件
//File file = new File("d:/myFile", "a.txt");
//使用父文件构建文件
//File file = new File(new File("d:/myFile"), "a.txt");
File文件对象的使用方法:
功能 | 示例 |
---|---|
获取文件的名称 | file.getName() |
获取文件的相对路径 | file.getPath() |
获取文件的绝对路径 | file.getAbsolutePath() |
获取文件的父路径 | file.getParent() |
判断文件是否存在 | file.exists() |
判断File是否是一个文件夹 | file.isDirectory() |
判断File是否是一个文件 | file.isFile() |
获取文件的长度(文件夹长度为0) | file.length() |
获得文件最后修改的时间(返回毫秒值) | file.lastModified() |
判断文件是否是一个隐藏文件 | file.isHidden() |
判断文件是否是可读文件 | file.canRead() |
获取文件所在盘符的已用空间 | file.getUsableSpace() |
获取文件所在盘符的可用空间 | file.getFreeSpace() |
获取文件所在盘符的总空间 | file.getTotalSpace() |
获取系统的所有盘符:
File[] disks = File.listRoots();
for(File disk : disks){
System.out.println(disk.getPath());
}
获取盘符或者文件夹中的子文件:
File file = new File("c:/");
if(file.isDirectory()){
//单个文件获取子文件,返回值为null
File[] files = file.listFiles();
//遍历子文件
for(File f : files){
System.out.println(f.getName());
}
}
File文件操作:
import java.io.File;
import java.io.IOException;
public class Demo {
/**File文件操作 */
public static void main(String[] args) {
//创建文件夹
File file = new File("d:/myFile");
file.mkdir();
//创建文件
File file = new File("d:/a.jpg");
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//重命名
File file = new File("d:/a.jpg");
File newFile = new File("d:/b.jpg");
file.renameTo(newFile);
//删除文件
//如果删除的文件是文件夹,且文件夹包含子文件时,必须要先删除所有的子文件,才能删除父文件夹
File file = new File("d:/b.jpg");
file.delete();
}
}
字节输入流的使用:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo {
/**字节流输入流的使用 */
public static void main(String[] args) {
//创建InputStream的子类 FileInputStream
//输入流用于读取文件
try {
FileInputStream fis = new FileInputStream(new File("d:/a.txt"));
//read方法用于读取一个字节
int data = fis.read();
//循环读取文件中的每个字节 -1表示未读取到字节数据
//使用字节流只能读取到每一个字节数据
int data;
//每次读一个字节
while((data = fis.read()) != -1){
System.out.println(data);
}
//缓冲数组
byte[] buffer = new byte[1024];
//将数据读取至缓冲中
fis.read(buffer);
for(byte b : buffer){
System.out.println(b);
}
//指定读取位置进行数据读取缓冲
byte[] buffer = new byte[1024];
fis.read(buffer, 0, 1);
for(byte b : buffer){
System.out.println(b);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
字节输出流:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
/**字节输出流,用于将数据写入文件*/
public static void main(String[] args) {
try {
//默认情况下,输出流的写入会覆盖掉源文件的数据
//通过第二个boolean可以设置是否追加数据,默认为false
//如果输出流参数中的文件不存在,则会创建新的文件
FileOutputStream fos = new FileOutputStream(new File("d:/b.txt"),true);
fos.write(65);
//清空缓冲
fos.flush();
//关闭输出流
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
字节缓冲流:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
public class Demo4 {
/**字节缓冲流 */
public static void main(String[] args) {
try {
long start = new Date().getTime();
//创建缓冲输入流,缓冲流的构建需要 依赖字节流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("d:/apache-tomcat-7.0.78.rar")));
//创建缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("d:/tomcat.rar")));
int len;
byte[] buffer = new byte[1024*1024];
while((len = bis.read(buffer)) != -1){
bos.write(buffer, 0, len);
}
//清空
bos.flush();
bos.close();
bis.close();
long end = new Date().getTime();
System.out.println("复制文件耗时:"+(end-start)+"ms");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}