------- 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:拉丁码表,欧洲码表,用一个字节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培训、期待与您交流! ----------