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
原创粉丝点击