按功能方向性分,可分为输入,输出流,又可分为节点流,处理流;又可分为8bit字节流,16bit字符流。 如果是Reader结尾的都是字符流,以Stream结尾的都是字节流。 对于输出的缓冲流,写出的市局会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。 转换流:InputStreamReader和OutputStreamWriter用与字节数据到字符数据之间的转换。 FileOutputStream("文件",true)表示在文件内容后追加。 getEncoding()得到字符编码 ----ISO8859-1 是latin-1 西欧语言 Print流, PrintWriter 和PrintStream都是属于输出流,分别针对字符和字节。 println方法用于多种数据类型的输出。 System.setOut(PrintStream)。重新设置out的值。
直接将Object写入或读出 transient关键字 表示透明的.不考虑 serializable接口 ,标记性接口 序列化 externalizable这个接口继承于serializable ,外部的,自己控制序列化过程
System.in连接到键盘,是InputStream类型的实例对象。
system.out连接显示器,是PrintStream类的实例对象。
InputStream的read方法总是返回-1来表示输入流的结束。
DataInputStream和DataOutputStream,过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。 PipedInputStream和PipedOutputStream,管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。
/r 13, /n 是10;在ascii int ch= in.read(); if(ch=='/r') continue; if(ch=='/n'){ } 操作IO明确规律: 1.明确源和目的 源:输入流 InputStream Reader 目的: 输出流 OutputStream Writer 2.操作的数据是否是纯文本 是:字符流 否:字节流 3.当体系明确后,再确定具体对象 源设备:内存,硬盘。键盘 目的设备:内存,硬盘,控制台.
程序---DataOutputStream--->BufferedOutputStream->FileOutputStream --->文件 (写入)
程序-<----DataInputStream-<----BufferedInputStream<----FileInputStream<-----文件 (读取)
package ZHANG.IO.DataStream; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class DataStreamTest { public static void main(String[] args) { try { FileOutputStream fos = new FileOutputStream("count.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream dos = new DataOutputStream(bos); dos.writeUTF("ab中国"); dos.writeBytes("ab中国"); dos.writeChars("ab中国"); dos.close(); FileInputStream fis = new FileInputStream("count.txt"); BufferedInputStream bis = new BufferedInputStream(fis); DataInputStream dis = new DataInputStream(bis); System.out.println(dis.readUTF()); byte[] buf = new byte[1024]; //不知道byte有多长 int len = dis.read(buf); System.out.println(new String(buf,0,len)); dis.close(); /*ab中国ab-?*/ } catch (IOException e) { e.printStackTrace(); } } }
字节流转换字符流
InputStream-->InputstreamReader ---> BufferedReader--->File Reader 将一个字节流中的字节码字符后读取 OutputStream-->OutputStreamWriter--->BufferedWriter--->File Writer 讲字符编码成字节后写入到一个字节流中
字符编码 字符a对应数字97, b对应98等. 这种字符与数字对应的编码规则称为ASCII 。它的最高bit位都为0。也就是这些数字在(0-127之间)。 中文字符的每个字符2个字节,最高位为1。 ISO(国际标准化组织)将世界所有文字统一编码,称值为Unicode编码。中国的"中"发到任何一个国家本地化系统中仍然是"中"。Unicode编码的字符占2个字节,范围2的16次方(65553)。 UTF-8 /u0001和/u007f之间的字符,utf-8编码为(byte)c ,原来的字符。 UTF-16 编码在Unicode编码上增加了对Unicode编码没有的那些字符的表示方式。
\u开头的是一个Unicode码的字符,每一个'\u0000'都代表了一个空格 通常中文在的显示都是被转化为Unicode显示的. Unicode可同时包含65536个字符,ASCII/ANSI只包含255个字符,实际上是Unicode的一个子集。Unicode字符通常用十六进制编码方案表示,范围在'\u0000'到'\uFFFF'之间。\u0000到\u00FF表示ASCII/ANSI字符。\u表示这是一个Unicode值. 更正,\u0000代表的应该是NULL,输出控制台是一个空格...Unicode中的前128个编码与ASCII码是相同的。
BufferedWriter bw = new BufferedWriter(new FileWriter("d://ip.txt")); BufferedReader br = new BufferedReader(new FileReader("d://ip.txt")); String s = null; for(int i=0;i<100;i++){ s = String.valueOf(Math.random()); bw.write(s); bw.newLine(); } bw.flush(); while((s = br.readLine())!= null){ System.out.println(s); } bw.close(); br.close();
字节流转换
//字节流转换字符流 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d://ip.txt")); osw.write("fdjsafjlkdsafd你好"); System.out.println(osw.getEncoding()); osw.close(); osw = new OutputStreamWriter(new FileOutputStream("d://ip.txt",true),"ISO8859-1"); //追加 osw.write("hahhhhhhhh你好"); System.out.println(osw.getEncoding()); osw.close();
PrintWrite的println方法根据系统不同,输出文本标识符,windows下“/r/n”,Linux下是"/n"
==========================
管道通信,实现各个模块之间的松耦合通信 。
Sender.java Receiver.java main
package ZHANG.IOThreadpro; import java.io.PipedOutputStream; public class Sender extends Thread { private PipedOutputStream out = new PipedOutputStream(); public PipedOutputStream getOutputStream(){ return out; } public void run(){ String strInfo = new String("hello,receiver"); try { out.write(strInfo.getBytes()); out.close(); } catch (Exception e) { // TODO: handle exception } } }
---------------------------------------------------------------------
package ZHANG.IOThreadpro; import java.io.PipedInputStream; public class Receiver extends Thread { private PipedInputStream in = new PipedInputStream(); public PipedInputStream getInputStream(){ return in; } public void run(){ byte[] buf = new byte[1024]; try { int len = in.read(buf); System.out.println("the folowing message comes from sender:/n"+ new String(buf,0,len)); in.close(); } catch (Exception e) { // TODO: handle exception } } }
---------------------------------------------------------------------------
package ZHANG.IOThreadpro; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; public class PipedStreamTest { public static void main(String[] args) throws IOException { Sender t1 = new Sender(); Receiver t2 = new Receiver(); PipedOutputStream out = t1.getOutputStream(); PipedInputStream in = t2.getInputStream(); in.connect(out); t1.start(); t2.start(); } }
====================================================================
ByteArrayInputStream ,ByteArrayOutputStream
用于以IO流的方式完成对数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能。
package ZHANG.IO; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class ByteArrayTest { public static void main(String[] args) { String tmp = "fdadfajkldsajlfds"; byte[] src = tmp.getBytes(); ByteArrayInputStream input = new ByteArrayInputStream(src); ByteArrayOutputStream output = new ByteArrayOutputStream(); transfrom(input,output); byte[] result = output.toByteArray(); //此处用到transfrom方法中out流 System.out.println(new String(result)); // try { // Runtime.getRuntime().exec("cmd.exe"); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // transfrom(System.in,System.out); } public static void transfrom(InputStream in,OutputStream out){ try { int ch = 0; while((ch=in.read())!=-1){ int upperch = Character.toUpperCase(ch); out.write(upperch); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
===============================
RandomAccessFile........... 任意访问文件流
package ZHANG.IO; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; public class RandomFileTest { /** * @param args */ public static void main(String[] args) { Employee e1 = new Employee("baiyan",24); Employee e2 = new Employee("zhangsn",223); Employee e3 = new Employee("wangwu",23); try { RandomAccessFile raf = new RandomAccessFile("randomfile.txt","rw"); raf.writeChars(e1.name); raf.writeInt(e1.age); raf.writeChars(e2.name); raf.writeInt(e2.age); raf.writeChars(e3.name); raf.writeInt(e3.age); raf.close(); int len = 0; byte[] buf = new byte[Employee.LEN]; String strName = ""; RandomAccessFile raf2 = new RandomAccessFile("randomfile.txt","r"); raf2.skipBytes(Employee.LEN*2+4);//读取第2个员工数据 //len = raf2.read(buf); //strName = new String(buf,0,len); for(int i=0;i<Employee.LEN;i++){ strName += raf2.readChar(); } System.out.println(strName.trim()+ ":"+raf2.readInt()); raf2.seek(0); //len = raf2.read(buf); //strName = new String(buf,0,len); strName = ""; for(int i=0;i<Employee.LEN;i++){ strName += raf2.readChar(); } System.out.println(strName.trim()+ ":"+raf2.readInt()); raf2.skipBytes(Employee.LEN*2+4); //len = raf2.read(buf); //strName = new String(buf,0,len); strName = ""; for(int i=0;i<Employee.LEN;i++){ strName += raf2.readChar(); } System.out.println(strName.trim()+ ":"+raf2.readInt()); raf2.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } package ZHANG.IO; public class Employee { public String name = null; public int age =0; public static final int LEN = 8; public Employee(String name ,int age){ if(name.length()>8){ this.name = name.substring(0, LEN); }else{ while(name.length()< LEN){ name+="/u0000"; } } this.name = name; this.age = age; } }