JAva基礎知識10-javaIO


1:javaIOの分類
JAva IOはバイトと文字の面からバイトIO、文字IO、バイトIOに分けられ、間違いなく読み書きの単位はバイト向け、文字IOは読み書きの単位は文字向け、javaはunicode符号化、各文字は2バイト採用されている.
JAvaIO階層継承図
Object
InputStream
OutputStream
Reader
Writer
File
このうちInputStream,OutputStreamはバイト向けであり,継承するクラスもバイト向けであり,Reader,Writerは文字向けであり,継承するクラスも文字向けである.各バイト向け関数は、文字向けに類似の相関関数に対応しています.
2:InputStreamについて 
java.io.InputStream (implements java.io.Closeable)
java.io.ByteArrayInputStream
java.io.FileInputStream
java.io.FilterInputStream
java.io.BufferedInputStream
java.io.DataInputStream (implements java.io.DataInput)
java.io.LineNumberInputStream
java.io.PushbackInputStream
java.io.ObjectInputStream (implements java.io.ObjectInput, java.io.ObjectStreamConstants)
java.io.PipedInputStream
java.io.SequenceInputStream
java.io.StringBufferInputStream
InputStreamはバイト向けの入力ストリームのベースクラスであり、いくつかの基本的な関数とサブクラスの完全なインタフェースを提供しています.
int available():ストリームの現在の状態から最後までの推定バイト数を返します.ファイルの先頭から推定すると、返されるバイト数はファイル全体のバイト数です.
ファイルの末尾から返すと、推定バイト数は0になります.
void close():ストリームを閉じる
void mark(int Readlimit):入力フローの現在位置をマーク
void reset():ファイルの場所を最後のmarkに再配置し、markとペアで使用しますが、ファイルストリームがmarkSurpport()であることを要求してtrueを返します.
void markSurpport():ファイルフローがmark,resetをサポートしているかどうかを判断する
abstract int read():次のバイトを読み出し、正常であれば0-255内の数(そのバイトの整数値)を返し、終了であれば-1を返す.
int read(byte[]b):読み出しバイトは配列にあり、読み出しの長さは配列bの長さとできるだけ等しくする.読み込んだバイト数を返します.
int read(byte[]b,int off,int len):offはオフセット量であり、lengthは読み取りの長さである.
long skip(long n):nバイトをスキップし、前にジャンプするしかありません.
3:対流操作は、一般的にファイル、オブジェクト、コンソールを含む
(1)FileInputStream 《-- InputsStream
InputStreamクラスからのメソッドを継承する以外に、FileInputStream自体はいくつかのメソッドを追加していません.
public FileChannel getChannel():この入力ストリームに関連する一意の入力ストリームのFileChannelオブジェクトを返します.
protected void finalize()throws IOException:ファイルフローがcloseになっていることを確認
public final FileDescriptor getFD()throws IOException:FileDescriptor Object(ファイルシステム内の実際のファイルに接続されていることを表す)を返します.
(2)ByteArrayInputStream 《-- InputStream
 ベースクラスInputStreamからの関数に加えて、ByteArrayInputStreamの関数は基本的にこれらであり、いくつかのフィールドを追加したにすぎません.
byte[]buf:関数構造のbyte配列を構築する
int count:bufで最大使用可能なバイト数
int mark:ストリームに現在保存されているタグの位置
int pos:ストリームバッファ内の次の読み出し対象バイトの位置
(3)FilterInputStream《--InputStream
それはInputStreamのすべての関数を再ロードして、自身は何の役にも立たないで、主にそのいくつかの継承のサブクラスで、それは1つのフィールドInputStream inがあって、このフィールドを通じてデータソースをロードします.
(4)ObjectInputStream《--InputStream,
このクラスでは、オブジェクト、int、float、double、byte、charなど様々なオブジェクトの読み取りを実現します.オブジェクトを読み書きする場合は、そのオブジェクトがSerializationのインタフェースを実現する必要があります.
(5)SequenceInputStream《- InputStream
複数の入力ストリームの論理接続をSequenceInputStreamで実現します.SequenceInputStreamには2つのコンストラクション関数があります.
SequenceInputStream(InputStream s1,InputStream s2)
SequenceInputStream(Enumeration e);
(6)PipedInputStream《--InputStream
パイプライン通信、PipedOutputStreamとの接続、およびPipedOutputStreamに書き込まれるデータを提供します.
void  接続(PipedOutputStreamsrc)、入出力パイプ間の接続を確立します.
(7)StringBufferInputStream《--InputStream
関数インタフェースは基本的にInputStreamと同じですが、操作の対象はStringであり、Fileではありません.
4:javaIOのリンク順について
一般的には物理ファイルをFileInputStreamやFileReaderなどで開く.
BufferedInputStreamまたはBufferedReaderを介してファイルをバッファに読み込む
DataInputStreamでint,charなど各種基本データを読み込む
ファイルについての書き込み操作はこの順序とは正反対です.
5:FilterInputStreamの重要なサブクラス
(1)BufferedInputStream
内部にはByte Arrayのようなバッファがあり、バッファがある以上count,mark,posなどのフィールドがあります.残りの関数インタフェースはInputStreamとあまり差がありません.
(2)DataInputStream
このクラスはInputStreamと同じインタフェースのほか,基本データ型の読み書きに特化した様々な関数,readInt,readDoubleなどを提供している.
(3)LineNumberInputStream
このクラスのインタフェースはInputStreamとほぼ似ているが,行番号の処理を増やしただけで,2つの関数が増えた.
int GetLineNumber():現在の行番号を取得する
void SetLineNumber():現在の行番号を設定する
(4)PushBackInputStream
このクラスは、InputStreamよりも、ストリームの現在の位置を1バイト以上後退させる関数であることは間違いありません.
void unRead(byte[]b):読み出したバイト配列を返すと、ストリームの位置が先頭に近づく
void unRead(byte[]b,int off,int len):配列bのoffから始まるlen長のバイトをストリームに返す(コピーする)ことで、ストリームは以前とよく似ています.
6:OutputStreamの重要なサブクラス
原則としてinとoutは相対的であり,inのあるoutは相対的であるが,まだいくつかの違いがある.
void write(int b):パラメータbの下位8ビットで指定されたバイトを出力ストリームに書き込むと、bの上位24ビットは無視されます
void write(byte[]b):配列bを出力ストリームに書き込む
void write(byte[]b,int off,int len):配列bの指定バイトを出力ストリームに書き込む
void flush():オペレーティングシステムのスケジュールを待つ必要がなく、ファイルバッファに直ちに書き込むように強制します.
void close():出力ストリームを閉じる
java.io.OutputStream (implements java.io.Closeable, java.io.Flushable)
java.io.ByteArrayOutputStream
java.io.FileOutputStream
java.io.FilterOutputStream
java.io.BufferedOutputStream
java.io.DataOutputStream (implements java.io.DataOutput)
java.io.PrintStream (implements java.lang.Appendable, java.io.Closeable)
java.io.ObjectOutputStream (implements java.io.ObjectOutput, java.io.ObjectStreamConstants)
java.io.PipedOutputStream
7:FilterOutputStreamのPrintStream
文字列をファイル、コンソールなどに印刷するなど、指定したさまざまなベース・タイプの印刷クラスです.次のようになります.
pStr = new PrintStream("c.txt");
pStr.println("what a fine day");
8:javaコンソール変数付与
最初は次のようなプログラムを使いました.
try{
int x1,y1,z1;
BufferedInputStream buf = new BufferedInputStream(System.in);
DataInputStream data = new DataInputStream(buf);
System.out.println("This is in the dataInputStream");
x1 = data.readInt();
y1 = data.readInt();
z1 = data.readInt();
System.out.println("x,y,z is:" + x1 +" " + y1 + " " + z1);
}catch(Exception e)
{}

コンソール入力:12 34 45 
x,y,z is:825368627 874525749 218771725
明らかにこれは自分が望んでいた結果ではありませんが、その後、プログラムを修正しました.
try
		{
			byte[] bts = GetNumber(825368627);
			for(byte c:bts)
			{
				System.out.println((char)c);
			}
		}catch(Exception e)
		{}
	static byte[] GetNumber(int b)
	{
		byte[] bt = new byte[4];
		bt[0] = (byte)(b>>24);
		bt[1] = (byte)(b>>16);
		bt[2] = (byte)(b>>8);
		bt[3] = (byte)b;
		return bt;
	}

出力結果:1 2 3,
javaのコンソールで入力した数字は文字であることを説明することができます.私たちは12""3という文字を入力します.最後に得られた数字825368627は、文字1,2、スペース、3を文字に対応する数字に順次変換し、32ビットのうち上位8ビット、下位8ビットに順番に配置したためです.
ソリューションでは、javaのパッケージjava.util.*にScannerクラスが用意されており、Scannerクラスを使用するとコンソールを介して変数に容易に値を割り当てることができます.
System.out.println("Please input the words");
		int x,y,z;
		try
		{
			Scanner in = new Scanner(System.in);
			x = in.nextInt();
			y = in.nextInt();
			z = in.nextInt();
			System.out.println("x,y,z is:" + x +" " + y + " " + z);
			String str = in.next();
			System.out.println(str);
		}catch(Exception e)
		{
			
		}

9:StreamTokenizer
判定フィールドttype=TT_EOF,TT_EOL,TT_WORD,TT_NUMBERにより、これらのタグにより行、数字、文字列が分離される.tokenが現在取得している文字列値またはdouble値は、sval,nvalフィールド値により取得される.プログラムは、以下のようになる.
StreamTokenizer st = null;
		try
		{
			st = new StreamTokenizer(new FileReader("a.txt"));
			//st.slashSlashComments(true);
			//st.slashStarComments(true);
			while(st.nextToken() != StreamTokenizer.TT_EOF)
			{
				System.out.println("the line is:"+ st.lineno());
				if(st.ttype == StreamTokenizer.TT_WORD)
				{
					System.out.println(st.sval);
				}
				if(st.ttype == StreamTokenizer.TT_NUMBER)
				{
					System.out.println(st.nval);
				}
			}
		}catch(FileNotFoundException fp)
		{	
		}catch(IOException e)
		{ 
		}

10 Fileクラス
Fileはファイルを操作するクラスで、機能にはファイルの遍歴、作成、削除、質問の読み取り可能、書き込み可能などの様々な属性が含まれています.java.nio.Pathと同様に、ファイルパスに関する操作を提供しています.このうち2つは互いに変換できます.
11  java.nio.file
Filesはpathに対する様々な操作を提供し、すべて様々な静的関数であり、静的関数によってpath、directoryの作成、削除、追加、移動を完了し、存在するかどうかを判断する様々な操作を行う.
File directory = new File("");//        
		try{
		    System.out.println(directory.getCanonicalPath());//       
		    System.out.println(directory.getAbsolutePath());//      
		}catch(Exception e){}
		
		System.out.println(System.getProperty("user.dir"));//user.dir