JAVA面接シリーズ(3)バイトストリームと文字ストリーム

9099 ワード

Javaにはいくつかのタイプのストリームがありますか?
答え:バイトストリームと文字ストリーム.バイトストリームはInputStream、OutputStream、文字ストリームはReader、Writerに継承されます.Java.ioパッケージには他にも多くのストリームがあり、主にパフォーマンスと使い勝手を向上させるためです.JavaのI/Oについて注意しなければならないのは2つの対称性(入力と出力の対称性、バイトと文字の対称性);2つ目は、2つのデザインモード(アダプタモードとインテリアモード)です.また、JavaのストリームがC#と異なるのは、次元が1つの方向しかないことです.
面接問題-プログラミングによるファイルコピー
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public final class MyUtil {

    private MyUtil() {
        throw new AssertionError();
    }

    public static void fileCopy(String source, String target) throws IOException {
        try (InputStream in = new FileInputStream(source)) {
            try (OutputStream out = new FileOutputStream(target)) {
                byte[] buffer = new byte[4096];
                int bytesToRead;
                while((bytesToRead = in.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesToRead);
                }
            }
        }
    }

    public static void fileCopyNIO(String source, String target) throws IOException {
        try (FileInputStream in = new FileInputStream(source)) {
            try (FileOutputStream out = new FileOutputStream(target)) {
                FileChannel inChannel = in.getChannel();
                FileChannel outChannel = out.getChannel();
                ByteBuffer buffer = ByteBuffer.allocate(4096);
                while(inChannel.read(buffer) != -1) {
                    buffer.flip();
                    outChannel.write(buffer);
                    buffer.clear();
                }
            }
        }
    }
}

注意:Java 7のTWRは、TWRを使用するとfinallyで外部リソースを解放することなく、コードをより優雅にすることができます.
メソッドを書き、ファイル名と文字列を入力し、このファイルに表示された文字列の回数を統計します.
import java.io.BufferedReader;
import java.io.FileReader;

public final class MyUtil {

    //                                (     )
    private MyUtil() {
        throw new AssertionError();
    }

    /**
     *                  
     * 
     * @param filename     
     * @param word    
     * @return             
     */
    public static int countWordInFile(String filename, String word) {
        int counter = 0;
        try (FileReader fr = new FileReader(filename)) {
            try (BufferedReader br = new BufferedReader(fr)) {
                String line = null;
                while ((line = br.readLine()) != null) {
                    int index = -1;
                    while (line.length() >= word.length() && (index = line.indexOf(word)) >= 0) {
                        counter++;
                        line = line.substring(index + word.length());
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return counter;
    }

}

Javaコードでディレクトリの下にあるすべてのファイルをリストするにはどうすればいいですか?
現在のフォルダの下にあるファイルのみをリストする必要がある場合、コードは次のとおりです.
import java.io.File;

class Test12 {

    public static void main(String[] args) {
        File f = new File("/Users/Hao/Downloads");
        for(File temp : f.listFiles()) {
            if(temp.isFile()) {
                System.out.println(temp.getName());
            }
        }
    }
}

フォルダを展開し続ける必要がある場合、コードは次のとおりです.
import java.io.File;

class Test12 {

    public static void main(String[] args) {
        showDirectory(new File("/Users/Hao/Downloads"));
    }

    public static void showDirectory(File f) {
        _walkDirectory(f, 0);
    }

    private static void _walkDirectory(File f, int level) {
        if(f.isDirectory()) {
            for(File temp : f.listFiles()) {
                _walkDirectory(temp, level + 1);
            }
        }
        else {
            for(int i = 0; i < level - 1; i++) {
                System.out.print("\t");
            }
            System.out.println(f.getName());
        }
    }
}

Java 7ではNIO.2のAPIを用いて同様のことを行うことができ,コードは以下のようになる.
class ShowFileTest {

    public static void main(String[] args) throws IOException {
        Path initPath = Paths.get("/Users/Hao/Downloads");
        Files.walkFileTree(initPath, new SimpleFileVisitor() {

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
                    throws IOException {
                System.out.println(file.getFileName().toString());
                return FileVisitResult.CONTINUE;
            }

        });
    }
}