cfeers 发表于 2013-1-15 08:21:13

java的基本语法(五)

自己摘录的,难免有错,请见谅!
            【第八章  流】
1.Java 流式输入/输出原理:
在Java程序中,对于数据的输入/输出操作以"流"(stream)方式进行;
J2SDK提供了各种各样的"流"类,用以获取不同种类的数据;程序中
通过标准的方法输入或输出数据。
输入/输出流的分类:

java.io 包中定义了多个流类型(类或抽象类)来实现输入/输出功能;
可以从不同的角度对其进行分类:
   按数据流的*方向*不同可以分为【输入流】和【输出流】
   按处理数据*单位*不同可以分为【字节流】和【字符流】
   按照*功能*不同可以分为【节点流】和【处理流】

J2 SDK 所提供的所有流类型位于包Java.io内都分别继承自以下四种抽象流类型.
*******************************************
                  字节流          字符流  *
输入流           InputStream      Reader  *
输出流           Output           Writer  *
*******************************************
 
【节点流和处理流】
[节点流]为可以从一个特定的数据源(节点)读写数据(如:文件,内存)
[处理流]是"连接"在已存在的流(节点流或处理流)之上,通过对数据的
        处理为程序提供更为强大的读写功能。

InputStream:继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)
OutputStream:继承自OutputStream的流是用于程序中输出数据,且数据的单位为字节(8 bit)
Reader:继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16 bit)
Writer:继承自Reader的流都是用于向程序中输出数据,且数据的单位为字符(16 bit)
***************************************************************************************************
                                     【节点流的类型:】这根管道直接读到数据源
***************************************************************************************************
类型                     字符流(中文也可以读取)                        字节流
                
File(文件)       FileReader       FileWriter          FileInputStream       FileOutputStream
Memory Array     CharArrayReader  CharArrayWriter     ByteArrayInputStream  ByteArrayOutputStream
Memory String    StringReader     StringWriter                      
Pipe(管道)       PipedReader       PopedWriter        PipedInputStream       PipedOutputStream
例如:
----------------------------------------读取字符流文件-----------------------------------------
import java.io.*;
public class TestFileReader{
 public static void main(String[] args){
  FileReader fr = null;
  int c = 0;
  try{
   fr = new FileReader("D:/lianxi/io/TestFileInputStream.java");
   int ln = 0;
   while ((c=fr.read())!=-1){
    System.out.print((char)c); 
   } 
   fr.close();
  }catch(FileNotFoundException e){
   System.out.println("找不到指定文件"); 
  }catch(IOException e){
   System.out.println("文件读取错误"); 
  }
 } 
}
---------------------------------------复制字节流文件-------------------------------------------------
import java.io.*;
public class TestFileOutputStream{
 public static void main(String[] args){
  int b = 0;
  FileInputStream in = null;
  FileOutputStream out = null;
  try{
   in = new FileInputStream("D:\\lianxi\\Collection\\BasicGeneric.java");
   out = new FileOutputStream("D:\\lianxi\\io\\BG.java");
   while((b=in.read())!= -1){
    out.write(b); 
   }
   in.close();
   out.close();
   }catch (FileNotFoundException e2){
    System.out.println("找不到指定文件");System.exit(-1); 
   }catch (IOException e1){
    System.out.println("文件复制错误");System.exit(-1); 
   }
    System.out.println("文件已复制");
 } 
}
--------------------------------------------读取字节流--------------------------------------------
import java.io.*;
public class TestFileInputStream{
 public static void main(String[] args){
  int b = 0;
  FileInputStream in = null;
  try{
    in = new FileInputStream("D:/lianxi/io/TestFileInputStream.java"); 
  }catch(FileNotFoundException e){
    System.out.println("找不到指定文件");
    System.exit(-1); 
  }
  
  try{
   long num = 0;
   while((b=in.read())!=-1){
     System.out.print((char)b);
     num++; 
   } 
   in.close();
   System.out.println();
   System.out.println("共读取了"+num+"个字节");
  }catch(IOException e1){
   System.out.println("文件读取错误");
   System.exit(-1); 
  }
 } 
}
***************************************************************************************************
                                     【处理流的类型:】这根管道包了另外一个管道
***************************************************************************************************
缓冲流:缓冲流要"套接"在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新方法。

import java.io.*;
public class TestBuffered{
 public static void main(String[] args){
  try{
   BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\lianxi\\io\\dat2.txt"));
   BufferedReader br = new BufferedReader(new FileReader("d:\\lianxi\\io\\dat2.txt"));
   String s = null;
   for(int i=1;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();
  } catch(IOException e){
    e.printStackTrace(); 
  }
 } 
}
---------------------------------------------------------------------------------------------------
***************************************************************************************************
                                     【转换流的类型:】
***************************************************************************************************
InputStreamReader和OutputStreamWriter 用与字节数据到字符数据之间的转换。
InputStreamReader 需要和 InputStream  "套接"。
OutputStreamWriter需要和 OutputStream "套接"。
---------------------------------------------------------------------------------------------------
import java.io.*;
public class TestTransForm1{
 public static void main(String[] args){
   try{
     OutputStreamWriter osw = new OutputStreamWriter(
      new FileOutputStream("d:\\lianxi\\io\\char.txt"));
      osw.write("Mirosofttibnmsunappe8");
      System.out.println(osw.getEncoding());
      osw.close();
      osw = new OutputStreamWriter(new FileOutputStream("d:\\lianxi\\io\\char.txt",true),"ISO8859_1");
      osw.write("Mirosofttibnmsunappe0");
      System.out.println(osw.getEncoding());
      osw.close();
   }catch(IOException e){
     e.printStackTrace();
    }
 } 
}
---------------------------------------------------------------------------------------------------
import java.io.*;
public class TestTransForm2{
  public static void main(String[] args){
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader br = new BufferedReader(isr);
      String s = null;
      try{
         s = br.readLine(); 
         while(s!=null){
          if(s.equalsIgnoreCase("exit")) break; 
          System.out.println(s.toUpperCase());
          System.out.println(s.toLowerCase());
          s = br.readLine();
         }
         br.close();
      }catch(IOException e){
        e.printStackTrace(); 
      }
  } 
}
***************************************************************************************************
                                     【数据流的类型:】
***************************************************************************************************
数据流:DataInputStream 和 DataOutputStream 分别继承自InputStream和OutputStream
它属于处理流,需要分别"套接"在InputStream和OutputStream类型的节点流上
---------------------------------------------------------------------------------------------------
import java.io.*;
public class TestDataOutputStream{
 public static void main(String[] args){
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   DataOutputStream dos = new DataOutputStream(baos);
   try{
     dos.writeDouble(Math.random());
     dos.writeBoolean(true);
     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
     System.out.println(bais.available());
     DataInputStream dis = new DataInputStream(bais);
     System.out.println(dis.readDouble());
     System.out.println(dis.readBoolean());
     dos.close(); dis.close();
   }catch(IOException e){
    e.printStackTrace(); 
   }
  
  
 } 
}
***************************************************************************************************
                                     【打印Print流的类型:】
***************************************************************************************************
Print 流:PrintWriter 和 PrintStream 都属于输出流,分别针对于字符和字节。提供了重载的print!
Print 流不会抛异常!
---------------------------------------------------------------------------------------------------
import java.io.*;
public class TestPrint{
 public static void main(String[] args){
   PrintStream ps = null;
   try{
     FileOutputStream fos = new FileOutputStream("D:\\lianxi\\io\\log.dat");
     ps = new PrintStream(fos);
    }catch(IOException e){
      e.printStackTrace();
    }
   if(ps != null){
     System.setOut(ps); 
   }
   int ln = 0;
   for(char c = 0; c <= 60000; c++){
     System.out.print(c+"  ");
     if(ln++>=100){
       System.out.println();
       ln = 0; 
     } 
   }  
 } 
}
import java.io.*;
import java.util.*;
public class TestPrintStream{
 public static void main(String[] args){
    String s = null;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    try{
     FileWriter fw = new FileWriter("D:\\lianxi\\io\\logfile.log",true);
     PrintWriter log = new PrintWriter(fw);
     while((s = br.readLine())!= null){
      if(s.equalsIgnoreCase("exit")) break;
      System.out.println(s.toUpperCase());
      log.println("---------");
      log.println(s.toUpperCase());
      log.flush();       
     }
     log.println("==="+ new Date()+"===");
     log.flush();
     log.close();
    }catch(IOException e){
      e.printStackTrace(); 
    }     
 } 
}
***************************************************************************************************
                                     【Object流的类型:】
***************************************************************************************************
Object流:直接将Object写入或读出。
 
transient 关键字    修饰成员变量,在修饰序列化时不予考虑,打印0
 
Serializable 接口   如果想把某个类的对象序列化,必须实现Serializable 接口
Externalizable 接口
public interface Externalizableextends Serializable

void readExternal(ObjectInput in)
          
void writeExternal(ObjectOutput out)
 
自己控制序列化过程
---------------------------------------------------------------------------------------------------
 
 
页: [1]
查看完整版本: java的基本语法(五)