File
File可以创建文件和目录
创建文件:调用createNewFile()把字符串的最后一个看成是文件名(不管是否有后缀)
File f = newFile("C:\\java\\9\\Test");
f.createNewFile();
前面的C:\java\9\Test必须是存在的路径,否则会报错,无法找到路径.
创建目录:
File f = new File("C:\\java\\9\\Test");
f.mkdir();
//如果调用mkdirs则不管是否存在指定路径,只要不存在,java就会帮你创建
String List()f
String[] obj =f.list();
for(int i = 0;i<obj.length;i++)
{
System.out.println(obj[i]);
}
List返回当前目录下的文件以及目录
也可以传入一个滤波器来过滤一些文件。
String[] | list(FilenameFilter filter) |
对查找出来的字符串,可以通过isFile(),isDir()来判断是文件还是目录。
File.separator与平台无关的分隔符
Delete(),DeleteOnExit()函数
DeleteOnExit主要是程序退出的时候把文件删除掉,好处:程序临时文件,运行时的信息
createTempFile(文件名,后缀) 在默认的临时目录创建,在环境变量的地方可以看到。
后缀要加上点
输入流和输出流
InputStrem输入流
系统输入输入输出
System.in读取一个数据read
System.out输出一个数据
FileOutputStreamfos = new FileOutputStream("1.txt");
fos.write("laichunbin".getBytes());//字符串的getBytes字节数组
fos.close();
FileInputStreamfis = new FileInputStream("1.txt");
byte array[] = newbyte[100];
fis.read(array);//传进byte数组的array必须是一件分配的内存
System.out.println(newString(array,0,array.length));
注意输入输出的时候都是字节数组
| read |
| write |
n FileInputStream和FileOutputStream
节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。
n BufferedInputStream和BufferedOutputStream
过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。
n DataInputStream和DataOutputStream
过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。
n PipedInputStream和PipedOutputStream
管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。
过滤流其实就是在基本的节点流之后链接,增强它的功能。
FileInputStreamfis = new FileInputStream(“1.txt”);
BufferdInputStreambis = new BufferInputStream(fis);//此时输入流bis增加了缓冲区可以加快读写速度;
DataInputStream dis = new DataInputStream(bis);
再把数据输入流连接到bis后面,此时dis具有缓冲区,提供基本数据的输入输出
DataInputStream实现了DataInput接口,提供了基本数据类型的的输入输出功能
*FileOutputStreamfos=new FileOutputStream("1.txt");
//fos.write("http://www.mybole.com.cn".getBytes());
//fos.close();
BufferedOutputStream bos=newBufferedOutputStream(fos);
//bos.write("http://www.mybole.com.cn".getBytes());
//bos.flush();
//bos.close();
DataOutputStream dos=newDataOutputStream(bos);
byte b=3;
int i=78;
char ch='a';
float f=4.5f;
dos.writeByte(b);
dos.writeInt(i);
dos.writeChar(ch);
dos.writeFloat(f);
dos.close();
FileOutputStream fos = newFileOutputStream("2.txt");
OutputStreamWriter osw = newOutputStreamWriter(fos);
String str="aaa;
osw.write(str,0,str.length());//写入的时候以字符为单位
osw.close();
FileInputStream fis = newFileInputStream("2.txt");
InputStreamReader isr = newInputStreamReader(fis);
char[] temp = new char[100];
isr.read(temp,0,temp.length);//读入的时候以字符为单位,
System.out.println(newString(temp));
OutputStreamWriter,InputStreamReader是从字节流到字符流的转换,它主要向程序员提供字符的接口!
获取当前可用字符集
import java.util.*;
import java.nio.charset.*;
SortedMap sm = Charset.availableCharsets();
Collection c = sm.values();
Iterator it = c.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
availableCharset()返回当前可用字符集
Properties pps = System.getProperties();获取系统当前的属性
pps.list(new PrintStream(System.out));
问题:字符编码的方式,怎么改变编码方式,还是能够正常输出汉字呢?
Properties pps = System.getProperties();
pps.list(new PrintStream(System.out));
pps.put("file.encoding","ISO-8859-1");
int temp;
byte[] b = new byte[100];
int i = 0;
while((temp=System.in.read())!='q')//read的返回值是int型的
{
b[i] = (byte)temp;
i++;
}
System.out.println(new String(b,0,i));
对象序列化
序列化的对象必须实现Seriable
n 对象转换为字节流保存起来,并在日后还原这个对象,这种机制叫做对象序列化。
n 将一个对象保存到永久存储设备上称为持续性。
n 一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。
可以通过ObjectInputStream和ObjectOutputStream来实现对象的写入和读出writeObject和ReadObject,同时这两个类还实现了DataInput和DataOutput接口,所以可以直接进行基本数据的输入输出。
readObject反序列化的时候不回去调用对象的构造函数,只是根据保存信息构造对象!
n 当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。
n 如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。
n 如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。(比如Thread t = new Thread(),t这个对象不可以序列化,但是加上transient就可以序列化
序列化,有的需要保存有的不需要保存,可以通过重写两个方法
ReadObject和WriteObject两个方法
class Employeeimplements Serializable
{
String name;
int age;
double salary;
transient Thread t=new Thread();
public Employee(String name,intage,double salary)
{
this.name=name;
this.age=age;
this.salary=salary;
}
private voidwriteObject(java.io.ObjectOutputStream oos) throws IOException
{
oos.writeInt(age);
oos.writeUTF(name);
System.out.println("WriteObject");
}
private voidreadObject(java.io.ObjectInputStream ois) throws IOException
{
age=ois.readInt();
name=ois.readUTF();
System.out.println("ReadObject");
}
}
这两个方法声明为私有,按说在类外不可以调用,在序列化和反序列化的时候确实可以调用的。