ファイルに対するJava操作
ファイルの読み書きに関しては、シャオユアンはこの記事を書くために通常の記事の枠組みに従っていません。シャオユアンはケースに基づいてこの章のメモを書きます。
ファイルの作成
ファイルの作成は比較的簡単です。Filefile= new File( "xxx")を使用すると、フォルダーまたはファイルを作成できます。この要約の内容についてはあまり説明しません。
ファイルの削除
ファイルの削除については、Xiao Yuanがケースを直接提示し、Javaコードを使用してXiaoYuanによって作成されたテストファイルを直接削除します。
テストコード
public class Demo01Test {
public static void main(String[] args) {
File file = new File("G:\\test");
deleteAllFile(file);
}
public static void deleteAllFile(File file){
System.out.println("-----------------------");
File[] files = file.listFiles();
for (File file1 : files) {
if(file1.isDirectory()){
System.out.println("delete file"+file1);
deleteAllFile(file1);
}else{
file1.delete();
}
}
System.out.println("delete directory:"+file);
file.delete();
System.out.println("-------------------------");
}
}
試験結果
ファイル検索
ケース1の機能要件は、すべてのフォルダーを表示することです。コードの実装を以下に示します。
public class Demo04Recurison {
public static void main(String[] args) {
File file = new File("G:\\test");
getAllFile(file);
}
public static void getAllFile(File dir){
System.out.println(dir);
File[] files = dir.listFiles();
for (File f :
files) {
if (f.isDirectory()){
getAllFile(f);
}else {
System.out.println(f);
}
}
}
}
テスト結果
テスト結果は、検索されたすべてのファイルとフォルダーに問題がないことを示しています。
ケース2
ケース2の要件は、.txtで終わるすべてのファイルを出力することです。以下に示すように、最初にコードをアップロードします。
public class Demo04Recurison {
public static void main(String[] args) {
File file = new File("G:\\test");
findAllFiles(file);
}
public static void findAllFiles(File dir){
File[] files = dir.listFiles();
for (File f :
files) {
if (f.isDirectory()) {
findAllFiles(f);
}else{
if(f.toString().toLowerCase().endsWith(".txt")){
System.out.println(f);
}
}
}
}
}
全体として、ファイル検索の全体的な考え方は、ターゲットファイルを選択するために、ファイルを再帰的にトラバースするときにターゲットファイルに対して条件付きの判断を行うことです。
検索ファイルフィルターの場合、上記のコードの欠点は、コードが形成されると、コードの機能が固定されることを意味します。別の機能を実現したい場合は、コードを書き直す必要があります。これを変更したい場合状況によっては、インターフェイスを使用してファイルを検索する必要があります。関数は固定テンプレートを定義し、
ケース3
FileFilterフィルターを使用してファイル検索を実現します。FileFilterのソースコードは次のとおりです。
@FunctionalInterface
public interface FileFilter {
/**
* Tests whether or not the specified abstract pathname should be
* included in a pathname list.
*
* @param pathname The abstract pathname to be tested
* @return <code>true</code> if and only if <code>pathname</code>
* should be included
*/
boolean accept(File pathname);
}
注意、これが、インターフェイスがデフォルトで抽象関数を追加するため、インターフェイス関数の抽象クラスがない理由です。次のコードを見てください。
したがって、抽象という単語はFileFilterに表示されません。以下では、Xiaoyanは匿名内部クラスとラムダ式を使用してファイルフィルタリングケース
メソッド1(匿名内部クラス)
をコードに直接実装します。最初に、FileFilterインターフェイス実装クラスを記述します。
public class FileFilterImpl implements FileFilter{
@Override
public boolean accept(File pathname) {
/*
过滤的规则:
在accept方法中,判断File对象是否是以.java结尾
是就返回true
不是就返回false
*/
//如果pathname是一个文件夹,返回true,继续遍历这个文件夹
if(pathname.isDirectory()){
return true;
}
return pathname.getName().toLowerCase().endsWith(".java");
}
}
テストクラス
public class Demo01Filter {
public static void main(String[] args) {
File file = new File("c:\\abc");
getAllFile(file);
}
public static void getAllFile(File dir){
File[] files = dir.listFiles(new FileFilterImpl());//传递过滤器对象
for (File f : files) {
if(f.isDirectory()){
getAllFile(f);
}else{
System.out.println(f);
}
}
}
}
方法2(ラムダ式の実装)
前のレッスンを確認して統合するために、ラムダ式が使用されます。方法2は、インターフェイス実装クラスをラムダ式に変更します。
public class Demo02Test {
public static void main(String[] args) {
File file = new File("G:\\test");
getTargetFile(file);
}
public static void getTargetFile(File dir){
//采用匿名内部类的方式
File [] files =null;
/*files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory()||pathname.getName().toLowerCase().endsWith("java");
}
});
//采用lambda表达式。
files=dir.listFiles((File pathname)->{
return pathname.isDirectory()||pathname.getName().toLowerCase().endsWith("java");
});*/
//优化lambda 表达式
files=dir.listFiles((pathname)-> pathname.isDirectory()||pathname.getName().toLowerCase().endsWith("txt"));
for (File file :
files) {
if (file.isDirectory()){
getTargetFile(file);
}else {
System.out.println(file);
}
}
}
}
テスト結果:
これまでのところ、ファイルの関連操作を確認しました。次の章では、ファイルフローに関連する操作を確認します。