CSDN トピック チャレンジ フェーズ 2
参加トピック: Java テクノロジの共有
記事ディレクトリ
書類
ファイルの概念
ファイルは、ハードディスクに保存され、データを保存するために使用される抽象化された独立した単位です。
ファイルパス
通常、ファイルのパスは次のとおりです。
- 絶対パス: ファイルのルート ディレクトリから始まり、ファイル自体のパスに到達します。通常はドライブ文字を使用します。
- 相対パス: 任意のディレクトリから始まる、現在のファイル自体へのパス。
ファイルのパスを通じて、システム内のファイルの場所をすばやく見つけることができます。
文書の分類
通常、ファイルに保存されているさまざまなデータに応じて、ファイルを次のように分割します。
- バイナリ ファイル: 文字セットでエンコードされていないファイル。ルールは複雑です。
- テキスト ファイル: 単純な規則を持つ文字セットによってエンコードされたファイル。
テキスト ファイルとバイナリ ファイルはどちらもバイナリ 0 と 1 で格納されますが、エンコードの状況が異なるため違いがあります。
ファイルシステム
ファイルはオペレーティング システムによっても管理されます. オペレーティング システム カーネルでファイルを管理するために使用されるモジュールはファイル システムと呼ばれます.
Java はまた、ファイルをより便利に管理するのに役立つファイル用の一連のパッケージを提供します. 操作, すなわち File クラス;
Fileの構築方法
import java.io.File;
public class demo1 {
public static void main(String[] args) {
//File(String pathname) 根据文件路径创建一个新的 File 实例;
File file1=new File("d:/test.txt");
//File(File parent, String child) 根据父目录 + 孩子文件路径,创建一个新的 File 实例
File file2=new File("d:/tmp","./tmp/test");
}
}
File クラスを使用するには、パッケージをインポートする必要があります: java.io.File;
インスタンスを作成するときの File クラスの構築方法のパスは、絶対パスまたは相対パスにすることができます; 構築方法は、の
インスタンスを作成することですFile オブジェクト、および File オブジェクトはファイルが実際に存在することを表していません。
File クラスの基本メソッド
- ファイルの基本的なプロパティにアクセスします。
public static void main(String[] args) {
//File(String pathname) 根据文件路径创建一个新的 File 实例;
File file1=new File("./test.txt");
//返回对象的父目录文件路径
System.out.println(file1.getParent());
//返回对象的文件名称
System.out.println(file1.getName());
//返回对象的文件路径
System.out.println(file1.getPath());
//判断对象描述的文件是否存在
System.out.println(file1.exists());
//返回对象的绝对路径
System.out.println(file1.getAbsolutePath());
}
- ドキュメントの作成;
import java.io.File;
import java.io.IOException;
public class demo1 {
public static void main(String[] args) throws IOException {
//File(String pathname) 根据文件路径创建一个新的 File 实例;
File file1=new File("./test.txt");
//判断对象描述的文件是否存在
System.out.println(file1.exists());
//判断对象描述的文件是否是一个普通文件
System.out.println(file1.isFile());
//根据对象自动创建一个空白文件,创建成功返回true;
System.out.println(file1.createNewFile());
System.out.println(file1.exists());
System.out.println(file1.isFile());
System.out.println(file1.getAbsolutePath());
}
}
この時点で、ファイルが実際に正常に作成されます。
- ファイルの削除;
import java.io.File;
import java.io.IOException;
public class demo1 {
public static void main(String[] args) throws IOException {
File file1=new File("./test2.txt");
System.out.println(file1.exists());
System.out.println(file1.createNewFile());
System.out.println(file1.exists());
System.out.println(file1.delete());
System.out.println(file1.exists());
}
}
delete() File オブジェクトに従って、ファイルを削除します。削除が成功すると true を返します。
public static void main(String[] args) throws IOException {
File file1=new File("./test2.txt");
System.out.println(file1.exists());
System.out.println(file1.createNewFile());
System.out.println(file1.exists());
//程序退出时删除
file1.deleteOnExit();
System.out.println(file1.exists());
}
- ディレクトリの作成;
import java.io.File;
import java.io.IOException;
public class demo1 {
public static void main(String[] args) throws IOException {
File file1=new File("tmp/test.txt/123");
System.out.println(file1.exists());
System.out.println(file1.isDirectory());
//创建目录
System.out.println(file1.mkdir());
//创建目录,同时创建中间目录
System.out.println(file1.mkdirs());
System.out.println(file1.exists());
}
}
mkdir() を使用してディレクトリを作成する場合、中間ディレクトリが存在しない場合、正常に作成できません; mkdirs() を使用すると、中間ディレクトリを同時に作成できます。
ファイルの読み書き
ファイル コンテンツの読み取りと書き込みは、実際にはデータ フローのプロセスです。いわゆるデータ フローとは、データ レコードをバッチではなく連続的に送信するプロセスを指します。Java は、ファイルの読み取りと書き込みのための特別なクラス、つまり InputStream と OutputStream を提供します
。 、およびリーダーとライター。
入力ストリーム
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class demo1 {
public static void main(String[] args) throws IOException {
File file=new File("./test.txt");
file.createNewFile();
System.out.println(file.getAbsolutePath());
InputStream inputStream=null;
//打开文件
inputStream=new FileInputStream("test.txt");
//读取文件
while (true){
int a=inputStream.read();
if (a==-1){
break;
}
System.out.println(a);
}
//关闭文件
inputStream.close();
}
}
上記のコードを実行するときは、最初にファイルを存在させ、同時にファイルに特定のコンテンツを書き込む必要があります。たとえば、次のようになり
ます
。
InputStream は直接インスタンス化 (abstract によって変更) できないため、サブクラス FileInputStream を使用して実行されます。
read() を使用してファイルの内容を読み取ります。read() メソッドは、さまざまな読み取り形式も提供します。
最初の形式は、一度に 1 バイトずつ読み取るもので、通常はループ読み取りによって行われ、上記のコードはこの形式を採用しています。
//读取文件
byte [] b=new byte[1024];
int len=inputStream.read(b);
System.out.println(len);
for (int i=0;i<len;i++){
System.out.println(b[i]);
}
2 番目の形式は、配列を使用して実行されます。
public static void main(String[] args) throws IOException {
File file=new File("./test.txt");
file.createNewFile();
System.out.println(file.getAbsolutePath());
InputStream inputStream=null;
//打开文件
inputStream=new FileInputStream("test.txt");
//读取文件
byte [] b=new byte[1024];
int len=inputStream.read(b);
String s=new String(b,0,len);
System.out.println(s);
//关闭文件
inputStream.close();
}
3 番目の形式は、配列内のコンテンツについては、off 添字の位置から読み取りを開始し、len の長さを読み取ります;
ファイル内のコンテンツが中国語の場合、文字化けを避けるために、引き続き第3引数以降の文字を指定 エンコード方法、つまり String s = new String(b, 0, len, “UTF-8”);
inputStream の役割は、実際には「リモコン」の役割に関連しています。なぜなら、ファイルはハードディスクに保存され、ハードディスクを直接操作することは間違いなく難しいため、ファイルに関連付けられたオブジェクトをこのオブジェクトを操作してファイル操作の目的を達成することで、メモリ、つまりinputStream、コンピューターでは「リモコン」機能として機能するオブジェクトを「ハンドル」と呼びます。
ファイルを読み取った後は、ファイルを閉じることが非常に重要です。簡単に言えば、時間内にファイルを閉じると、リソースが解放される可能性があります。また、ファイル記述テーブルの存在により、ファイル記述テーブルは PCB 内の属性であり、シーケンシャル テーブル構造であり、各要素は現在のプロセスによって開かれたファイルを表し、各要素の添字は「ファイル記述子」と呼ばれるため、開かれた各ファイルはファイル記述テーブル内の位置を占有します. ファイル記述テーブルには一定の容量制限があるため、ファイルをタイムリーにやみくもに開くだけでは、当然ファイルを閉じることができなくなります.また、ファイルを開いた後に閉じるのを忘れると、ファイルリソースのリークも発生します.このリークは段階的なプロセスであるため、このリークを検出できない場合があります.より大きなセキュリティ リスクをもたらすため、ファイルを開いた後は、時間内にファイルを閉じるようにしてください。
上記のコードの整合性とセキュリティのために、次の改善を行うことができます。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class demo1 {
public static void main(String[] args) throws IOException {
File file=new File("./test.txt");
file.createNewFile();
InputStream inputStream=null;
try{
//打开文件
inputStream=new FileInputStream("test.txt");
//读取文件
byte [] b=new byte[1024];
int len=inputStream.read(b);
String s=new String(b,0,len);
System.out.println(s);
}catch(IOException e){
e.printStackTrace();
}finally {
try{
//关闭文件
inputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
コア コードに try-catch 操作を追加し、ファイルが時間内に閉じられない場合に例外をスローします。
さらに、より便利で安全な方法があります。
public class demo1 {
public static void main(String[] args) throws IOException {
File file=new File("./test.txt");
file.createNewFile();
try(InputStream inputStream=new FileInputStream("test.txt")){
//打开文件
//读取文件
byte [] b=new byte[1024];
int len=inputStream.read(b);
String s=new String(b,0,len);
System.out.println(s);
}catch(IOException e){
e.printStackTrace();
}
}
}
この書き方は、try の実行が完了した後に自動的に inputStream の close メソッドを呼び出す、これはリソースを使用した try の操作であり、Closeable インターフェイスを実装するクラスに対して実行できます。
上記の InputStream を使用した読み取りは、実際にはバイト ストリームの方法ですが、文字ストリームの方法を使用して読み取ることもできます。
読者
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class demo2 {
public static void main(String[] args) throws IOException {
Reader reader=new FileReader("test.txt");
char [] buffer=new char[1024];
int len=reader.read(buffer);
for (int i=0;i<len;i++){
System.out.println(buffer[i]);
}
reader.close();
}
}
名前が示すように、文字ストリームは文字単位のストリームであり、通常はテキスト ファイルの操作に使用されます。
スキャナ
上記の例では、 InputStream を使用して読み取るのは少し面倒なので、 Scanner クラスを使用して解決しようとしています。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class demo3 {
public static void main(String[] args) throws IOException {
InputStream inputStream=new FileInputStream("test.txt");
Scanner scanner=new Scanner(inputStream);
String s=scanner.next();
System.out.println(s);
inputStream.close();
}
}
出力ストリーム
OutputStream の writer() メソッドを使用して文字を書き込みます。writer() はさまざまな形式も提供します。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class demo4 {
public static void main(String[] args) {
try(OutputStream outputStream=new FileOutputStream("test.txt")) {
//write (int b)
outputStream.write('h');
outputStream.write('e');
outputStream.write('l');
outputStream.write('l');
outputStream.write('o');
String s="happy everyday";
outputStream.write(s.getBytes());
//write(byte[] b)
byte[] str=new byte[]{
'g','o','o','d'};
outputStream.write(str);
//write(byte[] b,int off,int len)
int len=str.length;
outputStream.write(str,0,len);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ライター
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class demo5 {
public static void main(String[] args) {
try (Writer writer = new FileWriter("test.txt")) {
writer.write("hello world");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Writer が文字を書き込む方法は、文字ストリームの方法でもあります。
プリントライター
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
public class demo6 {
public static void main(String[] args) {
try(OutputStream outputStream=new FileOutputStream("test.txt")){
PrintWriter printWriter=new PrintWriter(outputStream);
printWriter.println("hhhhhhhhhhh");
}catch (IOException e){
e.printStackTrace();
}
}
}
PrintWriter クラスも出力を完成させることができ、PrintWriter クラスはさまざまな形式の結果を出力するためのメソッドも提供します。つまり、print/println/printf です。
以上!