文件I/O
网络下载的数据->缓存
文件:File(目录,文件) 读取数据的最小单元
1,创建文件/目录->文件夹
2,判断文件/目录是否存在
3,写入数据
4,删除
文件操作
new file()并不创建文件
import java.io.*;
public class file {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
fileOperation();
}
public static void fileOperation(){
//判断是文件还是目录
File file = new File("C:/Users/cs/Desktop");
if(file.isDirectory()){
System.out.println("是目录或文件夹");
}else if(file.isFile()){
System.out.println("是普通的文件");
}
//查看当前文件的所有内容
/*String[] fileNameList = file.list();
for(String name : fileNameList){
System.out.println(name);//打印出来
}*/
//文件过滤
/*String[] fileNameList = file.list(new FilenameFilter(){
@Override
public boolean accept(File Dir, String name) {
// TODO Auto-generated method stub
//返回true 当前文件会被过滤出来
//返回false 当前文件会被放弃
File file = new File(Dir,name);//拼接目录和文件名
if(file.isFile()){
return true;
}
return false;
}
});
for(String name : fileNameList){
System.out.println(name);//打印出来
}*/
//打印路径
/*File[] files = file.listFiles();
for(File f : files){
System.out.println(f.getAbsolutePath());
}*/
}
public static void deleteFile(){
File parent = new File("C:/Users/cs/Desktop");
File file = new File(parent,"1.txt");
if(file.exists()){
file.delete();//删除文件
}
}
public static void createDirectory(){
File file = new File("C:/Users/cs/Desktop","file");
if(file.exists()){
return;
}
try{
file.mkdir();//创建目录
}catch(NullPointerException e){
e.printStackTrace();
}
}
public static void createFile(){
File file = new File("C:/Users/cs/Desktop/1.txt");//让file指向指定的一个文件名(该文件可能不存在)
if(!file.exists()){//如果不存在,则创建文件
try{
file.createNewFile();//创建文件
}catch(IOException e){
e.printStackTrace();
}
}
}
}
文件写入数据
File没有具体的方法读取或写入数据,而通过I/O流操作
输入流和输出流
方向:相对的 相对于内存-运行的程序-进程
输出流:内存->外部(硬盘 网络 外部设备)
输入流:外部(硬盘 网络 外部设备)->内存
复制粘贴一份文件 硬盘->内存->硬盘
数据存储 2种
1,字节二进制形式存储 图片 视频 音频 exe
2,字符形式存储 文本
读取方式
二进制文件->字节流 一次读取一个字节
文本->字符流 一次读取两个字节
I/O操作
字节流 输入流 InputStream 输出流 OutputStream
字符流 输入流 Reader 输出流 Writer
具体实现类
字节流: 输入流 FileInputStream 输出流 FileOutputStream
字符流:输入流 FileReader 输出流 FileWriter
实现了closeable接口的类都可以在try()括号内部创建
当try代码块执行完毕或者异常时,系统自动关闭对应的对象
复制图片操作:
public static void main(String[] args) {
// TODO Auto-generated method stub
String des = "C:/Users/cs/Desktop/file/123.jpg";
String src = "C:/Users/cs/Desktop/123.jpg";
copyImageToFile(src,des);
}
public static void copyImageToFile(String src,String des){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//将图片读取到内存中-字节输入流FileInputStream
//将内存中的图片数据写入磁盘中-字节输出流FileOutputStream
//创建字节输入流对象
fis = new FileInputStream(src);
//创建字节输出流对象
fos = new FileOutputStream(des);
//从输入流里面获取数据 写入到输出流
int b = 0;//一个字节
while(true){
//read() 一个字节一个字节读取
b = fis.read();
//判断是否读取完毕 如果返回值b为-1则读取完毕
if(b == -1){
break;
}
//write() 一个字节一个字节写入
fos.write(b);
}
}catch(Exception e){
e.printStackTrace();
}finally{
//关闭流
try {
fis.close();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
使用数组可以大幅减少时间,更改try代码块为
try {
fis = new FileInputStream(src);
fos = new FileOutputStream(des);
//定义一个数组,用于保存一次性读取的多个字节
byte[] buffer = new byte[1024];
int len = 0;
while(true){
len = fis.read(buffer);
if(len == -1){
break;
}
fos.write(buffer);
}
复制文本
public static void main(String[] args) {
// TODO Auto-generated method stub
String des = "C:/Users/cs/Desktop/file/1.txt";
String src = "C:/Users/cs/Desktop/1.txt";
copyTxtToFile(src,des);
}
//字符输入输出流
public static void copyTxtToFile(String src,String des){
FileReader fr = null;
FileWriter fw = null;
try{
int ch = 0;
fr = new FileReader(src);
fw = new FileWriter(des);
while(true){
ch = fr.read();
if(ch == -1){
break;
}
fw.write(ch);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
fr.close();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
使用数组,try代码块改为:
try{
int len = 0;
char[] buffer = new char[1024];
fr = new FileReader(src);
fw = new FileWriter(des);
while(true){
len = fr.read(buffer);
if(len == -1){
break;
}
fw.write(buffer);
}