java无难事笔记(九)

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));

 

注意输入输出的时候都是字节数组

int

read(byte[] b)
          从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组

 

 

void

write(byte[] b, int off, int len)
          将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流

 

 

FileInputStream和FileOutputStream

    节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。

BufferedInputStream和BufferedOutputStream

    过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。

DataInputStream和DataOutputStream

      过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。

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");

         }

 

}

 

这两个方法声明为私有,按说在类外不可以调用,在序列化和反序列化的时候确实可以调用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值