------- android培训、java培训、期待与您交流! ----------
主要内容:一、对象的序列化;二、管道流;三、RandomAccessFile;四、操作基本数据类型;五、操作字节数组;六、字符编码
一、对象的序列化:
ObjectInputStream与ObjectOutputStream
被操作的对象需要实现Serializable(标记接口);
静态成员不能被序列化。
transient:被修饰的成员不能序列化。
例:
- import java.io.*;
- class ObjectStreamDemo
- {
- public static void main(String[] args) throws Exception
- {
- //writeObj();
- readObj();
- }
- public static void readObj()throws Exception
- {
- ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));
- Person p = (Person)ois.readObject();
- System.out.println(p);
- ois.close();
- }
- public static void writeObj()throws IOException
- {
- ObjectOutputStream oos =
- new ObjectOutputStream(new FileOutputStream("obj.txt"));
- oos.writeObject(new Person("lisi",30));
- oos.close();
- }
- }
二、管道流:
PipedInputStream和PipedOutputStream
输入输出可以直接进行连接,通过结合线程使用。
例:
- 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("写入数据等待1秒");
- Thread.sleep(1000);
- 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();
- }
- }
三、RandomAccessFile:
随机访问文件,自身具备读写的方法。
通过skipBytes(int x),seek(int x)来达到随机访问
RandomAccessFile
该类不算是IO体系中的子类。
而是直接继承自Object。
但是他是IO包中成员,因为他具备读和写功能。
内部封装了一个数组,而且通过指针对数组的元素进行操作。
可以通过getFilePointer获取指针位置,
同时可以通过seek改变指针的位置。
其实完成读写的原理就是内部封装了字节输入流和输出流。
通过构造函数可以看出,该类只能操作文件。
而且操作文件还有模式:只读r,读写rw等。
如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。
如果模式为rw。操作的文件不存在,会自动创建,如果存在则不会覆盖。
例:
- import java.io.*;
- class RandomAccessFileDemo
- {
- public static void main(String[] args) throws IOException
- {
- writeFile();
- readFile();
- }
- public static void readFile()throws IOException
- {
- RandomAccessFile raf = new RandomAccessFile("ran.txt","r");
- //调整对象中指针。
- //raf.seek(8);
- //跳过指定的字节数
- raf.skipBytes(8);
- byte[] buf = new byte[4];
- raf.read(buf);
- String name = new String(buf);
- int age = raf.readInt();
- System.out.println("name="+name);
- System.out.println("age="+age);
- raf.close();
- }
- public static void writeFile()throws IOException
- {
- RandomAccessFile raf = new RandomAccessFile("ran.txt","rw");
- raf.write("李四".getBytes());
- raf.writeInt(97);
- raf.write("王五".getBytes());
- raf.writeInt(99);
- raf.close();
- }
- }
DataInputStream与DataOutputStream
可以用于操作基本数据类型的数据的流对象。
例:
- import java.io.*;
- class DataStreamDemo
- {
- public static void main(String[] args) throws IOException
- {
- //writeData();
- readData();
- }
- public static void readData() throws IOException
- {
- DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
- int num = dis.readInt();
- boolean b = dis.readBoolean();
- double d = dis.readDouble();
- System.out.println("num="+num);
- System.out.println("b="+b);
- System.out.println("d="+d);
- dis.close();
- }
- public static void writeData()throws IOException
- {
- DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
- dos.writeInt(567);
- dos.writeBoolean(false);
- dos.writeDouble(9886.897);
- dos.close();
- }
- }
五、操作字节数组:
ByteArrayInputStream与ByteArrayOutputStream
用于操作字节数组的流对象。
ByteArrayInputStream:在构造的时候,需要接收数据源,而且数据源是一个字节数组。
ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。
这就是数据的目的地。
因为这两个流对象都操作的数组,并没有使用系统资源。
所以,不用进行close关闭。
在流操作规律讲解时:
源设备:
键盘 System.in,硬盘 FileStream,内存 ArrayStream。
目的设备:
控制台 System.out,硬盘FileStream,内存 ArrayStream。
用流的读写思想来操作数据。
操作字符数组:CharArrayReader与CharArraywrite
操作字符串:StringReader与SringWriter
例:
- import java.io.*;
- class ByteArrayStream
- {
- public static void main(String[] args) throws IOException
- {
- //数据源。
- ByteArrayInputStream bis = new ByteArrayInputStream("ABCDE".getBytes());
- //数据目的
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- int by = 0;
- while((by=bis.read())!=-1)
- {
- bos.write(by);
- }
- System.out.println(bos.size());
- System.out.println(bos.toString());
- bos.writeTo(new FileOutputStream("a.txt"));
- }
- }
六、字符编码:
1,字符流的出现为了方便操作字符。
更重要的是加入了编码转换。
通过子类转换流来完成
InputStreamReader
OutputStreamWriter
在两个对象进行构造的时候可以加入字符集。
例:
- import java.io.*;
- class EncodeStream
- {
- public static void main(String[] args) throws IOException
- {
- //writeText();
- readText();
- }
- public static void readText() throws IOException
- {
- 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);
- }
- public static void writeText()throws IOException
- {
- OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf.txt"),"utf-8");
- osw.write("你好");
- osw.close();
- }
- }
2, 编码:字符串变成字节数组。
解码:字节数组变成字符串。
String-->byte[]; str.getBytes(charsetName);
byte[]-->String; new String(byte[],charsetName);
例:
- import java.util.*;
- class EncodeDemo
- {
- public static void main(String[] args)throws Exception
- {
- String s = "你好";
- byte[] b1 = s.getBytes("GBK");
- System.out.println(Arrays.toString(b1));
- String s1 = new String(b1,"iso8859-1");
- System.out.println(s1);
- //对s1进行iso8859-1编码
- byte[] b2 = s1.getBytes("iso8859-1");
- System.out.println(Arrays.toString(b2));
- String s2 = new String(b2,"gbk");
- System.out.println(s2);
- }
- }
3,字符编码——联通
例:
- class EncodeDemo2
- {
- public static void main(String[] args) throws Exception
- {
- String s = "联通";
- byte[] by = s.getBytes("gbk");
- for(byte b : by)
- {
- System.out.println(Integer.toBinaryString(b&255));
- }
- }
- }