------- <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>、期待与您交流! ----------