一.IO流概述
1 什么是IO流 (流就是通道对象)
IO - Input(输入) Output(输出)
在Java的IO中,流是一个很形象的概念,就像水流一样。
当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。
当程序需要写出数据的时候,就会开启一个通向目的地的流
水流里面流的是水,输入输出流流的是二进制数据!
二.File
(1)何为File
File是java提供的一个用来代表磁盘上的一个实际文件(其实也可以上网络上的一个文件),它是一个存在在内存中的一个对象而已
File 不完全等同 磁盘上的文件
File 只是代表 磁盘上的文件
我们可以用File对象来操作它代表的磁盘文件,如删除,创建,改名。。。。
(2)File的API介绍
1.常量和构造方法
System.out.println(File.separator);//文件路径的分隔符 System.out.println(File.pathSeparator);//Path环境变量的分隔windows ; linux : File file1 = new File("D:\\corejava\\TestFile.java"); File file2 = new File("D:\\corejava", "TestFile.java"); File file3 = new File(new File("D:\\corejava"),"TestFile.java");
2.创建,重命名,移动,删除
createNewFile()-创建一个新的文件
mkdir-创建一个文件夹,但是不能创建层级
mkdirs - 创建层级文件夹
renameTo() - 文件重命名或移动
delete - 删除文件和文件夹
3.判断是文件还是目录
isFile() - 判断是否是文件 a.txt ,b.doc
isDirectory() - 判断是否是目录 (音乐) ,文件夹
4.获取文件名和路径
getName() - 获得文件名
getAbsolutePath() - 获得文件的绝对路径
5.读取权限和时间属性
6.绝对路径和相对路径
绝对路径就是以确切的目录开始
windows确切的目录从盘符开始,例如C:\ D:\
linux的确切的目录就是根目录,就是 /
相对路径
. 当前目录,可以省略,例如a.txt 和 ./a.txt 是一样的
.. 上一级目录
java下的当前目录在哪里??
得看你在哪个目录下运行java命令
(3)文件过滤
list() - () listFiles() list(FilenameFilter) listFiles(FilenameFilter) listFiles(FileFiter)
public class TestFiles8 { public static void main(String[] args) { File f = new File("c:\\d"); if (f.isDirectory()) {// 只有是文lenameFilter filter = new TxtFileNameFilter(); String[] names = f.list(filter); for(String name : names){ System.out.println(name); } File[] files = f.listFiles(filter); for(File file : files){ System.out.println(file.isFile()+"------->"+file.getAbsolutePath()); } //保留所有le[] dirs = f.listFiles(new DirFileFilter()); for(File d : dirs){ System.out.println(d.isDirectory()+" =====> "+d.getAbsolutePath()); } } } } class TxtFileNameFilter implements FilenameFilter { @Override public boolean accept(File dir, String name) { return name.endsWith(".txt"); } } class DirFileFilter implements FileFilter { @Override public boolean accept(File file) { return file.isDirectory(); } }
(4)递归算法
应用:解决数学中的一些问题,阶乘,求斐波那切数列。
java 应用:遍历树都用到递归
注意:递归一定要有一个最终结束的条件。
核心:自己调用自己
没有结束条件的递归错误:
Exception in thread "main" java.lang.StackOverflowError
求阶乘 5!= 5*4*3*2*1
5!=5*4!=5*4*3!=5*4*3*2!=5*4*3*2*1!=5*4*3*2*1
4!=4*3!=
n!=n*(n-1)!
fn(n)
if(n==1){
return 1;
}
return n*fn(n-1)
求斐波那切数列
1 1 2 3 5 8 13 .....
fn(1) = 1
fn(2) = 1
fn(3) = 2 = fn(3-1)+fn(3-2)
fn(4) = 3 = fn(4-1)+fn(4-2)
fn(5) = 5 = fn(5-1)+fn(5-2)
fn(6) = 8 = fn(6-1)+fn(6-2)
fn(n) => n=1 return 1
=> n=2 return 1
= n>2 return fn(n-1)+f(n-2);
public class TestDiGui { static int i = 0; public static void go() { System.out.println("sfdfs"); i++; System.out.println(i); if(i>=100){ return; } go(); } public static int fn(int n) { //fn(n) ===>n! if (n==1) { return 1; } return n*fn(n-1);//n*n! } public static void listFileName(File file) { if (file.isFile()) { //文件 System.out.println(file.getName()); }else { //文件夹 System.out.println(file.getName()); File[] files = file.listFiles(); for (File f : files) { listFileName(f); } } } public static void listFileName2(String s ,File file) { s+="-->"; if (file.isFile()) { //文件 System.out.println(s+file.getName()); }else { //文件夹 System.out.println(s+file.getName()); File[] files = file.listFiles(); for (File f : files) { listFileName2(s,f); } } } public static int boFei(int n) { if(n==1||n==2){ return 1; } return boFei(n-1)+boFei(n-2); } public static void main(String[] args) { // int r = boFei(5); // System.out.println(r); //go(); // int r = fn(3); // System.out.println(r); // File file = new File("c:\\test"); // listFileName(file); File file = new File("c:\\test"); listFileName2("" , file) ; } }
三.IO流分类
1 三种分类法
按流的方向:输入流和输出流
按数据的大小:字节(byte)流和字符(char)流
按功能分:节点流 和 过滤流(包装流,装饰流,处理流)
2 输入输出流
3 字节流和字符流
4 节点流和过滤流
节点流就是直接接数据源的流(硬盘,网络)
四.IO流类(API)体系
输入:Input Read
输出:Output Write
字节流:以Stream结尾
字符流:以Reader和Writer结尾
节点流:构造方法的参数是一个文件或者其它的数据源
过滤流:构造方法的参数是另外一个流
五.字节流
(1)OutputStream和FileOutputStream
字节流+ 输出
FileOutputStream(FileDescriptor fdObj)
构造方法的讲解网址:
http://www.fengfly.com/plus/view-214059-1.html
(2)InputStream和FileInputStream
字节流+ 输入流
六.字符流
(1)Writer和FileWriter
字符流+输出流
构造方法使用例子的网址:
FileWriter(FileDescriptor fd)
http://www.jb51.net/article/87476.htm
(2)Reader和FileReader
字符流+ 输入流
原文地址:https://www.cnblogs.com/Transkai/p/10357387.html