您的位置:首页 > 编程语言 > Java开发

java15-File类

2013-04-19 01:27 190 查看
------- android培训java培训、期待与您交流!
----------

1.File类

将文件或文件夹封装成对象。方便对文件和文件夹的属性信息进行操作。

File对象可以作为参数传递到构造函数。

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

//创建File对象。将a.txt封装成对象(可以将已有的和未出现的封装成对象)File f2 = new File("c:\\abc","a.txt");

//或多个参数

File f2 = new File("c:"+File.separator+"abc"+File.separator+"a.txt");

//File.separator跨系统分隔符

2.常见功能

1创建

boolean createNewFile();

在指定位置创建文件,存在返回falsel.

输出流对象一建立创建文件,存在时会覆盖。

boolean mkdir();

创建目录

boolean mkdirs();

创建多级目录

2删除

boolean delete();

删除失败返回false(如文件正在被使用)

void deleteOnExit();

程序退出时删除指定文件

3判断

boolean exists();

文件是否存在

isDirectory();是否目录

isFile();是否文件

必须先判断是否存在,才能继续判断是文件还是目录。

isHidden();是否隐藏文件

isAbsolute();是否抽象

4获取信息

getName();获取名称

getPath();获取路径

getParennt();返回绝对路径中的文件父目录,获取的是相对路径时,返回null

相对路径中有上层目录,会返回该目录。

getAbsolutePath();获取绝对路径

lastModified();返回最后修改时间

length();返回由此抽象路径名表示的文件的长度。

renameTo();

listRoots();列出可用的文件系统根。

list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录

列出目录下所有内容-递归

/*

列出目录下所有内容-递归

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可,在列出过程中出现还是目录的话,还可以再次调用本功能。

就是函数自身调用自身,这种表现形式,或说是编程手法,称为递归。

递归要限定条件,要注意递归次数,尽量避免内存溢出。

*/

import java.io.*;

class Demo
{
public static void main(String[] args)
{
File dir = new File("f:\\java1");
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]);
//执行操作
}
}
}


2.Properties

hashtable的子类

具备map集合的特点,里面存储的键值对都是字符串。不用<>

集合中和IO技术结合的集合容器。

特点是:可以用于键值对形式的配置文件。

通常是:键=值 

如:字体,型号等

setProperty(String,String)设置元素

getProperty(String)获取

Set<String>stringPropertyNames()获取全部

将文件中数据存入

1关联到流

2取一行切割

3存入

练习:

记录运行次数

达到限定,给出注册

PrintWriter

打印流

提供了打印方法,能将各种数据类型的数据原样打印

字节打印流

PrintStream

构造函数接收参数类型

1file对象File

2字符串路径String

3字节输出流OutputStream

字符打印流

PrintWriter

1File

2String

3OutputStream

4字符输出流Writer

SequenceInputStream

合并流

SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

SequenceInputStream(InputStream s1, InputStream s2) 

多于2个流时要用Vector集合的Enumeration迭代

SequenceInputStream(Enumeration<? extends InputStream> e) 

切割文件

操作对象

对象的持久化存储

ObjectInputStream与ObjectOutputStream

ObjectOutputStream

构造函数参数(OutputStream)

方法可以操作对象。

对象类要实现Serializable接口

给对象加个ID,实现序列化(ID根据类中成员确定)

static final long serialVersionUID = 42L;

加到类中给类固定ID,以便改变类后还能用

writeObject();

readObj();

只能序列化堆内存中成员。静态不能被序列化。

transiet修饰的成员也不能被序列化

管道流

PipedInputStream

PipedOutputStream

管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。

可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为处于 毁坏 状态。

::可以通过构造参数相互连接,也可以空参数,通过connect(PipedInputStream snk) 连接。

操作基本数据类型

DateInputStrean

DateOutputStrean

字节

ByteArrayInputStream

ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。 

关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。

ByteArrayOutputStream

此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。 

关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。

字符

CharArrayInputStream

CharArrayOutputStream

字符编码 

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

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

解码错误时,从新编码,再解码一次。

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

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

{

String s = "你好";

byte[] b1 = s.getBytes("GBK");//编码

System.out.println(Arrays.toString(b1));//打印字节数组

String s1 = new String(b1,"GBK");//解码

}

ASCII:美国标准信息交换码,用一个字节的7位表示。

ISO8859-1:拉丁码表,欧洲码表,用一个字节
4000
8位。

GB2312:中文编码表,GBK升级版:2个字节,1打头,(都是负数)

Unicode:国际标准码,多种文字,2个字节,Java语言默认使用。

UTF-8:最多三个字节

import java.io.OutputStreamWriter;

import java.io.FileOutputStream;

import java.io.InputStreamReader;

import java.io.FileInputStream;

class EncodeStream

{
public static void main(String[] args)throws Exception
{
//writeText();
readText();
}
public static void writeText()throws Exception
{
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"GBK");//"GBK"指定编码表
osw.write("你好");//写入数据
osw.close();//关闭流
}
public static void readText()throws Exception
{
InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"),"GBK");//指定编码表
char[] buf = new char[10];//建立字节数组
int len = isr.read(buf);//读取的字符数
String str = new String(buf,0,len);//字符数组存入字符串中
System.out.println(str);
isr.close();
}

}

UTF-8 修改版

0打头时读一个字节

110时读取二个字节

110 10

1110时读取三个字节

1110 10 10

当GBK编码符合utf-8时,系统默认用UTF-8解码,就出现“联通”乱码。前面加个汉字解决。

------- android培训java培训、期待与您交流!
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  基础