作業後、使用されるテクノロジーはプロジェクトの変更に応じて変わります。場合によっては C#、場合によっては Java、そしてもちろんその他の断片化されたテクノロジーも使用されます。全体として、C# の方が時間がかかり、次に Java が続きます。私は言語にこだわりはありません。仕事ができる言語が良い言語です。オブジェクト指向の観点から見ると、私にとって C# と Java に違いはないと思います。
この記事では、Java の I/O 操作に関する内容を主に説明します。Java の I/O は、シーケンシャル読み取りとランダム読み取りの 2 つのタイプに分かれています。
まずシーケンシャル読み取りについて見てみましょう。シーケンシャル読み取りを実行するには 2 つの方法があります。1 つはバイトで動作する入力ストリームと出力ストリームです。もう 1 つは文字で動作する Reader/Writer です。操作の流れ。
以下にInputStreamの構造を描きます。
FileInputStream: ファイルを操作します。BufferedInputStream と一緒によく使用されます。
PipedInputStream: スレッド間通信に使用できます。
ObjectInputStream: オブジェクトのシリアル化に使用できます。
ByteArrayInputStream: バイト配列の入力を処理するために使用されます。
LineNumberInputStream: 現在の行番号を出力でき、プログラム内で変更できます。
以下はOutputStreamの構造です。
PrintStream: データを出力するために print および println に似たインターフェイスを提供します
Streamを使って入出力を操作する方法を見てみましょう。
InputStream を使用したファイルの読み取り
次のようにコードをコピーします。
FileInputStream を使用してファイル情報を読み取る
public static byte[] readFileByFileInputStream(File file) が IOException をスローする
{
ByteArrayOutputStream 出力 = 新しい ByteArrayOutputStream();
FileInputStream fis = null;
試す
{
fis = 新しい FileInputStream(ファイル);
byte[] バッファ = 新しいバイト [1024];
int bytesRead = 0;
while((bytesRead = fis.read(buffer, 0,buffer.length)) != -1)
{
Output.write(buffer, 0, bytesRead);
}
}
catch(例外例)
{
System.out.println("読み込み中にエラーが発生しました " + file.getAbsoluteFile());
}
ついに
{
if (fis !=null) fis.close();
if (出力 !=null) 出力.close();
}
出力を返します。toByteArray();
}
BufferedInputStream を使用したファイルの読み取り
次のようにコードをコピーします。
public static byte[] readFileByBufferedInputStream(File file) が例外をスローする
{
FileInputStream fis = null;
BufferedInputStream ビス = null;
ByteArrayOutputStream 出力 = 新しい ByteArrayOutputStream();
試す
{
fis = 新しい FileInputStream(ファイル);
bis = 新しい BufferedInputStream(fis);
byte[] バッファ = 新しいバイト [1024];
int bytesRead = 0;
while((bytesRead = bis.read(buffer, 0,buffer.length)) != -1)
{
Output.write(buffer, 0, bytesRead);
}
}
catch(例外例)
{
System.out.println("読み込み中にエラーが発生しました " + file.getAbsoluteFile());
}
ついに
{
if (fis != null) fis.close();
if (bis != null) bis.close();
if (出力 != null) Output.close();
}
出力を返します。toByteArray();
}
OutputStream を使用してファイルをコピーする
次のようにコードをコピーします。
FileOutputStream を使用してファイルをコピーする
public static void copyFileByFileOutputStream(File file) が IOException をスローする
{
FileInputStream fis = null;
FileOutputStream fos = null;
試す
{
fis = 新しい FileInputStream(ファイル);
fos = 新しい FileOutputStream(file.getName() + ".bak");
byte[] バッファ = 新しいバイト [1024];
int bytesRead = 0;
while((bytesRead = fis.read(buffer,0,buffer.length)) != -1)
{
fos.write(buffer, 0, bytesRead);
}
fos.flush();
}
catch(例外例)
{
System.out.println("コピー中にエラーが発生しました " + file.getAbsoluteFile());
}
ついに
{
if (fis != null) fis.close();
if (fos != null) fos.close();
}
}
次のようにコードをコピーします。
BufferedOutputStream を使用してファイルをコピーする
public static void copyFilebyBufferedOutputStream(File file)throws IOException
{
FileInputStream fis = null;
BufferedInputStream ビス = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
試す
{
fis = 新しい FileInputStream(ファイル);
bis = 新しい BufferedInputStream(fis);
fos = 新しい FileOutputStream(file.getName() + ".bak");
bos = 新しい BufferedOutputStream(fos);
byte[] バッファ = 新しいバイト [1024];
int bytesRead = 0;
while((bytesRead = bis.read(buffer, 0,buffer.length)) != -1)
{
bos.write(buffer, 0, bytesRead);
}
bos.flush();
}
catch(例外例)
{
System.out.println("コピー中にエラーが発生しました " + file.getAbsoluteFile());
}
ついに
{
if (fis != null) fis.close();
if (bis != null) bis.close();
if (fos != null) fos.close();
if (bos != null) bos.close();
}
}
ここのコードは例外を非常に不完全に処理します。完全で厳密なコードは後で説明します。
Readerの構造を見てみましょう
ここでのReaderは基本的にInputStreamに相当します。
Writerの構造は以下の通りです
Reader または Writer の使用例をいくつか見てみましょう
Reader を使用してファイルの内容を読み取る
次のようにコードをコピーします。
BufferedReader を使用してファイルの内容を読み取る
public static String readFile(String file) が IOException をスローする
{
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
試す
{
br = 新しい BufferedReader(新しい FileReader(ファイル));
文字列行 = null;
while((line = br.readLine()) != null)
{
sb.append(行);
}
}
catch(例外例)
{
System.out.println("読み込み中にエラーが発生しました " + ファイル);
}
ついに
{
if (br != null) br.close();
}
sb.toString()を返します;
}
Writer を使用してファイルをコピーする
次のようにコードをコピーします。
BufferedWriterを使用してファイルをコピーする
public static void copyFile(String file) が IOException をスローする
{
BufferedReader br = null;
BufferedWriter bw = null;
試す
{
br = 新しい BufferedReader(新しい FileReader(ファイル));
bw = new BufferedWriter(new FileWriter(file + ".bak"));
文字列行 = null;
while((line = br.readLine())!= null)
{
bw.write(行);
}
}
catch(例外例)
{
System.out.println("コピー中にエラーが発生しました " + ファイル);
}
ついに
{
if (br != null) br.close();
if (bw != null) bw.close();
}
}
ファイルへのランダム アクセスを実行する方法を見てみましょう。 RandomAccessFile は主に Java でファイルに対してランダムな操作を実行するために使用されます。
固定サイズのファイルを作成する
次のようにコードをコピーします。
固定サイズのファイルを作成する
public static void createFile(String file, int size) は IOException をスローします
{
ファイル一時 = 新しいファイル(ファイル);
RandomAccessFile raf = new RandomAccessFile(temp, "rw");
raf.setLength(サイズ);
raf.close();
}
ランダムなデータをファイルに書き込む
次のようにコードをコピーします。
ランダムなデータをファイルに挿入する
public static void writeFile(String file, byte[] content, int startPos, int contentLength) は IOException をスローします
{
RandomAccessFile raf = new RandomAccessFile(new File(file), "rw");
raf.seek(startPos);
raf.write(コンテンツ, 0, contentLength);
raf.close();
}
次に、その他の一般的な操作を見てみましょう
ファイルの移動
次のようにコードをコピーします。
ファイルの移動
public static boolean moveFile(String sourceFile, String destFile)
{
ファイルソース = 新しいファイル(sourceFile);
if (!source.exists()) throw new RuntimeException("ソース ファイルが存在しません。");
ファイル dest = 新しいファイル(destFile);
if (!(new File(dest.getPath()).exists())) new File(dest.getParent()).mkdirs();
戻り値source.renameTo(dest);
}
ファイルをコピーする
次のようにコードをコピーします。
ファイルをコピーする
public static void copyFile(String sourceFile, String destFile) が IOException をスローする
{
ファイルソース = 新しいファイル(sourceFile);
if (!source.exists()) throw new RuntimeException("ファイルが存在しません。");
if (!source.isFile()) throw new RuntimeException("ファイルではありません。");
if (!source.canRead()) throw new RuntimeException("ファイルを読み取れませんでした。");
ファイル dest = 新しいファイル(destFile);
if (dest.exists())
{
if (dest.isDirectory()) throw new RuntimeException("宛先はフォルダーです。");
それ以外
{
dest.delete();
}
}
それ以外
{
ファイルparentFolder = new File(dest.getParent());
if (!parentFolder.exists())parentFolder.mkdirs();
if (!parentFolder.canWrite()) throw new RuntimeException("宛先に書き込めません。");
}
FileInputStream fis = null;
FileOutputStream fos = null;
試す
{
fis = 新しい FileInputStream(ソース);
fos = 新しい FileOutputStream(dest);
byte[] バッファ = 新しいバイト [1024];
int bytesRead = 0;
while((bytesRead = fis.read(buffer, 0,buffer.length)) != -1)
{
fos.write(buffer, 0, bytesRead);
}
fos.flush();
}
catch(IOException ex)
{
System.out.println("コピー中にエラーが発生しました " + sourceFile);
}
ついに
{
if (fis != null) fis.close();
if (fos != null) fos.close();
}
}
フォルダをコピーする
次のようにコードをコピーします。
フォルダをコピーする
public static void copyDir(String sourceDir, String destDir) が IOException をスローする
{
ファイルソース = 新しいファイル(sourceDir);
if (!source.exists()) throw new RuntimeException("ソースが存在しません。");
if (!source.canRead()) throw new RuntimeException("ソースを読み取れませんでした。");
ファイル dest = 新しい File(destDir);
if (!dest.exists()) dest.mkdirs();
ファイル[] arrFiles = source.listFiles();
for(int i = 0; i < arrFiles.length; i++)
{
if (arrFiles[i].isFile())
{
BufferedReader リーダー = new BufferedReader(new FileReader(arrFiles[i]));
BufferedWriter ライター = new BufferedWriter(new FileWriter(destDir + "/" + arrFiles[i].getName()));
文字列行 = null;
while((line = Reader.readLine()) != null) Writer.write(line);
ライター.flush();
Reader.close();
Writer.close();
}
それ以外
{
copyDir(sourceDir + "/" + arrFiles[i].getName(), destDir + "/" + arrFiles[i].getName());
}
}
}
フォルダを削除する
次のようにコードをコピーします。
フォルダを削除する
public static void del(String filePath)
{
ファイル file = 新しいファイル(ファイルパス);
if (file == null || !file.exists()) が戻る;
if (file.isFile())
{
ファイル.削除();
}
それ以外
{
ファイル[] arrFiles = file.listFiles();
if (arrFiles.length > 0)
{
for(int i = 0; i < arrFiles.length; i++)
{
del(arrFiles[i].getAbsolutePath());
}
}
ファイル.削除();
}
}
フォルダーのサイズを取得する
次のようにコードをコピーします。
フォルダーのサイズを取得する
public static long getFolderSize(String dir)
{
長いサイズ = 0;
ファイル file = 新しいファイル(ディレクトリ);
if (!file.exists()) throw new RuntimeException("ディレクトリが存在しません。");
if (file.isFile()) return file.length();
それ以外
{
String[] arrFileName = file.list();
for (int i = 0; i < arrFileName.length; i++)
{
サイズ += getFolderSize(dir + "/" + arrFileName[i]);
}
}
返品サイズ;
}
大きなファイルを複数の小さなファイルに分割する
次のようにコードをコピーします。
大きなファイルを複数の小さなファイルに分割する
public static void SplitFile(String filePath、long Unit) が IOException をスローする
{
ファイル file = 新しいファイル(ファイルパス);
if (!file.exists()) throw new RuntimeException("ファイルが存在しません。");
長いサイズ = file.length();
if (単位 >= サイズ) を返します。
int カウント = サイズ % 単位 == 0 ? (int)(サイズ/単位) : (int)(サイズ/単位) + 1;
文字列 newFile = null;
FileOutputStream fos = null;
FileInputStream fis =null;
byte[] バッファ = 新しいバイト[(int)unit];
fis = 新しい FileInputStream(ファイル);
長い開始位置 = 0;
文字列 countFile = ファイルパス + "_Count";
PrintWriter ライター = new PrintWriter(new FileWriter( new File(countFile)));
Writer.println(ファイルパス + "/t" + サイズ);
for (int i = 1; i <= count; i++)
{
newFile = ファイルパス + "_" + i;
startPos = (i - 1) * 単位;
System.out.println("作成中 " + newFile);
fos = 新しい FileOutputStream(新しいファイル(新しいファイル));
int bytesRead = fis.read(buffer, 0,buffer.length);
if (バイト読み取り != -1)
{
fos.write(buffer, 0, bytesRead);
Writer.println(newFile + "/t" + startPos + "/t" + bytesRead);
}
fos.flush();
fos.close();
System.out.println("StartPos:" + i*unit + "; EndPos:" + (i*unit + bytesRead));
}
ライター.flush();
Writer.close();
fis.close();
}
複数の小さなファイルを 1 つの大きなファイルに結合する
次のようにコードをコピーします。
複数の小さなファイルを 1 つの大きなファイルに結合する
public static void linkFiles(String countFile) が IOException をスローする
{
ファイル file = 新しいファイル(countFile);
if (!file.exists()) throw new RuntimeException("カウントファイルが存在しません。");
BufferedReader リーダー = new BufferedReader(new FileReader(file));
文字列行 = Reader.readLine();
文字列 newFile = line.split("/t")[0];
長いサイズ = Long.parseLong(line.split("/t")[1]);
RandomAccessFile raf = new RandomAccessFile(newFile, "rw");
raf.setLength(サイズ);
FileInputStream fis = null;
byte[] バッファ = null;
while((line = Reader.readLine()) != null)
{
String[] arrInfo = line.split("/t");
fis = 新しい FileInputStream(新しい File(arrInfo[0]));
バッファ = 新しいバイト[Integer.parseInt(arrInfo[2])];
long startPos = Long.parseLong(arrInfo[1]);
fis.read(buffer, 0, Integer.parseInt(arrInfo[2]));
raf.seek(startPos);
raf.write(buffer, 0, Integer.parseInt(arrInfo[2]));
fis.close();
}
raf.close();
}
外部コマンドを実行する
次のようにコードをコピーします。
外部コマンドを実行する
public static void execExternalCommand(文字列コマンド、文字列引数)
{
プロセス process = null;
試す
{
process = Runtime.getRuntime().exec(コマンド + " " + 引数);
入力ストリームは = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
文字列行 = null;
while((line = br.readLine()) != null)
{
System.out.println(line);
}
}
catch(例外例)
{
System.err.println(ex.getMessage());
}
ついに
{
if (プロセス != null) process.destroy();
}
}