ダークホースプログラマー---IO流(2)

24911 ワード

----
http://www.itheima.com java研修、android研修はあなたと交流することを期待しています。
引き続き勉強します。
四、Propties
1、概要
   Proptiesは、集合とIO技術を組み合わせた集合容器です。
   キー対型の設定ファイルに使用できます。
   データをロードするには、固定された書式、すなわちキー=値が必要です。
ProptiesはHashtableに継承されているので、ProptiesオブジェクトにPutとputAllの方法を適用することができます。しかし、これらの2つの方法は、トリガーがそのキーまたは値をStringのエントリに挿入することを許可するので、推奨されない。逆に、set Property方法を使うべきです。
2、取得する

import java.io.*;
import java.util.*;
class PropertiesDemo 
{
	public static void main(String[] args) 
	{
		//    
		Properties prop = new Properties();
		
		//    ,        
		prop.setProperty("wangwu","20");
		prop.setProperty("lisi","30");

		//         
		System.out.println(prop);
		
		//     
		String value = prop.getProperty("wangwu");
		System.out.println(value);
		
		//  map   set  ,   
		Set<String> names = prop.stringPropertyNames();

		for (String s : names )
		{
			//     s ,        
			System.out.println(s+"----"+prop.getProperty(s));
		}

		
	}
}
3、
アプリケーションの実行回数を記録するために使用回数が来たら、登録のヒント情報を与えます。実行回数をカウンタで記録しますが、プログラム終了後にメモリから消えます。ファイルに保存してください。
したがって、ソフトウェアの使用回数を記録するための設定ファイルが必要です。次のプログラムが起動する時は、そのカウンタの値を先にロードして、その後、再記憶します。Map+IO=Propties
import java.util.*;  
import java.io.*;	
  
class RunCount  
{  
    public static void main(String [] args)throws IOException  
    {  
        //    Properties  ,   io     
        Properties pop = new Properties();  
        //        ,        
        File file = new File("count.ini");  
        //         ,            
        if(!file.exists())  
            file.createNewFile();  
  
        //       ,          
        FileInputStream fis = new FileInputStream(file);  
        //               
        pop.load(fis);  
          
        //       
        int count = 0;  
        //             
        String value = pop.getProperty("time");  
        //      null,             
        if(value!=null)  
        {  
            count = Integer.parseInt(value);  
            //              
            if(count>=5)  
            {  
                System.out.println("    ,   ");  
                return ;  
            }  
        }  
        count++;  
        //                
        pop.setProperty("time",count+"");  
        FileOutputStream fos = new FileOutputStream(file);  
        pop.store(fos,"");  
        fos.close();  
        fis.close();  
    }  
}  
五、IOバッグの他の流れ
1、プリントフロー
プリントフローは、印刷方法を提供し、各種データタイプのデータをそのまま印刷することができる。
(1)バイト印刷ストリーム:PrintStream
コンストラクタで受信できるパラメータのタイプ:
ファイルオブジェクト  ファイル
文字列パスString
バイト出力ストリームOutputStream
(2)文字プリントフロー:PrintWriter、これはウェブ開発でよく使われています。
コンストラクタで受信できるパラメータのタイプ:
ファイルオブジェクト  ファイル
文字列パスString
バイト出力ストリームOutputStream
キャラクタ出力ストリームWriter
import java.io.*;   
class PrintDemo  
{  
    public static void main(String[] args) throws IOException  
    {  
        //    ,         
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  
        //     ,       
        //        
		//PrintWriter(Writer out, boolean autoFlush)     autoFlush   true
		//        ,
        PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);  
        String line = null;  
        while((line=bufr.readLine())!=null)  
        {  
            if("over".equals(line))  
                break;  
            out.println(line.toUpperCase());  
            //out.flush();  
        }  
        bufr.close();  
        out.close();  
    }  
}  
2、連結ストリーム
複数の入力ストリームを一つのストリームに統合する。
import java.io.*;
class SequenceInputStreamDemo 
{  
		public static void sequenceFile()throws IOException  
		{  
		    //     
			FileOutputStream fos = null;  
			SequenceInputStream sis = null;  
			try  
			{  
				//    ,        
				ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();  
				for(int i=1;i<=3;i++)  
				{  
					al.add(new FileInputStream(i+".part"));  
				}  
				//            final  
				final Iterator<FileInputStream> it = al.iterator();  
				//  Enumeration      
				Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()  
				{  
					public boolean hasMoreElements()  
					{  
						return it.hasNext();  
					}  
					public FileInputStream nextElement()  
					{  
						return it.next();  
					}  
				};  
				//     ,       。  
				sis = new SequenceInputStream(en);  
				//       ,FileOutputStream  
				fos = new FileOutputStream("7.bmp");  
				byte[] b = new byte[1024*1024];  
				int len = 0;  
				//  ,          
				while((len=sis.read(b))!=-1)  
				{  
					fos.write(b);  
				}  
		  
			}  
			catch (IOException e)  
			{  
				throw new RuntimeException("      ");  
			}  
			//       
			finally  
			{  
				try  
				{  
					if(fos!=null)  
						fos.close();  
				}  
				catch (IOException e)  
				{  
					throw new RuntimeException("         ");  
				}  
				try  
				{  
					if(sis!=null)  
						sis.close();  
				}  
				catch (IOException e)  
				{  
					throw new RuntimeException("         ");  
				}  
			}         
		}  
}
3、カットファイル

import java.io.*;
class SplitFile 
{
	//       
    public static void splitFile()throws IOException  
    {  
        //        
        FileInputStream fis = null;  
        FileOutputStream fos = null;  
        try  
        {  
            //         
            fis = new FileInputStream("0.bmp");  
            //      
            byte[] b = new byte[1024*1024];  
            int len = 0;  
            //     
            int count = 1;  
            //        
            while((len=fis.read(b))!=-1)  
            {  
                //          ,          
                fos = new FileOutputStream((count++)+".part");  
                fos.write(b,0,len);  
                fos.close();  
            }  
        }  
        catch (IOException e)  
        {  
                throw new RuntimeException("         ");  
        }  
        //       
        finally  
        {  
            try  
            {  
                if(fis!=null)  
                    fis.close();  
            }  
            catch (IOException e)  
            {  
                throw new RuntimeException("         ");  
            }  
        }  
          
    }  
}  

}
4、対象の順序化
オブジェクト中のデータ(情報、名前、年齢など)を指定されたファイル(ハードディスク)に格納し、オブジェクトの順序やオブジェクトの耐久化記憶と呼びます。記憶されたファイルは、オブジェクトを長く記憶することができる媒体であると言える。
注意したいのは、
静的は、方法領域に静的に保存されているので、順序付けされているのはメモリ中の情報データである。
tranientキーワードに修飾されたものは、プログレッシブ化されません(つまりファイルに保存されません)。
//  Person ,       
class Person implements Serializable{  
    //            
    public static final long serialVersionUID = 42L;  
    //        
    private String name;  
    private int age;  
   //    transient  , id      
    transient String id;  
   //     static  , "cn"      
    static String country = "cn";  
    //  Person   
    Person(String name,int age,String id,String country){  
        this.name = name;  
        this.age = age;  
        this.id = id;  
        this.country = country;  
    }  
    //  toString    
    public String toString(){  
        return name+ ":" + age + ":" + id + ":" + country;  
    }  
}  
//         
class ObjectStreamDemo{  
    public static void main(String[] args){  
        //       
        writeObj();  
        //       
        readObj();  
    }  
    //         
    public static void readObj(){  
        ObjectInputStream ois = null;  
        try{  
            //         
            ois = new ObjectInputStream(new FileInputStream("obj.txt"));  
            //        ,      
            Person p = (Person)ois.readObject();  
            System.out.println(p);  
        }catch (Exception e){  
            throw new RuntimeException("      ");  
        }  
        //         
        finally{  
            try{  
                if(ois!=null)  
                    ois.close();  
                }catch (IOException e){  
                throw new RuntimeException("       ");  
            }  
        }  
    }  
    //         
    public static void writeObj(){  
        ObjectOutputStream oos = null;  
        try{  
            //         
            oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));  
            //        
            oos.writeObject(new Person("lisi",25,"01","cn"));             
        }catch (Exception e){  
            throw new RuntimeException("      ");  
        }  
        //       
        finally{  
            try{  
                if(oos!=null)  
                    oos.close();  
                }catch (IOException e){  
                throw new RuntimeException("       ");  
            }  
        }  
    }  
} 
5、パイプの流れ
PipedOutput Stream
PipedInputStream
入出力は直接接続できます。スレッドと組み合わせて使用します。
import java.io.*;
class PipedStream 
{
	public static void main(String[] args)throws Exception 
	{
		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();

	}
}

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("       ".getBytes());
			out.close();
		}
		catch (IOException ioe)
		{
			throw new RuntimeException("  s     ");
		}
	}
}
6、Random Access File
Random Access File類はランダムにファイル類にアクセスします。彼はioシステムの中のサブクラスではありません。
Objectを直接継承するのです。
彼はIOバッグのメンバーです。データも読み書きもできます。
彼の内部は配列をカプセル化しました。
get FilePointer()がポインタ位置を取得します。
seek()がポインタの位置を変更します。
その完了読み書きの原理は、バイト入力ストリームと出力ストリームを内部にカプセル化したものである。
コンストラクタを通して、このクラスはファイルを操作するだけでなく、操作するファイルにもモードがあります。
RandomAccess File(String name,String mode)
          指定された名前を有するファイルストリームにランダムアクセスするために、ここから読み出して書き込む(オプション)を作成します。
r:  読み取り専用モード、つまりこのファイルに対する操作は既存のファイルのデータのみ読み取り可能です。
    ファイルは作成されません。このファイルが存在しないと異常が発生します。
rw:読み書きができます。つまり、このファイルに対する操作は、読み書きでもいいし、書き込みでもいいです。
    操作するファイルが存在しない場合は、現在のディレクトリの下で自動的に作成されます。
このファイルが存在すると、そのファイルの内容が上書きされます。
import java.io.*;
class RandomAccessFileDemo 
{
	public static void main(String[] args) throws IOException
	{
		writeFile();
		//writeFile_2();
		readFile();
		
	}
	public static void readFile()throws IOException
	{
		RandomAccessFile raf = new RandomAccessFile("random.txt","r");

		//       ,             u        8*0  8*1
		//raf.seek(8*1);

		//        ,  8   ,  8         
		//        ,     (  )
		raf.skipBytes(8);

		byte[] buf = new byte[4];

		/*
		raf.write("  ".getBytes());
		Exception in thread "main" java.io.IOException:     。
		             ,            
		*/
		

		raf.read(buf);

		//         
		String name = new String(buf);
		//    ,              
		int age = raf.readInt();

		System.out.println(name);
		System.out.println(age);

		raf.close();

	}
	public static void writeFile_2()throws IOException
	{
		RandomAccessFile raf = new RandomAccessFile("random.txt","rw");
		//               a     ,    
		raf.seek(8*0);
		raf.write("  ".getBytes());
		raf.writeInt(113);
		raf.close();
	}
	public static void writeFile()throws IOException
	{
		//           ,      ,      
		RandomAccessFile raf = new RandomAccessFile("random.txt","rw");
		/*
		raf.write(97);
		        :  a
		
		raf.write(258);     :  
		       
		//    :  100000010    8         
		System.out.println(Integer.toBinaryString(258));

		*/
		raf.write("  ".getBytes());	
		raf.writeInt(97);
		raf.write("  ".getBytes());
		raf.writeInt(99);
		raf.close();
	}
}
7、Data InputStream/Data OutputStreamは、基本データタイプを直接操作することができます。
書き込みの順番は、どの順番で読みますか?

import java.io.*;
class DataStream 
{
	public static void main(String[] args) throws IOException
	{
		//writeData();
		//readData();
		//writeUTF();
		readUTF();
	}

	public static void readUTF()throws IOException
	{
		//   readUTF    gbk           ,
		//                         
		DataInputStream dis = new DataInputStream(new FileInputStream("dataUTF.txt"));

		String s = dis.readUTF();
		System.out.println(s);
		dis.close();
	}
	public static void writeUTF() throws IOException
	{
		/*
		   4    
		*/
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("GBK.txt"),"GBK");
		osw.write("  ");
		osw.close();

		/*
		      6  
		
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("dataUTF.txt"),"UTF-8");
		osw.write("  ");
		osw.close();
		*/

		/*
		     8  
		
		DataOutputStream dos = 
			new DataOutputStream(new FileOutputStream("dataUTF.txt"));
		
		//       UTF      
		dos.writeUTF("  ");

		dos.close();
		*/
		

	}
	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"));
		
		//              ,        8   
		dos.writeInt(234);
		dos.writeBoolean(true);
		dos.writeDouble(3223.123);
		
		//         
		dos.close();

	}
}
8、ByteArayInputStream/ByteArayOutputStream
(1)下のリソースの呼び出しには関与しないので、ストリームを停止する必要はない。IOExceptionは一切発生しません。
(2)出力ストリーム中のバッファは、データの書き込みが続くと自動的に増加します。
(3)配列、つまり目的地は配列として動作します。
import java.io.*;  
class ArrayStreamDemo  
{  
    public static void main(String[] args)  
    {  
        //     
        ByteArrayInputStream bais = new ByteArrayInputStream("ABCDEFF".getBytes());  
        //      
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        int by = 0;  
        //         
        while((by=bais.read())!=-1)  
        {  
            baos.write(by);  
        }  
        System.out.println(baos.size());  
  
        System.out.println(baos.toString());  
          
        try  
        {  
            //  ,     ,           
            baos.writeTo(new FileOutputStream("a.txt"));  
        }  
        catch (IOException e)  
        {  
            throw new RuntimeException("      ");  
        }  
          
    }  
}  
9、変換ストリームの文字コード
着信可能符号表の有:
(1)変換ストリーム:Inup Stream ReaderとOutput Stream Writer
2)プリントフロー:PrintStreamとPrintWriterは、出力ストリームのみ
文字コード/復号
(1)符号化:文字列はバイト配列になります。
(2)復号:バイト配列が文字列になる
2、変換:
(1)デフォルトの文字セット:
      String  --->  byte[]   :srt.getBytes()
      byte[]   --->  String  :new String(byte[])
2)文字セットを指定します。
      String  --->  byte[]   :srt.getBytes(charsetName)
      byte[]   --->  String  :new String(byte[],charsetName)
文字コード--インターフェース
12、練習
必要:
学生が5人います。成績は3つです。
キーボードから学生データを入力して、
フォーマットは:zhangsan、78、98、96
学生の属性は名前と3つのコースの名前があります。
学生3科目の総成績を計算して、最後まで高い順に成績を並べます。
この情報をファイルに保存します。student Infor.txt
学生のオブジェクトを説明します。
学生情報ツールクラスを定義し、
分析:
1、学生類を定義して、属性はあります。name、3つの課程:match chinese english、総成績sum
   hashCode()とequals()を複写し、(おそらくデータをhashMapテーブルに格納する)
   学生に比較性を持たせ、Comprableインターフェースを実現し、compreTo()方法を複写し、カスタム比較方法を実現する。
   ToStering()メソッドを複写し、情報を得る:name,math chinese english
2、セットにデータ情報を格納するためのツールクラスを定義する  TreeSet(格納する情報は順序があります)
   情報をキーボード入力でstudent Infor.txtファイルに書き込む
import java.util.*;
import java.io.*;
class Student implements Comparable<Student>
{
	private String name;
	private int math;
	private int chinese;
	private int english;
	private int sum;
	Student(String name,int chinese,int english )
	{
		this.name = name;
		this.math = math;
		this.chinese = chinese;
		this.english = english;
		sum = math + chinese + english;
	}
	
	//  hashCode  ,       
	public int hashCode()
	{
		//             
		return name.hashCode()+sum*5;
	}
	//  equals  , 
	public boolean equals(Object obj)
	{
		//            Student  ,    ,    
		if (!(obj instanceof Student))
			throw new ClassCastException("     ");
		//   ,           Student  
		Student stu = (Student)obj;
		
		return this.name.equals(s.name) && this.sum == s.sum;
	}
	//  Comparable   compareTo  ,
	public int compareTo(Student s)
	{
		int num = new Integer(this.sum).compareTo(new Integer(s.sum));
		if (num ==0)
			return this.name.compareTo(s.name);
		return num;
		
	}
	//    ,        
	public String getName()
	{
		return name;
	}
	public int getSum()
	{
		return sum;
	}
	public String toString()
	{
		return name+ math+ chinese + english;
	}

}
class StudentInforTool
{
	public static Set<Student> getStudnets()
	{
		return getStudents(null);
	}
	//              
	public static Set<Student> getStudnets() 
	{
		//      
		BufferedReader bufr = null;

		Set<Student> stus = null;
		try  
        {  
            //          ,      
            bufr = new BufferedReader(new InputStreamReader(System.in));  
            String line = null;  
            //            
            if(cmp==null)  
                stus = new TreeSet<Student>();  
            else  
                stus = new TreeSet<Student>(cmp);  
            //             
            while((line=bufr.readLine())!=null)  
            {  
                if("over".equals(line))  
                    break;  
                //                 
                String[] info = line.split(",");  
                Student stu = new Student(info[0],Integer.parseInt(info[1]),  
                                                Integer.parseInt(info[2]),  
                                                Integer.parseInt(info[3]));  
                stus.add(stu);  
            }  
        }  
        catch (IOException e)  
        {  
            throw new RuntimeException("        ");  
        }  
        //       
        finally  
        {  
            try  
            {  
                if(bufr!=null)  
                    bufr.close();  
            }  
            catch (IOException e)  
            {  
                throw new RuntimeException("       ");  
            }  
            return stus;  
        }  
    }  
	  //           
    public static void write2File(Set<Student> stus,String fileName)  
    {  
        BufferedWriter bufw = null;  
        try  
        {  
            //         
            bufw = new BufferedWriter(new FileWriter(fileName));  
            //        
            for(Student stu : stus)  
            {  
                bufw.write(stu.toString() + "\t");  
                bufw.write(stu.getSum() + "");  
                bufw.newLine();  
                bufw.flush();  
            }  
        }  
        catch (IOException e)  
        {  
            throw new RuntimeException("       ");  
        }  
        //       
        finally  
        {  
            try  
            {  
                if(bufw!=null)  
                    bufw.close();  
            }  
            catch (IOException e)  
            {  
                throw new RuntimeException("       ");  
            }  
        }  
    }  
} 

class StudentInfoTest
{
	 public static void main(String[] args)   
    {  
        //     ,          
        Comparator<Student> cmp = Collections.reverseOrder();  
        //              
        Set<Student> stus = StudentInfoTool.getStudents(cmp);  
        //            
        StudentInfoTool.write2File(stus,"sudentinfo.txt");  
    } 
}
----
http://www.itheima.com java研修、android研修はあなたと交流することを期待しています。