黒馬プログラマー-java基礎-IO流(二)

12542 ワード

——-androidトレーニング、javaトレーニング、コミュニケーションを楽しみにしています!——-
印刷フローの概要:
バイトストリーム印刷ストリームPrintStream
文字ストリーム印刷ストリームPrintWriter
印刷フローの特徴:
A:データを書くだけで、データを読み込んでいません.宛先のみを操作でき、データ・ソースは操作できません.
B:任意のタイプのデータを操作できます.
C:自動リフレッシュが開始された場合、自動的にリフレッシュできます.
D:ファイルのフローを操作できます.
それらのストリームオブジェクトはテキストファイルを直接操作できますか?
FileInputStream
FileOutputStream
FileReader
FileWriter
printStream
printWriter
APIを見て、ストリームオブジェクトの構造方法を調べ、FileタイプとStringタイプのパラメータが同時にあれば、一般的にファイルを直接操作することができます.
ストリームオブジェクト:
基本フロー:ファイルを直接読み書きできる
高度なストリーム:基本ストリームに基づいて他の機能を提供します.
1.任意のタイプのデータを操作できます.
Print()
Pritln()
2.自動リフレッシュを開始するには:
printWriter   pw = new PrintWriter(new FileWriter(“a.txt:” ,true)
println()を呼び出す方法でもいいです.
この時は自動リフレッシュだけでなく、データの改行も実現しました.
Println()は次のように等価です.
 Write();
 newLine();
 flush();
 
印刷ストリームコピーテキストファイル;
  //      
      //      
      // BufferedReader br = new BufferedReader(newFileReader(
      // "DataStreamDemo.java"));
      // //      
      // BufferedWriter bw = new BufferedWriter(newFileWriter("Copy.java"));
      //
      // String line = null;
      // while ((line = br.readLine()) != null) {
      // bw.write(line);
      // bw.newLine();
      // bw.flush();
      // }
      //
      // bw.close();
      // br.close();
 
      //        
      //      
      BufferedReader br = new BufferedReader(new FileReader(
            "DataStreamDemo.java"));
      //      
      PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true);
     
      String line = null;
      while((line=br.readLine())!=null){
         pw.println(line);
      }
     
      pw.close();
      br.close();
   }

IOストリーム標準入出力ストリームの概要と出力文の本質:
Systemクラスの2つのメンバー変数:
Public static final InputStream in"標準"入力ストリーム;
Public static final PrintStream out「標準」出力ストリーム;
inputStream  is= System.in;
PrintStream ps= System.out;
System.in標準入力ストリームは、キーボードからデータを取得する
キーボード入力データ:
A:mainメソッドのargs受信パラメータ;
      B:Scanner()
        Scanner  sc = newScanner(System.in);
        String  s = sc.nextLine();
        Int  x= sc.nextInt();
C:文字バッファフロー包装標準入力フローにより実現;
 BuffereReader br = new BufferedReader(new InputStreamReader(system.in);
public static void main(String[] args) throwsIOException {
      // //       
      // InputStream is = System.in;
      // //            ?
      // // 。
      // //     ?
      // //    ,                     ?
      // //readLine()
      // //           ?
      // //BufferedReader
      // //  ,       BufferedReader   ,              
      // // BufferedReader br = new BufferedReader(is);
      // //       ,       ,      
      // //   :              ,        ,      ?
      // //  ,       ,           ?
      // //          ,            
      // InputStreamReader isr = newInputStreamReader(is);
      // BufferedReader br= new BufferedReader(isr);
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
      System.out.println("        :");
      String line = br.readLine();
      System.out.println("        :" + line);
 
      System.out.println("       :");
      // int i = Integer.parseInt(br.readLine());
      line = br.readLine();
      int i = Integer.parseInt(line);
      System.out.println("       :" + i);
   }

ランダムアクセスフロー:
RandomAccessFileクラスはストリームに属さず、Objectクラスのサブクラスである.
しかし、InputStreamとOutputStreamの機能が融合しています.
ランダムアクセスファイルの読み取りと書き込みをサポートします.
 
 PublicRandAccessFile(String name,String mode)
最初のパラメータはファイルパスです.
2番目のパラメータは、ファイルを操作するモードです.
private static void read() throws IOException {
      //          
      RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
 
      int i = raf.readInt();
      System.out.println(i);
      //           getFilePointer    ,    seek     。
      System.out.println("          :" + raf.getFilePointer());
 
      char ch = raf.readChar();
      System.out.println(ch);
      System.out.println("          :" + raf.getFilePointer());
 
      String s = raf.readUTF();
      System.out.println(s);
      System.out.println("          :" + raf.getFilePointer());
 
      //         ,     a,    ?
      raf.seek(4);
      ch = raf.readChar();
      System.out.println(ch);
   }
 
   private static void write() throws IOException {
      //          
      RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
 
      //     ?
      raf.writeInt(100);
      raf.writeChar('a');
      raf.writeUTF("  ");
 
      raf.close();
   }
}

連結フロー:
SequencelnputStreamの概要:
SequenceInputStreamクラスは、複数の入力ストリームを1つの入力ストリームに連結することができ、したがって、このストリームは連結ストリームとも呼ばれる.
SequenceInputStreamの構築方法:
SenquenceInputStream(InputStream  s1 , InputStream  s2)
SequenceInputStream(Enumeration ExtendsInputStream>e)
1.txt + b.txt = c.txt;
 InputStream s1 = new FileInputStream("a.txt");
   InputStream s2 = new FileInputStream("b.txt");
   SequenceInputStream sins = new  SequenceInputStream(s1,s2);
   BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("c.txt"));
   //    
   byte[]  buy = new byte[1024];
   int len = 0;
   while((len = sins.read(buy))!= -1 ){
       bos.write(buy,0 ,len);
   }
   bos.close();
   sins.close();  
}

マージフローは、複数のファイルの内容を1つのファイルにコピーします.
SequenceInputStream (Enumeration  e)
簡単なレビューから,EnumerationはVectorの1つの方法の戻り値タイプであることが分かった.
Enumeration  elements()
Vector  v = new Vector();
  InputStream s1 = new FileInputStream("a.txt");
  InputStream s2 = new FileInputStream("b.txt");
  InputStream s3 = new FileInputStream("c.txt");
  v.add(s1);
  v.add(s2);
  v.add(s3);
  Enumeration          en =v.elements();
   SequenceInputStream sins = new SequenceInputStream(en);
   BufferedOutputStream bos= new BufferedOutputStream(new FileOutputStream("c.txt"));
   //     ;
   byte[]  bys = new byte[1024];
   int len = 0;
   while((len= sins.read(bys)) != -1){
      bos.write(bys,0 ,len);
   }
 
   bos.close();
   sins.close();     
   }

シーケンス化フロー:
シーケンス化ストリーム:オブジェクトをストリームのようにテキストファイルに格納したり、ネットワークで転送したりします.オブジェクト-ストリームデータ(ObjectOutputStream)
逆シーケンス化ストリーム:テキストファイル内のストリームオブジェクトデータまたはネットワーク内のストリームオブジェクトデータをオブジェクトに復元します.ストリームデータ--(ObjectInputStream)
 
Public final void writeObject(Object  obj);
 
NotSerializableExceptionにはシリアル化インタフェースがありません.
 
クラスはjavaを実現する.io.Serializableインタフェースは、そのシーケンス化機能を開始するために使用され、このインタフェースを実装していないクラスは、そのステータスをシーケンス化または逆シーケンス化することはできません.
このインタフェースには何の方法もありません.このような方法のないインタフェースはタグインタフェースと呼ばれています.
 
public static void main(String[] args) throws IOException,ClassNotFoundException {
   //             ,          
   //                  ;
write();
read();
   }
   private static void read() throws IOException, ClassNotFoundException {
      // TODOAuto-generated method stub
   //        
ObjectInputStreamois = new ObjectInputStream(new FileInputStream("oos.txt"));
   //    ;
   Object obj=ois.readObject();
   //    
   ois.close();
   System.out.println(obj);
     
     
   }
   private static void write() throws IOException {
      // TODOAuto-generated method stub
   ObjectOutput oos =  new  ObjectOutputStream(new FileOutputStream("oos.txt"));
  
   //    
   person p = new person("dephi",25);
   oos.writeObject(p);
   //    ;
   oos.close();
  
  
   }
 
 
     :
NotSerializableException:      
 *
 *       java.io.Serializable            。                         。
 *            ,                   。
 *
 * java.io.InvalidClassException:
 * cn.itcast_07.Person; local classincompatible:
 * stream classdesc serialVersionUID =-2071565876962058344,
 * local class serialVersionUID = -8345153069362641443
 *
 *         ?
 *    Person         ,              。
 *            100。
 *         :
 *    Person.class-- id=100
 *    wirte  : oos.txt -- id=100
 *    read  : oos.txt -- id=100
 *
 *      :
 *    Person.class-- id=200
 *    wirte  : oos.txt -- id=100
 *    read  : oos.txt -- id=100
 *         ,              ,      。    ?
 *             id    。
 *     java        ,class   id       。
 *         ,  class    id     。  ,     。
 *    ,      ,   id  java          ,  ,        ,  id        ?
 *   。               id       ?
 *     ,     ,    ,      。
 *              ?
 *
 *        :
 *                  ,           ,            id 。
 *             ,          ,              。
 *
 *   :
 *                   ,          。       ?
 *      transient                
 */
public class Person implements Serializable {
   private static final long serialVersionUID = -2071565876962058344L;
 
   private String name;
 
   // private int age;
 
   private transient int age;
 
   // int age;
 
   public Person() {
      super();
   }
 
   public Person(String name, int age) {
      super();
      this.name = name;
      this.age = age;
   }
 
   public String getName() {
      return name;
   }
 
   public void setName(String name) {
      this.name = name;
   }
 
   public int getAge() {
      return age;
   }
 
   public void setAge(int age) {
      this.age = age;
   }
 
   @Override
   public String toString() {
      return "Person [name=" + name + ",age=" + age + "]";
   }
}

Propertiesコレクション
Propertiesの概要:
Properties属性集合クラスは、IOストリームと組み合わせて使用できる集合クラスです.
Propertiesは、ストリームに保存するか、ストリームからロードすることができます.プロパティリストの各キーとその対応する値は文字列です.
Hashtableサブクラスで、Map集合であることを示します.
Propertiesprop = new Properties();
   //    ;
  
   prop.put("001" , "hello"); 
   prop.put("002", "world");  
    prop.put("003", "java");
    //    
    Set set = prop.keySet();
    for(Object key : set){
       Objectvalue = prop.get(key);
       System.out.println(key + "----"+ value);
    }   
   }
}

Propertiesの特殊な機能の使用:
特殊な機能:
publicObject setProperty(String key,String value):要素の追加
publicString getProperty(String key):要素の取得
publicSet stringPropertyName():すべてのキーのセットを取得する
 
   
   //       
      Properties prop = new Properties();
 
      //     
      prop.setProperty("  ", "30");
      prop.setProperty("  ", "40");
      prop.setProperty("  ", "50");
 
      // public Set stringPropertyNames():         
      Set set =prop.stringPropertyNames();
      for (String key : set) {
         String value = prop.getProperty(key);
         System.out.println(key + "---" + value);
      }
   }
 

PropertiesとIOストリームの組み合わせ:
ここの集合はProperties集合でなければなりません.
Public void load(Reader reader):ファイル内のデータをコレクションに読み込む
Public void  store(Writer writer,  String comments) ;コレクションのデータをファイルに格納する
 
  
 private static void myStore() throws IOException {
      //      
   Properties prop = new Properties();
   prop.setProperty("  ", "23");
   prop.setProperty("   ", "20");
   prop.setProperty("   ", "22");
  
   Writer w = new FileWriter("me.txt");
   prop.store(w, "hellworld");
   w.close();  
   }
 private static void myload() throws IOException {
      // TODOAuto-generated method stub
      Properties prop = new Properties();
      Reader r = new FileReader("oos.txt");
      prop.load(r);
      r.close();
      System.out.println("prop"+ prop);
        
   }

ケース:ファイルに指定されたキーがあるかどうかを判断し、ある場合は値列を変更します.
 Properties prop = new Properties();
   Reader r = new FileReader("me.txt");
 
   prop.load(r);
   r.close();
   //    
//Setset = prop.stringPropertyNames();        
     Set  st= prop.keySet();
     for(Object obj : st){
        String s = (String) obj;
        if("   ".equals(s)){
           prop.setProperty(s, "2525");
           break;
        }
     } 
     //               
     Writer w= new FileWriter("me.txt");
     prop.store(w, "  ");  
     w.close();
}