IO流
来源:互联网 发布:淘宝靠谱香水店铺 编辑:程序博客网 时间:2024/05/16 01:36
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:// 方式1File file = new File("d:\\a.txt");File file2 = new File("d:\\aaa");// 方式2File file3 = new File("d:\\", "a.txt");File file4 = new File("d:\\", "aaa");// 方式3File 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());// trueSystem.out.println("isFile:" + file.isFile());// trueSystem.out.println("isDirectory:" + file.isDirectory());// falseSystem.out.println("isAbsolute:" + file.isAbsolute());// falseSystem.out.println("canRead:" + file.canRead());// trueSystem.out.println("canWrite:" + file.canWrite());// trueSystem.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() {@Overridepublic 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\\javaFile 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 = nullwhile((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 = nullwhile((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() {@Overridepublic 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.javaString newName = name.replace(".java", ".jad");//Constant.jadFile 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();}}}
0 0
- 【IO流】IO框架
- IO流呀IO流
- 字符IO&数据流IO&对象流IO
- io流
- io流
- IO流
- IO流
- IO 流
- IO流
- io流
- IO流
- io流
- IO流
- IO流
- IO流
- IO流
- IO流
- IO流
- 设计模式六大原则(6):开闭原则OCP(The Open/Closed Principle )
- poj 2184--Cow Exhibition
- DiskLruCache
- java.lang.OutOfMemoryError (OOM)解密 & Java heap dumps 解析 (一)
- C++学习——Overriding(1)
- IO流
- 。。。
- 数独
- 第一篇、Java入门
- OJ(Online Judge)系统及ACM测试题库大全
- 不用后缀表达式进行表达式计算(加、减、乘、除、整除、取余、指数)
- JAVA多线程和并发基础面试问答
- 杭电1847
- LeetCode - Median of Two Sorted Arrays