黑马程序员_IO

------- android培训java培训、期待与您交流! ----------  
1.集合 Properties

Properties是集合体系和IO体系相结合的集合容器,该对象的特点:

可以用于键值对形式的配置文件。

其主要方法:

load(InputStream inStream) 从输入流中读取属性列表(键和元素对)。

load(Reader reader) 按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。

store(OutputStream out, String comments) 以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。

store(Writer writer, String comments) 以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。

练习代码:建立一个配置文件。用于记录该软件的使用次数,该配置文件使用键值对的形式这样便于阅读数据,并操作数据,键值对数据是map集合,数据是以文件形式存储,使用io技术,那么map+io -->properties. 配置文件可以实现应用程序数据的共享。

import java.io.*;

import java.util.*;

 

class RunCount {

    public static void main(String[] args) throws IOException {

       Properties prop = new Properties();

       File file = new File("count.ini");

       if (!file.exists())

           file.createNewFile();

       FileInputStream fis = new FileInputStream(file);

       prop.load(fis);

       int count = 0;

       String value = prop.getProperty("time");

       if (value != null) {

           count = Integer.parseInt(value);

           if (count >= 5) {

              System.out.println("次数已到");

              return;

           }

 

       }

       count++;

 

       prop.setProperty("time", count + "");

 

       FileOutputStream fos = new FileOutputStream(file);

       prop.store(fos, "");

       fos.close();

       fis.close();

    }

}


2.打印流  PrintWriter和PrintStream

打印流提供了打印方法,可以将各种数据类型的数据都原样打印。构造函数中也提供了可以把文件对象、字符串路径文件名、指定字符集、输出流等作为参数传递。

打印流:

该流提供了打印方法,可以将各种数据类型的数据都原样打印。

字节打印流:

PrintStream

构造函数可以接收的参数类型:

1,file对象。File

2,字符串路径。String

3,字节输出流。OutputStream

字符打印流:

PrintWriter

构造函数可以接收的参数类型:

1,file对象。File

2,字符串路径。String

3,字节输出流。OutputStream

4,字符输出流,Writer。

带自动刷新,指定为文件时不能自动刷新,要自动刷新可以封装成流.

 


3.序列流 SequenceInputStream

对多个流进行合并。

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

import java.io.*;

import java.util.*;

 

class SequenceDemo {

    public static void main(String[] args) throws IOException {

       Vector<FileInputStream> v = new Vector<FileInputStream>();

       v.add(new FileInputStream("c:\\1.txt"));

       v.add(new FileInputStream("c:\\2.txt"));

       v.add(new FileInputStream("c:\\3.txt"));

       Enumeration<FileInputStream> en = v.elements();

       SequenceInputStream sis = new SequenceInputStream(en);

       FileOutputStream fos = new FileOutputStream("c:\\4.txt");

       byte[] buf = new byte[1024];

       int len = 0;

       while ((len = sis.read(buf)) != -1) {

           fos.write(buf, 0, len);

       }

       fos.close();

       sis.close();

    }

}

 


4对象流 ObjectInputStream和ObjectOutputStream

ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

注意:在自定义类中静态static 成员不会被序列化也就是不会被持久存储,如果想把非静态成员也不被序列化时可以在成员前加一个修饰符:transient;还可在类中自定义UID号:static final long serialVersionUID = 42L(UID号);

 


5.管道流 PipedInputStream和PipedOutputStream

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

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

           System.out.println("读取前。。没有数据阻塞");

           int len = in.read(buf);

           System.out.println("读到数据。。阻塞结束");

           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 {

           System.out.println("开始写入数据,等待6秒后。");

           Thread.sleep(6000);

           out.write("piped lai la".getBytes());

           out.close();

       } catch (Exception e) {

           throw new RuntimeException("管道输出流失败");

       }

    }

}

 

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

 

    }

}


6.包中的随机访问文件 RandomAccessFile

随机访问文件,自身具备读写的方法,内部封装了一个数组通过指针对数组的元素进行操作,还可以通过skipBytes(int x); seek(int x)来获取指针位置和设置指针位置。

构造函数:

RandomAccessFile(File file, String mode) 创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。

RandomAccessFile(String name, String mode) 创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。

此类只可以操作文件,而且还有固定的模式mode:

"r"    以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。 

"rw"   打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 

"rws"  打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 

"rwd"  打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。

 

此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。

通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。

 

 


7.操作基本数据类型的流

DataInputStream和DataOutputStream

需要注意的是:writeUTF(String str) 方法使用 UTF-8 修改版编码,所以在读取时同样也需要使用此编码因此应使用readUTF()方法与之对应。


8.操作字节数组的流

ByteArrayInputStream和ByteArrayOutputStream

ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。在构造时需要接收数据源,数据源是一个字节数组。

ByteArrayOutputStream此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。在构造时不用定义数据目的地,因为应对象中已内部封装了可变长度的字节数组。

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

 


9.操作字符数组的流

CharArrayInputStream和CharArrayOutputStream

 


10操作字符串的流

StringReader和StringWriter


11 IO流(转换流的字符编码)

能加编码表的只有四个

inputStreamReader

inputStreamWriter

printStreamReader

PrintStreamWriter

后两个只能打印不能读取

编码表(字符集)

ASCII:美国标准信息交换码

用一个字节的7位表示

ISO8859-1:拉丁码表、欧洲码表

用一个字节的8位表示

GB2312:中国的中文编码表

GBK:中国的中文编码表升级版

用两个字节来表示一个汉字

Unicode:国际校准码表。

所有文字都用两个字节来表示,java语言使用的就是Unicode

UTF-8:最多用三个字节来表示一个字符。

 

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

String -->byte[]:str.getBytes(字符集名);

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

Byte[] -->String:new Strnig(byte[],字符集名);

 

注意:1,当解码时指定字符集错了时可以通过原编码时的字符集进行再编码后再解码解决。

      但是GBK和UTF-8之间转错后不能通过此方法解决,因为两个编码表中都存在中文。

  2,图片的字符集是UTF-16BE ,UTF-16LE

 ------- android培训java培训、期待与您交流! ----------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值