IO流
1:File
(1)File:由于数据在硬盘上最常见的方式,就是文件,所以文件本身有很多的属性,那么,java为了方便我们对文件进行操
作,就提供了File类供我们使用。
File既可以表示文件,也可以表示文件夹(目录)。
(2)构造方法:
File(String pathname)根据指定的路径创建File对象。
File(String parent, String child)根据指定的父文件夹和子文件或者文件夹创建File对象
File(File parent,String child)根据指定的父文件夹对象和子文件或者文件夹创建File对象。
Example:
// 方式1
File file = new File("d:\\a.txt");
File file2 = new File("d:\\aaa");
// 方式2
File file3 = new File("d:\\", "a.txt");
File file4 = new File("d:\\", "aaa");
// 方式3
File file5 = new File("d:\\");
File file6 = new File(file5, "a.txt");
File file7 = new File(file5, "aaa");
创建功能
创建文件:public boolean createNewFile()如果指定文件不存在,就创建,如果存在,就不创建。
创建文件夹:public boolean mkdir() 创建指定目录,如果存在就创建
public boolean mkdirs()创建指定目录,如果存在,就不创建,如果父目录不存在,他也会自动创建。
Example:
</pre><pre code_snippet_id="202948" snippet_file_name="blog_20140224_3_1479098" name="code" class="java"> public boolean delete()即可以删除文件,也可以删除文件夹,取决于使用的对象。
Example:
//删除文件
File file = new File("a.txt");
System.out.println("delete:" + file.delete()
//删除文件夹
File file2 = new File("aaa");
System.out.println("delete:" + file2.delete());
判断功能:
boolean exists():判断file对象是否存在。
boolean isFile():判断file对象是否是文件。
boolean isDirectory():判断file对像是否是文件夹
boolean isAbsolute():判断file对象是否是绝对路径
boolean canRead():判断file对象是否可读
boolean canWrite():判断file对象是否可写
boolean isHidden():判断服了对象是否隐藏
Example:
File file = new File("a.txt");
System.out.println("exists:" + file.exists());// true
System.out.println("isFile:" + file.isFile());// true
System.out.println("isDirectory:" + file.isDirectory());// false
System.out.println("isAbsolute:" + file.isAbsolute());// false
System.out.println("canRead:" + file.canRead());// true
System.out.println("canWrite:" + file.canWrite());// true
System.out.println("isHidden:" + file.isHidden());// false
获取功能:
String getAbsolutepath():获取绝对路径
String getPath()获取相对路径
String getName():获取文件名称
long length()文件大小,单位是字节
long lastModified()上次修改时间的毫秒值
Example
File file = new File("bbb\\ccc\\a.txt");
System.out.println("getAbsolutePath:" + file.getAbsolutePath());
System.out.println("getPath:" + file.getPath());
System.out.println("getName:" + file.getName());
System.out.println("length:" + file.length());
System.out.println("lastModified:" + file.lastModified());
Date d = new Date(file.lastModified());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(d));
(3)成员方法
获取功能:
public static File[] listRoots():列出可用的系统根目录
public String[] list():返回的是指定目录下所有文件或者文件夹的名称数组
public File[] listFiles():返回的是指定目录下所有文件或者文件夹对象数组
Example:
File[] rootArray = File.listRoots();
for (File root : rootArray) {
System.out.println(root);
}
// 创建对象
File file = new File("d:\\");
String[] strArray = file.list();
for (String str : strArray) {
System.out.println(str);
}
File[] fileArray = file.listFiles();
for (File f : fileArray) {
System.out.println(f.getName());
}
Example;
需求:获取指定目录下所有.mp4文件的名称。
方式1
思路:
A:封装指定目录
B:获取指定目录下所有文件或者文件夹File数组
C:遍历File数组,获取得到每一个File对象
D:判断该对象是否是否文件
E:判断该对象的后缀名是否是.mp4,是否以.mp4结尾。
import java.io.File;
public class FileTest {
public static void main(String[] args) {
// 封装指定目录
File f = new File("d:\\");
// 获取指定目录下所有文件或者文件夹File数组
File[] fileArray = f.listFiles();
// 遍历File数组,获取得到每一个File对象
for (File file : fileArray) {
// 判断该对象是否是否文件
if (file.isFile()) {
// 判断该对象的后缀名是否是.mp4,是否以.mp4结尾。
String name = file.getName();
if (name.endsWith(".mp4")) {
System.out.println(name);
}
}
}
方式2
package cn.itcast_01;
import java.io.File;
import java.io.FilenameFilter;
/*
* 获取指定目录下指定后缀的文件名称:
* A:先获取指定目录下所有文件或者文件夹的File数组,然后再遍历的时候进行判断。满足条件的就输出该File的名称。
* B:直接获取指定目录下满足条件的String(File)数组。然后遍历数组即可。
*
* 文件名称过滤器:FilenameFilter
* public String[] list(FilenameFilter filter)
*/
public class FileDemo {
public static void main(String[] args) {
// 封装目录
File file = new File("d:\\");
// 获取满足条件的数组
String[] strArray = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 判断是否是文件,是否是以.mp4结尾
// System.out.println(dir + "---" + name);
File file = new File(dir, name); // d:\我的文档
boolean flag = file.isFile();
boolean flag2 = name.endsWith(".mp4");
return flag && flag2;
}
});
// 遍历字符串数组
for (String str : strArray) {
System.out.println(str);
}
}
}
2:递归
(1)方法定义中调用方法本身的现象。
举例:老和尚给小和尚讲故事。
生活中举例:
老和尚给小和尚讲故事,故事是:从前有座山,山里有座庙,庙里有个老和尚
老和尚给小和尚讲故事,故事是:从前有座山,山里有座庙,庙里有个老和尚
老和尚给小和尚讲故事,故事是:从前有座山,山里有座庙,庙里有个老和尚
老和尚给小和尚讲故事,故事是:从前有座山,山里有座庙,庙里有个
老和尚
(2)递归的注意事项:
A:一定要有出口,否则死递归。
B:次数不能过多,否则内存溢出。
构造方法不能递归调用。
(3)案例:
A:递归求数列第二十项
/*
* 用递归求下列数列的第二十项的值:
* 1,1,2,4,7,13...
*/
public class DiGuiTest {
public static void main(String[] args) {
System.out.println(fun(20));
}
public static int fun(int n) {
if (n == 1 || n == 2) {
return 1;
} else if (n == 3) {
return 2;
} else {
return fun(n - 1) + fun(n - 2) + fun(n - 3);
}
}
}
B:递归遍历指定目录的文件绝对路径
import java.io.File;
/*
* 需求:在控制台输出D:\\sfc\\java 所有的java文件的绝对路径。
*
* 思路:
* A:封装目录 D:\\sfc\\java
* B:获取该目录下的所有文件或者文件夹的File[]数组。
* C:遍历File[]数组,获取到每一个File对象
* D:判断该File对数是否是
* 目录:返回B。(递归)
* 不是目录:
* 判断是否java结尾。
* 是:输出路径。
*/
public class ShowFileName {
public static void main(String[] args) {
// 封装目录 D:\\sfc\\java
File file = new File("D:\\sfc\\java");
showFiles(file);
}
private static void showFiles(File file) {
// 获取该目录下的所有文件或者文件夹的File[]数组。
File[] fileArray = file.listFiles();
// 遍历File[]数组,获取到每一个File对象
for (File f : fileArray) {
// 判断该File对数是否是目录
if (f.isDirectory()) {
showFiles(f);
} else {
// 文件
if (f.getName().endsWith(".java")) {
System.out.println(f.getAbsolutePath());
}
}
}
}
}
C:递归删除带内容的目录
import java.io.File;
/*
* 需求:删除指定的目录。(目录是带有目录或者文件的)
* 思路:
* A:封装目录
* B:获取该目录下的所有文件或者文件夹的File[]数组。
* C:遍历File[]数组,获取到每一个File对象
* D:判断该File对数是否是
* 目录:返回B。(递归)
* 不是目录:
* 删除文件
*/
public class DeleteFile {
public static void main(String[] args) {
File file = new File("test");
deleteFiles(file);
}
private static void deleteFiles(File file) {
File[] fileArray = file.listFiles();
if (fileArray != null) {
for (File f : fileArray) {
if (f.isDirectory()) {
deleteFiles(f);
} else {
System.out.println(f.getName() + "***" + f.delete());
}
}
// 如果for循环结束,就表示目录下的文件被删除完毕。
System.out.println(file.getName() + "***" + file.delete());
}
}
}
IO
(1)分类
字节流:
输入流:
InputStream
int read()
int read(byte[] bys)
FileInputStream
BufferedInputStream
输出流:
OutputStream
write(int by)
write(byte[] bys,int index,int len)
FileOutputStream
BufferedOutputStream
字符流:
输入流:
Reader
int read()
int read(char[] chs)
FileReader
BufferedReader
String readLine()
输出流:
Writer
write(int ch)
write(char[] chs,int index,int len)
FileWriter
BufferedWriter
write(String line)
void newLine()
(2)到底使用谁?
用记事本打开能读懂的,就用字符流。
否则,用字节流。
如果你根本就不知道,用字节流。
(3)FileWriter写入数据
步骤:
A:创建字符输出流对象
B:调用写入数据方法,并刷新缓冲区
C:释放资源
代码体现:
FileWriter fw = new FileWriter("a.txt");
fw.write("hello,io");
fw.flush();
fw.close();
问题?
A:创建字符输出流对象做了几件事情?
A:调用系统功能创建了文件
B:创建字符输出流对象
C:把字符输出流对象指向创建的文件
B:写数据完毕后,为什么要刷新?
件数据底层单位是字节,而我们现在是字符,所以它不能直接把数据写入文件。 把字符输出存储到
缓冲区里面。
C:为什么要close()?
1:让流对象变成垃圾。
2:通知系统去释放和文件相关的资源
D:flush()和close()的区别?
flush():只刷新缓冲区,流对象还可以继续使用。
close():先刷新缓冲区,再关闭流对象。流对象不可以继续被使用
E:怎么实现数据换行?
不同的操作系统,对换行符的要求不一样:
windows:\r\n
linux:\n
mac:\r
F:怎么实现数据追加写入?
构造的时候,用带两个参数的。
public FileWriter(String fileName,boolean append)
(3)FileReader读取数据
步骤:
A:创建字符输入流对象
B:调用读取数据方法,并显示
C:释放资源
代码体现:
<span style="white-space:pre"> </span>FileReader fr = new FileReader("a.txt");
//方式1
//一次读取一个字符
int ch = 0;
while((ch=fr.read())!=-1)
{
System.out.print((char)ch);
}
//方式2
//一次读取一个字符数组
char[] chs = new char[1024];
int len = 0;
while((len=fr.read(chs))!=-1)
{
System.out.print(new String(chs,0,len));
}
(4)转换流1:如果有字节流对象,为了使用字符流的功能,就必须使用转换流进行操作。
2:案例:
键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferddWriter bw = new BufferedWriter(new FileWriter("a.txt"));
String line = null
while((line=br.readLine())!=null)
{
if("over".equals(line))
{
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
把文本文件的数据通过流对象在控制台显示
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferddWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null
while((line=br.readLine())!=null)
{
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
(5)打印流1:打印流是写数据的。
2:特点:
A:可以写任意数据类型的数据
B:如果启动了自动刷新,能自动刷新,还会换行。println()
C:可以直接往文件写数据
注意:哪些流对象可以直接读写文件?
看构造方法,如果同时有String和File的构造参数,那么该流对象就可以读写文件。
3:用打印流改进复制文本文件的操作
数据源:
c:\\a.txt
目的地:
d:\\b.txt
<span style="white-space:pre"> </span>BufferedReader br = new BufferedReader(new FileReader("c:\\a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("d:\\b.txt"),true);
String line = null;
while((line=br.readLine())!=null)
{
pw.println(line);
}
pw.close();
br.close();
(6)序列化流(理解)1:序列化:把对象按照流一样的方式在网络中传输,或者存储到文本文件
反序列化:把流数据还原成对象
2:如何实现序列化?
A:被序列化的对象所属的类必须实现序列化接口
B:用序列化流对象进行操作
3:序列化(对象)流对象
ObjectInputStream:
Object readObject()
ObjectOutputStream:
void writeObject(Object obj)
4:掌握:
A:看到类实现了序列化接口,就知道该类可以被序列化流对象操作
B:看到类实现了序列化接口,知道点击鼠标就可以解决黄色警告问题
4:Properties
(1)是Map体系一个集合类。
(2)特点:
A:可以把集合中的数据保存到文本文件,也可以把文本文件的数据加载到集合中。
B:该集合的键和值都是String类型
(3)特殊功能:
A:setProperty(String key,String value)
B:getProperty(String key)
getProperty(String key,String defaultValue)
C:Set<String> stringPropertyNames()
(4)和IO流结合的方法:
A:list 通过打印流把数据保存到文件中
B:load 通过任意流把文本中的数据加载到集合中
C:store 通过任意流把数据保存到文件中
(5)案例:
查找文件中是否有键为lisi的,如果有,则修改其值为50
5:字符编码(理解)
(1)编码表:
就是字符和对应的数据组成的一张表。
(2)常见的编码表:
ASCII
ISO-8859-1
GBK
GB2310
GB18030
UTF-8
BIG5
(3)转换流中的编码问题
A:字符流 = 字节流+编码表
B:通过转换流写入数据,指定为UTF-8编码,并通过UTF-8编码读取。
()案例:
复制文本文件 9种方式体现
数据源:c:\\a.txt
目的地:d:\\b.txt
方式1
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFile1 {
public static void main(String[] args) throws IOException {
//封装数据源
FileReader fr=new FileReader("c:\\a.txt");
FileWriter fw=new FileWriter("d:\\b.txt");
int ch=0;
while((ch=fr.read())!=-1){
fw.write(ch);
fw.flush();
}
fw.close();
fr.close();
}
}
方式2
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFile2{
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("d:\\a.txt");
FileWriter fw=new FileWriter("e:\\b.txt");
char[] chs=new char[1024];
int len=0;
while((len=fr.read(chs))!=-1){
fw.write(chs, 0, len);
}
fw.close();
fr.close();
方式3
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFile3 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("d:\\a.txt");
FileOutputStream fos=new FileOutputStream("e:\\b.txt");
int by=0;
while((by = fis.read()) != -1) {
fos.write(by);
}
fos.close();
fis.close();
}
}
方式4 用字节流--一次一个字节数组
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFile4 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("d:\\a.txt");
FileOutputStream fos=new FileOutputStream("e:\\b.txt");
byte[] bys=new byte[1024];
int len=0;
while((fis.read(bys))!=-1){
fos.write(bys, 0, len);
}
fos.close();
fis.close();
}
}
方式5用字符流--一次一个字
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFile5 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("d:\\a.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("e:\\b.txt"));
int ch = 0;
while ((ch = br.read()) != -1) {
bw.write(ch);
bw.flush();
}
br.close();
}
}
方式6 用字节流--一次一个字节数组
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFile6 {
public static void main(String[] args) throws IOException {
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("d:\\a.txt"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("e:\\b.txt"));
byte[] bys = new byte[1024];
int len = 0;
while((len=bis.read(bys))!=-1)
{
bos.write(bys,0,len);
}
bos.close();
bis.close();
}
}
方式7
import java.io.IOException;
public class CopyFile7 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("d:\\a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\b.txt"));
String line = null;
while((line=br.readLine())!=null)
{
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}
方式8
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFile8 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("d:\\a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\b.txt"));
char[] chs=new char[1024];
int len=0;
while((len=br.read(chs))!=-1){
bw.write(chs, 0, len);
}
br.close();
bw.close();
方式9
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFile9 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("d:\\a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\b.txt"));
int by=0;
while((by = br.read()) != -1) {
bw.write(by);
}
br.close();
bw.close();
}
}
4:复制图片 4种方式体现
数据源:c:\\a.jpg
目的地:d:\\b.jpg
<span style="white-space:pre"> </span>public class CopyImage {
public static void main(String[] args) throws IOException {
// method1();
method2();
}
// 用字节流--一次一个字节数组
private static void method2() throws IOException {
// 封装数据源和目的地
FileInputStream fis = new FileInputStream("mn.jpg");
FileOutputStream fos = new FileOutputStream("d:\\mn.jpg", true);
// 读写
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
}
// 释放资源
fos.close();
fis.close();
}
// 用字符流--一次一个字符
<span style="white-space:pre"> </span>private static void method1() throws IOException {
// 封装数据源和目的地
FileReader fr = new FileReader("mn.jpg");
FileWriter fw = new FileWriter("d:\\mn.jpg");
// 基本读写
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
// fw.flush();
}
// 释放资源
fw.close();
fr.close();
}
}
//用字符流--一次一个字节
<span style="white-space:pre"> </span>FileInputStream fis=new FileInputStream("mn.jpg");
FileOutputStream fos=new FileOutputStream("d:\\mn.jpg");
int by=0;
while((by = fis.read()) != -1) {
fos.write(by);
}
fos.close();
fis.close();
用字符流--一次一个字符数组
private static void method3() throws IOException {
FileReader fr=new FileReader("d:\\a.txt");
FileWriter fw=new FileWriter("e:\\b.txt");
char[] chs=new char[1024];
int len=0;
while((len=fr.read(chs))!=-1){
fw.write(chs, 0, len);
}
fw.close();
fr.close();
}
5:复制单级文件夹
public class CopyFolder {
public static void main(String[] args) throws IOException {
// 封装d:\\java这个目录
File srcFile = new File("d:\\java");
// 获取该目录所有满足条件的File[]数组。
File[] fileArray = srcFile.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isFile() && name.endsWith(".java");
}
});
//判断是否存在目的地目录,如果没有,就创建。
File destFile = new File("d:\\jad");
if(!destFile.exists()){
destFile.mkdir();
}
// 遍历File[]数组,获取到每一个File。
for (File file : fileArray) {
// file -- d:\\java\\Constant.java -- 数据源
//最终的结果: d:\\jad\\Constant.jad -- 目的地
String name = file.getName(); //Constant.java
String newName = name.replace(".java", ".jad");//Constant.jad
File newFile = new File(destFile,newName);//d:\\jad\\Constant.jad
//复制文件
BufferedReader br = new BufferedReader(new FileReader(file));
BufferedWriter bw = new BufferedWriter(new FileWriter(newFile));
String line = null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}
}