ブラックホースプログラマ-PrintWriter-シーケンスストリーム-分割ファイル-マージファイル


PrintWrite(プリントフロー)
PrintWrite()とPrintStream()
ストリームとファイルは直接操作できます。
印刷フロー:
このストリームは、印刷方法を提供し、各種データタイプのデータをそのまま印刷することができる。
バイトのプリントフロー: 
PrintStream
コンストラクタが受信できるパラメータタイプ。
  1.fileオブジェクトFile
  2.文字列パスString
  3.バイト出力ストリームOutputStream
文字の印刷フロー 
PrintWriter 
  1.fileオブジェクトFile
  2.文字列パスString
  3.バイト出力ストリームOutputStream
  3.文字出力ストリームWrite
練習コード:
import java.io.*;
	/*
	 *    :
	 *          ,                 。
	 * 
	 *      :
	 * PrintStream
	 *              。
	 * 1.file   File
	 * 2.      String
	 * 3.      OutputStream
	 * 
	 *      
	 * PrintWriter
	 * 1.file   File
	 * 2.      String
	 * 3.      OutputStream
	 * 3.      Write
	 */
public class PrintStreamDemo {

	public static void main(String[] args) {
	
		method_2();
		
	}
	//PrintWriter,      
	public static void method_1(){
		BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter pw = new PrintWriter(System.out,true);
		String line = null;
		try {
			while((line = buf.readLine()) != null){
				if(line.equals("over"))
					break;
				pw.println(line.toUpperCase());
				//pw.flush();
			}
		} catch (IOException e) {
			throw new RuntimeException("      ");
		}
	}
	//PrintWrite        
	public static void method_2(){
		File file = new File("text.txt");
		BufferedReader  buf = new BufferedReader(new InputStreamReader(System.in));
		try {
			if(!file.exists())
				file.createNewFile();
			//      PrintWriter    
			PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)), true);
			String line = null;
			while((line = buf.readLine()) != null){
				if(line.equals("over"))
					break;
				pw.println(line.toUpperCase());
				//pw.flush();
			}
			pw.close();
		} catch (FileNotFoundException e) {
			throw new RuntimeException("     ");
		}
		catch( IOException ex){
			throw  new RuntimeException("      ");
		}finally{
			try {
				buf.close();
			} catch (IOException e) {
				throw new RuntimeException("     ");
			}
		}
	}
}
シーケンスストリーム(マージファイル)
場合によっては、複数の入力ストリームからプログラムにデータを読み込む必要があります。このとき、複数の入力ストリームを一つのSequenceInputStreamストリームに統合する統合ストリームを使用することができる。
SequenceInputStreamは、これに接続されたストリームのセットを入力ストリームに結合して最初の入力ストリームから読み取りを開始し、ファイルの末尾に到達するまで、続いて第2の入力ストリームから読み取り、含まれる最後の入力ストリームのファイル末尾まで順次類推する。結合ストリームの役割は、複数のソースを一つのソースに統合することである。
public SequenceInputStream(Enumeration extens InputStream)
新規作成したSequenceInputStreamをパラメータを記憶することにより初期化します。このパラメータは、実行時タイプがInputStreamオブジェクトのEumeration型パラメータである必要があります。このエニュメレーションによって生成された入力ストリームは、SequenceInputStreamから読み出されたバイトを提供するために順次読み出される。エニュメレート・ストリームの各々が使用された後、ストリームのclose方法を呼び出すことによって、それらは閉じられる。
public interface Eumeration
Enumerationインターフェースを実現するオブジェクトは、一連の要素を生成し、一回に一つを生成します。nextElementを連続して呼び出す方法は一連の連続要素を返します。
練習コード:
import java.io.*;
public class SequenceDemo {
	
	public static void main(String[] args) {
		Vector v = new Vector();
		try {
			v.add(new FileInputStream("1.txt"));
			v.add(new FileInputStream("2.txt"));
			v.add(new FileInputStream("3.txt"));
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}
		
		Enumeration e = v.elements();
		SequenceInputStream sis = new SequenceInputStream(e);
		FileOutputStream fouts = null;
		try {
			fouts = new FileOutputStream("SequenceTest.txt");
			byte[] value = new byte[1024];
			int len = 0;
			while((len = sis.read(value)) != -1){
				fouts.write(value,0,len);
			}
		} catch (FileNotFoundException e1) {
			throw new RuntimeException("       ");
		}catch(IOException e2){
			throw new RuntimeException("       ");
		}finally{
			try {
				sis.close();
			} catch (IOException e2) {
				throw new RuntimeException("       ");
			}
			if(fouts != null){
				try {
					fouts.close();
				} catch (IOException e1) {
					throw new RuntimeException("         ");
				}
			}
		}
	}
}
カットファイル
カットしたファイルの拡張子の名前は.part(デフラグファイル)です。
1つの方法の匿名クラスまたは局所内部クラスが方法領域の変数にアクセスする必要がある場合、この変数パラメータはfinaとして定義されなければならない。
根本的な原因を突き詰めると、作用域における変数のライフサイクルが原因です。 
まず、内部クラスと外部クラスは同じレベルです。内部クラスは定義のために方法の実行が完了すると、フォローアップが破壊されることはありません。問題は来て、外部の種類の方法の中の変数がfinalを定義しないならば、外部の種類の方法の実行が終わる時、この局部の変数は間違いなくGCになります。しかし内部の種類のある方法はまだ実行し終わっていないで、この時彼の引用した外部の変数はすでに探し出せませんでした。finalと定義されている場合、javaはこの変数をコピーして、メンバー変数として内部クラスに内蔵します。そうすると、finalによって修正された値はいつまでも変わらないので、この変数が指すメモリ領域は変わりません。
練習コード:
import java.io.*;

public class SplitFile {

	public static void main(String[] args) {
		split();
		merger();
	}
	//    
	public static void merger(){
		ArrayList al = new ArrayList();
			try {
				for(int i = 1; i <= 7; i++){
				al.add(new FileInputStream("test"+ i +".part"));
			}
			} catch (FileNotFoundException e) {
				throw new RuntimeException("        ");
			}
			final Iterator is = al.iterator();
			Enumeration en = new Enumeration() {

				@Override
				public boolean hasMoreElements() {
					return is.hasNext();
				}

				@Override
				public FileInputStream nextElement() {
					return is.next();
				}
				
			};
			SequenceInputStream sis = new SequenceInputStream(en);
			FileOutputStream fos = null;
			try {
				fos = new FileOutputStream("Target.bmp");
				byte[] value = new byte[1024*1024];
				int len = 0;
				while((len = sis.read(value)) != -1){
					fos.write(value,0,len);
				}
			} catch (FileNotFoundException e) {
				throw new RuntimeException("       ");
			} catch(IOException e1){
				throw new RuntimeException("      ");
			}finally{
				try {
					sis.close();
				} catch (IOException e1) {
					throw new RuntimeException("       ");
				}
				if(fos != null){
					try {
						fos.close();
					} catch (IOException e) {
						throw new RuntimeException("         ");
					}
				}
			}
	}
	//    
	public static void split(){
		FileInputStream fins = null;
		FileOutputStream fouts = null;
		try {
			fins = new FileInputStream("test.bmp");
			byte[] value = new byte[1024*1024];
			int count = 1;
			int len = 0;
			while((len = fins.read(value)) != -1){
				fouts = new FileOutputStream("test" + count++ +".part");
				fouts.write(value,0,len);
				fouts.close();
			}
		} catch (Exception e) {
			throw new RuntimeException("       ");
		}finally{
			if(fins != null){
				try {
					fins.close();
				} catch (IOException e) {
					throw new RuntimeException("         ");
				}
			}
		}
	}
}