临时态的数据不能长期保存,通常掉电就消失
持久化操作方式:
存储到文本文件(记事本)
存储到数据库(mysql、Oracle) 【SQL】
存储到集群(hdfs) 【NoSQL】
【路径】
【绝对路径】
windows下以盘符开头的路径,称为全路径
“c:\abc” <=> “c:/abc”
/ linux系统的根目录
【相对路径】
abc
. 当前目录
… 上一层目录
【exception】 【异常】不正常
编译时检查
file.getCanonicalPath() IOException
运行时检查
Integer.parseInt(“35分”) NumberFormatException
【I/O操作(JAVA )】
【File】
记事本、文件夹、图片、视频……
“抽象” abstract -> 【File】
【文件操作-1:只看文件的属性】不需要打开文件
1)找到(根据路径)
存储位置(存储到哪儿了) 【路径】
jdk8解压到哪儿了?
视频放哪儿了?
2)看File的属性
大小、名称、可读写、路径、最后修改时间……
★看不到文件内容
【文件操作-2:打开文件,操作内容】 Input/Output操作
①查看
输入 I
FileReader
②编辑
输出 O
FileWrite
File (File System,抽象)
所有的东西(含文件夹),看做是File
【根据类型做不同处理】
.isFile()
File:(d:\\红鲤鱼.txt)
名、路径、读写属性、大小、最后修改时间(格式化)
.isDirectory()【目录遍历】 通常使用“递归”
File:(d:\\文件夹)
名、路径、
文件列表 .listFiles()
【操作文件内容】 Input/Output [JVM]
☆ 需要打开文件才能进行操作(读取、修改)
1)根据流向(方向)
输入流(Input)
FileReader(d:\\红鲤鱼.txt)
使用.read(char[])读取,返回本次读取的长度
FileInputStream
BufferedReader
.readLine()
输出流(Output)
FileWriter(路径, 是否追加)
.write()
FileOutputStream
BufferedWriter
2)处理的单位(类型)
字符流
单位:char (通常用于处理文本文件)
FileReader / FileWriter
字节流 *
单位:byte (通常用于处理非文本文件(二进制),比如图片、压缩包、视频……)
FileInputStream / FileOutputStream
3)根据用途(必要性) 装饰模式(毛坯房 / 简装、精装、豪装)
基本流(毛坯房 )
FileReader / FileWriter
FileInputStream / FileOutputStream
增强流(简装、精装、豪装)
带 缓存区的 流 ☆ 磁盘i/o
BufferedReader / BufferedWriter
带 过滤功能 流
……
throws
FileNotFoundException
IOException
-
File
File file=new File(“local”);
常用方法:
file.length(),文件大小,单位Byte
file.canWrite,是否可写
file.getName(),获取文件名
file.getCanonicalPath(),规范路径书写方式(绝对路径)
file.lastModified(),文件最后修改时间
// 获取File的最后修改时间,格式:“yyyy-MM-dd HH:mm:ss”long lastModified = file.lastModified(); String formatTm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format( new Date(lastModified));
file.listFiles(),获取文件夹文件列表
file.getPath(),获取文件路径
file.isDirectory,文件类型,判断是不是文件夹
file.isFile(),判断是不是文件字符流
实例:复制文件FileReader fin = new FileReader(srcPath);//srcPath,被复制的路径 FileWriter fout = new FileWriter(tarPath);//如果文件已经存在,追加 //文本那么就写 FileWriter(tarPath,true) char [] buf = new char[100]; int iRead = 0; while (-1 != (iRead=fin.read(buf))) { //读取了iRead长度的内容,存放到buf中了 //TODO: 将这部分内容写到tar文件 //String str = new String(buf, 0, iRead); //fout.write(str); fout.write(buf, 0, iRead); } fout.close(); fin.close();
字节流
FileInputStream fin = new FileInputStream("d:/tnt/红鲤鱼与绿鲤鱼与驴.jpg"); FileOutputStream fout = new FileOutputStream("e:/tnt/红鲤鱼与绿鲤鱼与驴2.jpg"); byte[] buf = new byte[30]; int iRead = 0; while(-1 != (iRead = fin.read(buf))) { //写 fout.write(buf, 0, iRead); } fout.close(); fin.close();
I/O的缓存Buffer
public static void main(String[] args) throws IOException {
// readOneFile ();
showBufferedWriter();
// 【输出到文件】 FileWriter
// Writer out = new FileWriter("d:/hahaha.txt");
// BufferedWriter fout = new BufferedWriter(out, 200);
//
// fout.write("-----------------");
// //TODO: buffer???
//
// fout.close();
// out.close();
}
/**
* @throws IOException
*/
public static void readOneFile() throws IOException {
//打开流 FileReader
Reader in = new FileReader("d:/红鲤鱼.txt");
BufferedReader fin = new BufferedReader(in);
// 可以按行读取
String str1 = null;
//not including any line-termination characters
while ( null != (str1=fin.readLine())) {
System.out.println(str1);
}
// 关闭流
fin.close();
in.close();
}
/**
* 展示BufferedWriter的缓存作用
*
* @throws IOException
*/
public static void showBufferedWriter() throws IOException {
StringWriter s = new StringWriter ();
BufferedWriter out = new BufferedWriter(s, 5);
// buffer展示
String str = "1234567890abcde-";
for (char c: str.toCharArray()) {
out.write(c);
System.out.println(s.getBuffer());
}
// out.flush();//强制刷新,把缓存的内容刷新输出
// System.out.println(s.getBuffer());
out.close();//关闭的时候,会自动刷新一次缓存
System.out.println(s.getBuffer());
s.close();
}