黑马程序员——JAVA笔记之IO流(二)

来源:互联网 发布:思派网络 ceo 马旭广 编辑:程序博客网 时间:2024/05/29 12:41

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

IO流(二)

五、流转换
键盘录入一行数据,其实就是读取一行数据的原来,也就是redLine方法。怎样使用readLine方法来完成键盘录入的一行数据的读取?
readLine方法是字符流BufferedReader类中的方法,而键盘录入的read方法是字节流InputStream的方法。这就要使用将字节流转成字符流再使用缓冲区的readLine方法。

转换流特有功能:转换流可以将字节转成字符,原因在于,将获取到的字节通过查编码表获取到指定对应字符。
转换流的最强功能就是基于 字节流 + 编码表 。没有转换,没有字符流。
发现转换流有一个子类就是操作文件的字符流对象:
InputStreamReader
|–FileReader
OutputStreamWriter
|–FileWrier
键盘录入的最常用写法:

BufferedReader bufr=New BufferedReader(new InputStreamReader(System.in));

想要操作文本文件,必须要进行编码转换,而编码转换动作转换流都完成了。所以操作文件的流对象只要继承自转换流就可以读取一个字符了。
但是子类有一个局限性,就是子类中使用的编码是固定的,是本机默认的编码表,对于简体中文版的系统默认码表是GBK。

FileReader fr = new FileReader("a.txt");InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"gbk");

以上两句代码功能一致,
如果仅仅使用平台默认码表,就使用FileReader fr = new FileReader(“a.txt”); //因为简化。
如果需要制定码表,必须用转换流。
转换流 = 字节流+编码表。
转换流的子类File = 字节流 + 默认编码表。
凡是操作设备上的文本数据,涉及编码转换,必须使用转换流。

*记住,转换流什么时候使用,字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要用到转换流。

**流操作的基本规律:
最通过的就是流对象有很多,不知道该用哪一个。
通过两个明确完成。
1.明确源和目的。
源:输入流。 InputStream Reader
目的:输出流。OutputStream Writer
2.操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3.当体系明确后,在明确要只有哪个具体的对象。
通过设备来进行区分。
原设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
例:
1.将一个文本文件中数据存储到另一个文件中,复制文件。
源:因为是源,所以使用读取流。InputStream Reader
是不是操作文本文件。
是!这是就可以选择Reader
这样体系就明确了。

接下来明确要使用该体系中的哪个对象。
明确设备:硬盘,上一个文件。
Reder体系中可以操作文件的对象是FileReader

是否需要提供效率:是!。加入Reader体系中缓存区BuffereReader

FileReader fr= new FileReader(“a.txt”);BufferedReader bufr= new BufferedReader(fr);

目的:OutputStream Writer
是否是纯文本。
是!Writer。
Writer体系中可一操作文件的对象是FileWriter。

是否需要提供效率:是!。加入Writer体系中缓存区BuffereWriter

FileWriter fw= new FileWriter(“b.txt”);BufferedWriter bufw= new BufferedWriter(fw);

六、File类
用来将文件或者文件夹封装成对象的类,方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传递给流的构造函数。
File的使用:可以讲已有的和未出现的文件过着文件夹封装成对象File f1= new File(”c:\abc\a.txt”);
f2=new File(“c:\abc”,”a.txt”);
File d=new File(“c:\abc”);
f3= new File(d,”c.txt”);
f4=new File(“c:”+File.separator+”abc”+File.separator+”a.txt”);
f1 f2 f3 f4是四种File类的方法。
1:创建。
boolean createNewFile():在指定目录下创建文件,如果该文件已存在,则不创建。而对操作文件的输出流而言,输出流对象已建立,就会创建文件,如果文件已存在,会覆盖。除非续写。
boolean mkdir():创建此抽象路径名指定的目录。
boolean mkdirs():创建多级目录。
2:删除。
boolean delete():删除此抽象路径名表示的文件或目录。
void deleteOnExit():在虚拟机退出时删除。
注意:在删除文件夹时,必须保证这个文件夹中没有任何内容,才可以将该文件夹用delete删除。
window的删除动作,是从里往外删。注意:java删除文件不走回收站。要慎用。
3:获取.
long length():获取文件大小。
String getName():返回由此抽象路径名表示的文件或目录的名称。
String getPath():将此抽象路径名转换为一个路径名字符串。
String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。
String getParent():返回此抽象路径名父目录的抽象路径名,如果此路径名没有指定父目录,则返回 null。
long lastModified():返回此抽象路径名表示的文件最后一次被修改的时间。
File.pathSeparator:返回当前系统默认的路径分隔符,windows默认为 “;”。
File.Separator:返回当前系统默认的目录分隔符,windows默认为 “\”。
listRoots() :列出可用的文件系统根。
4:判断:
boolean exists():判断文件或者文件夹是否存在。
boolean isDirectory():测试此抽象路径名表示的文件是否是一个目录。
boolean isFile():测试此抽象路径名表示的文件是否是一个标准文件。
boolean isHidden():测试此抽象路径名指定的文件是否是一个隐藏文件。
boolean isAbsolute():测试此抽象路径名是否为绝对路径名。
5:重命名。
boolean renameTo(File dest):可以实现移动的效果。剪切+重命名。
String[] list():列出指定目录下的当前的文件和文件夹的名称。包含隐藏文件。
如果调用list方法的File 对象中封装的是一个文件,那么list方法返回数组为null。如果封装的对象不存在也会返回null。只有封装的对象存在并且是文件夹时,这个方法才有效。

七、递归
列出自动目录下文件或文件夹,包括目录中的内容。也就是列出指定目录下所有内容。

因为目录中还有目录,而且只有同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,还可以再次调用本功能。
也就是函数自身调用自身。
这种表现形式,或者变成手法,称为递归。

package test;import java.io.*;public class FileDemo{    public static void main(String[] args){            File dir= new File("d:\\work");            showDir(dir);    }    public static void showDir(File dir){        System.out.println(dir);        File[] files= dir.listFiles();        for(int x=0; x<files.length; x++){            if(files[x].isDirectory())                showDir(files[x]);            else                System.out.println(files[x]);        }    }}

求二进制:

static void toBin(int num){    if(num>0){            toBin(i/2);            sop(i%2);    }}

toBin(999999):会内存溢出,以为递归的次数太多
递归要注意:
1.限定条件;
2.要注意递归的次数,避免溢出。

递归:就是函数自身调用自身。
什么时候用递归呢?
当一个功能被重复使用,而每一次使用该功能时的参数不确定,都由上次的功能元素结果来确定。
简单说:功能内部又用到该功能,但是传递的参数值不确定。(每次功能参与运算的未知内容不确定)。
递归的注意事项:
1:一定要定义递归的条件。
2:递归的次数不要过多。容易出现 StackOverflowError 栈内存溢出错误。
其实递归就是在栈内存中不断的加载同一个函数。

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

0 0
原创粉丝点击