黑马程序员—19—java基础:有关File类的学习笔记和学习心得体会

 ------- <a href="http://www.itheima.com" target="blank">android培训</a><a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

1. File类简介: 

a) 用来将文件或者文件夹封装成对象

b) 方便对文件与文件夹进行操作

c) File对象可以作为参数传递给流的构造函数

例子:

class FileDemo

{

public static void main(String[] args)

{

consMethod();

}

public static void consMethod()

{

//将a.txt封装成file对象,可以将已有的和出现的文件或文件夹封装成对象。

File f1 = new File("c:\\abc\\a.txt");

File f2 = new File("c:\\abc","b.txt");

File d = new File("c:\\abc");

File f3 = new File(d,"c.txt");

File f4 = new File(“”

}

}

2.  File类常见的方法

a) 创建:boolean createNewFile();在指定的位置创建文件,如果该文件已存在,则不创建,返回false,和输出流不一样,输出流对象一建立就创建文件,而且文件已经存在,会覆盖。

boolean mkdir():创建文件夹,只创建一级文件夹

boolean mkdirs():创建多级文件夹

例子:

class FileDemo

{

public static void main(String[] args)throws IOException

{

method_1();

}

public static void method_1()throws IOException

{

File f = new File("file.txt");

sop("create:"+f.createNewFile());

}

public static  void sop(Object obj)

{

System.out.println(obj);

}

}

b)删除:

boolean delete();删除失败返回false

void deleteOnExit()在程序退出时删除指定文件

例子同上

c) 判断:

boolean exists():文件是否存在

isFile();判断是否是文件

isDirectory():判断是否是目录或文件夹

isHidden();判断是否是隐藏文件

判断前要先判断文件或目录是否存在

d) 获取信息:

getname()

getPath()

getParent()//绝对路径下的父母路,没写绝对路径即相对路径则返回null

getAbsolutePath()//获取绝对路径

lastModified()//最后一次被修改时间

length()//获取文件大小

e) 文件重命名

    public static void method()

{

Fele f1 = new File(c:\\Test.java);

Fele f2 = new File(c:\\haha.java);

sop(rename+f1.renameTo(f2));//把f1中的Test.java改为f2中的 //haha.java,还可以改f2的位置如:d:\\haha.text

}

3.  列出盘符下所有的目录

public static void listDemo()

{

File f = new File("c:\\");//列出c盘下所有的目录

String [] names = f.list();//调用list方法的file对象必须是封装了         //一个目录,该目录必须存在

for(String name : names)

{

System.out.println(name);

}

}

例子中list只有文件名。而ListFiles则是对象可以计算文件大小,路径

4.  递归:

例子

/*

 * 列出指定目录下文件或则文件夹,包含子目录中的内容,也就是列出指定目录

 * 下所有的内容

 * 因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。

 * 在列出过程中出现的还是目录的话,还可以再次调用本功能,也就是调用自身,

 * 这种表现形式,或者编程手法成为递归。*/

import java.io.*;

class FileDemo

{

public static void main(String[] args)throws IOException

{

File dir = new File("d:\\java123");

showDir(dir);

}

public static void showDir(File 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]);

}

}

}

递归注意:

1.限定条件;

2.要注意递归的次数,尽量避免内存溢出。

5. Properties是hashtable的子类

也就是说它具备map集合的特点,而且它里面存储的键值对都是字符串,是集合中和io 技术相结合的集合容器,该对象的特点:可以用于键值对形式的配置文件。

6.  打印流:

该流提供了打印方法,可以将各种数据类型的数据都原样的打印;

字节打印流:

printStream

构造函数可以接收的参数类型:

1.file对象,File

2.字符串路径,string

3.字节输出流。OutputStream

字符打印流

printWriter

构造函数可以接收的参数类型:

1.file对象,File

2.字符串路径,string

3.字节输出流。OutputStream

4.字符输出流,Writer

PrintWriter out = new printWriter(System.out,true)//当是文档时不可以用true,可以把文档封装到FileWriter(a.txt),true

打印时可以用:

out.println();//println前面有true是自动刷新

7.  序列流

SequenceInputStream

对多个流进行合并

8.  操作对象

ObjectInputStream与ObjectOutputStream

被操作的对象需要实现Serializable

把一个对象存到内存中,但是这个类对象必须实现接口:Serializable

即:

inport java.io.*;

class Person implements Serializable{}

把对象序列化,但是静态不能序列化,还有:transient修饰的不能序列化

oos.writeObject(new Person(lisi,36));//写对象

Person p = (Person)ois.readObject();//读对象

9.  管道流:

PipeInputStream和PipeOutputStream

输入输出可以直接进行连接,通过结合线程使用。

例子:

import java.io.*; 

class Read implements Runnable

{

private PipedInputStream in;

Read(PipedInputStream in)

{

this.in = in;

}

public void run()

{

try

{

byte[] buf = new byte[1024];

int len = in.read(buf);

String s = new String(buf,0,len);

System.out.println(s);

in.close();

}

catch(IOException e)

{

throw new RuntimeException("管道读取失败");

}

}

}

class Write implements Runnable

{

private PipedOutputStream out;

Write(PipedOutputStream out)

{

this.out = out;

}

public void run()

{

try

{

out.write("piped lai la ".getBytes());

out.close();

}

catch(IOException e)

{

throw new RuntimeException("管道输出失败");

}

}

}

public class PipedStreamDemo 

{

public static void main(String[] args) throws IOException

{

PipedInputStream in = new PipedInputStream();

PipedOutputStream out =new PipedOutputStream();

in.connect(out);

Read r = new Read(in);

Write w = new Write(out);

new Thread(r).start();

new Thread(w).start();

}

}

9.  RandomAccessFile

随机访问文件,自身具备读写的方法。

通过skipBytes(int x),seek(int x)来达到随机访问。

该类不是io体系中子类,而是直接继承自Object。

但是它是io包中成员,因为它具备读和写功能。

内部封装了一个数组,而且通过指针对数组的元素进行操作。

可以通过getFilePointer获取指针位置。

同时可以通过seek改变指针的位置。

其实完成读写的原理就是内部封装了紫凯杰输入流和输出流。

注意:该类只能操作文件

10.  操作基本数据类型

DataInputStream与DataOutputStream

 操作字节数组

ByteArrayInputStream与ByteArrayOutputStream

不会产生任何异常

ByteArrayInputStream:在构造的时候,需要接收数据源,而且数据源是一个

字节数组,

ByteArrayInputStream  bis =new ByteArrayInputStream(agag.getBytes())

getBytes()就是存入数组

ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经

封装了可变长度的字节数据,这就是数据目的地。

 操作字符数组

CharArrayReader与CharArrayWrite

 操作字符串

StringReader与StringWriter

11.  总结;

源设备:键盘:System.in  硬盘:FileStream  内存:ArrayStream

目的设备:控制台:System.out  硬盘:FileStream  内存:ArrayStream

12.  字符编码

a) 字符流的出现为了方便操作字符

b) 更重要的是加入了编码转换

c) 通过子类转换流:InputStreamReader和OutputStreamWriter

d) 在两个对象进行构造的时候可以加入字符集

13.  编码与解码

编码:字符串变成字节数组

String-->byte[]:str.getBytes(charsetName)

解码:字节数组变成字符串

byte[]-->String: new String(byte[],charsetName)

例子:

String s = 你好

编码:byte[] b1 = s.getBytes(GBK);//GBK可省

解码:String s1 = new String(b1,GBK);//GBK可省

如果在服务器上用的是isoBB59-1,当你输入中文是返回的是乱码,

此时需要你在用isoBB59-1编一次,然后用输入的GBK或utf-8解码。

但是当你的服务器用utf-8编错时,重编,解码就不行,因为gbk中一个汉字

对应2个字节,而utf-8对应3个字节。

14.  学习心得和体会

掌握File的增删改查

源设备:键盘:System.in  硬盘:FileStream  内存:ArrayStream

目的设备:控制台:System.out  硬盘:FileStream  内存:ArrayStream

 

 ------- <a href="http://www.itheima.com" target="blank">android培训</a><a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值