Java中有幾種類型的流?


字節流和字符流。字節流繼承於InputStream、OutputStream,字符流繼承於Reader、Writer。在java.io 包中還有許多其他的流,主要是為了提高性能和使用方便。關於Java的I/O需要注意的有兩點:一是兩種對稱性(輸入和輸出的對稱性,字節和字符的對稱性);二是兩種設計模式(適配器模式和裝潢模式)。另外Java中的流不同於C#的是它只有一個維度一個方向。

面試題 - 編程實現文件拷貝。(這個題目在筆試的時候經常出現,下面的代碼給出了兩種實現方案)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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中釋放外部資源 ,從而讓代碼更加優雅。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM