Java4Android自習レコード(22-2):JavaでのI / O

道は邪魔で長く、線が来ています。頭を下げて一生懸命頑張ってください。話さなければ、あなたは大ヒット作になります!さあ、サンニアン!

ディレクトリとリソースのインデックス

  Java4Android自己学習プロセスのカタログとリソースインデックス

1大きなファイルを読み書きする方法

  実際には、読み取りメソッドを使用して読み取りデータをバッファーに入れることができます。現在のバイトストリーム、配列の長さは固定ですが、長さに関係なく、書き込み/読み取りを終了します。この方法では、少しずつ読み取ることができ、以前に学習したC ++リングバッファーと同様に、ループを使用して読み取る必要があります。

  バイト変換方法は、以下についてもよく知られています。

1G = 1024M = 1024 * 1024 K = 1024 * 1024 * 1024 B

  循環的思考:読み取られるたびに何バイトが返されるか、最後にデータが読み取られたときに、readメソッドはどのような値を返すか?データが読み取られると、-1が返されます。

  次に、この時点でループを定義できます。戻り値が-1の場合、ループは停止します。それ以外の場合、ループは実行を継続します。

  言うことはあまりありませんが、コード

import java.io.*;	// 导入类

class Test 
{
    
    
	public static void main(String args[])
	{
    
    
		// 声明输入流引用
		FileInputStream fis = null;
		
		// 声明输出流的引用
		FileOutputStream fos = null;
		
		try
		{
    
    
			// 生成代表输入流的对象
			fis = new FileInputStream("from.txt");
			
			// 生成代表输出流的对象
			fos = new FileOutputStream("to.txt");
			
			// 生成一个字节数组
			byte [] buffer = new byte[1024];
			while(true)
			{
    
    
				// 调用输入流对象的read方法,读取数据
				int temp = fis.read(buffer, 0, buffer.length);
				if(-1 == temp)
				{
    
    
					break;	// 如果读取完毕,就跳出
				}
				
				// 读出来多少数据,就写进去多少数据
				fos.write(buffer, 0, temp);				
				
			}
			
			// 把数组内的数据,还原为字符
			// String s = new String(buffer);
			
			// 将会去除掉这个字符串的首尾空格和空字符
			// s = s.trim();
			
			// System.out.println(s);
		}
		catch(Exception e)
		{
    
    
			System.out.println(e);
		}
		
	}
}

  上記のプログラムをコンパイルすると、実行結果は次のようになります。
image-20200530122337884

  実行後、結果はありませんが、これは印刷を追加しなかったためです。現時点では、最良の結果はありません。フォルダーの内容を見てみましょう。
image-20200530122437465

  ただし、上記のコードは現時点ではまだ不完全です。ファイルを開いていることを発見したかどうか、またそれを使用した後、ファイルを閉じるための関連操作がないかどうかはわかりません。現時点では、操作に欠陥があるはずです。以前の経験を参照してください。最後に、ファイルを閉じる操作が追加されていますが、ファイルを閉じるステップまでいつでも実行できるという利点があります。変更されたコードは次のとおりです。

import java.io.*;	// 导入类

class Test 
{
    
    
	public static void main(String args[])
	{
    
    
		// 声明输入流引用
		FileInputStream fis = null;
		
		// 声明输出流的引用
		FileOutputStream fos = null;
		
		try
		{
    
    
			// 生成代表输入流的对象
			fis = new FileInputStream("from.txt");
			
			// 生成代表输出流的对象
			fos = new FileOutputStream("to.txt");
			
			// 生成一个字节数组
			byte [] buffer = new byte[1024];
			while(true)
			{
    
    
				// 调用输入流对象的read方法,读取数据
				int temp = fis.read(buffer, 0, buffer.length);
				if(-1 == temp)
				{
    
    
					break;	// 如果读取完毕,就跳出
				}
				
				// 读出来多少数据,就写进去多少数据
				fos.write(buffer, 0, temp);				
				
			}
		}
		catch(Exception e)
		{
    
    
			System.out.println(e);
		}
		finally
		{
    
    
			fis.close();
			fos.close();
		}
	}
}

  この時点でコンパイルして実行すると、結果は次のようになります。
image-20200530122913138

  例外がスローされたときの解決策は、次のように、スローするためにキャッチまたは宣言する必要がある、つまり、try ... catch ...ステートメントの別のレイヤーを追加する必要があることがわかります。

import java.io.*;	// 导入类

class Test 
{
    
    
	public static void main(String args[])
	{
    
    
		// 声明输入流引用
		FileInputStream fis = null;
		
		// 声明输出流的引用
		FileOutputStream fos = null;
		
		try
		{
    
    
			// 生成代表输入流的对象
			fis = new FileInputStream("from.txt");
			
			// 生成代表输出流的对象
			fos = new FileOutputStream("to.txt");
			
			// 生成一个字节数组
			byte [] buffer = new byte[1024];
			while(true)
			{
    
    
				// 调用输入流对象的read方法,读取数据
				int temp = fis.read(buffer, 0, buffer.length);
				if(-1 == temp)
				{
    
    
					break;	// 如果读取完毕,就跳出
				}
				
				// 读出来多少数据,就写进去多少数据
				fos.write(buffer, 0, temp);				
				
			}
		}
		catch(Exception e)
		{
    
    
			System.out.println(e);
		}
		finally
		{
    
    
			try
			{
    
    
				fis.close();
				fos.close();
			}
			catch(Exception e)
			{
    
    
				System.out.println(e);
			}			
		}
	}
}

  このとき、実行結果は以下のようになり、出力がないことがわかります。同様に、出力がないことが最良の結果です。
image-20200530123228227

2文字ストリームの使い方

  文字通り、それはファイルを読み書きするときの文字に基づいています。

  文字ストリームの基本的な形式は次のとおりです。

// 字符输入流:Reader	FileReader
int read(char [] c, int off, int len)

// 字符输出流:Writer	FileWriter
int write(char [] c, int off, int len)

  次のように、実際のコードを例として取り上げます。

import java.io.*;

public class TestChar
{
    
    
	public static void main(String args[])
	{
    
    
		FileReader fr = null;
		FileWriter fw = null;
		
		try
		{
    
    
			fr = new FileReader("from.txt");
			fw = new FileWriter("to.txt");
			
			// 字符流 生成char类型的
			char [] buffer = new char[100];	
			int temp = fr.read(buffer, 0, buffer.length);
			
			for(int i = 0; i < buffer.length; i++)
			{
    
    
				System.out.println(buffer[i]);
			}
		}
		catch(Exception e)
		{
    
    
			System.out.println(e);
		}
		finally
		{
    
    
			
		}
	}
}

  上記のコードをコンパイルして実行すると、結果は次のようになります。
image-20200530123746830

  以下に多くの空白があることがわかります。現時点では、文字列に変換せず、結果を配列に直接出力したため、最後に改行などの文字の遮蔽がなかったため、この結果が発生します。

3まとめ

  1. 比較的大きなファイルの読み取りと書き込みの場合、最初に配列を作成します。配列はファイルサイズよりも小さく、ループを使用してから、ループを使用して別のファイルに書き込みます。いつ停止しますか?条件が偽の場合、いつ偽ですか?読み取り後、readは-1を返します。
  2. バイトストリームと文字ストリームの使用法と特性を簡単に理解します。
  3. まだ一生懸命働き続ける必要があります!

記事の内容が間違っている場合は、コメント/プライベートメッセージをたくさんアドバイスしてください、ありがとう!記事の内容が悪くないと思うなら、いいねを残してください。あなたのいいねが私の最大の励ましです、ありがとう!

おすすめ

転載: blog.csdn.net/Fighting_Boom/article/details/106439932