import java.io.*;
import java.util.Arrays;
public class Ans {
public static void main(String[] args) throws IOException {
//test1();
// test2();
//test3();
test4();
}
static void test0() throws IOException {
//字符流是java 1.1中引入的新IO類,用以改進之前的字節流,增加了國際標準支持Unicode
BufferedReader fr = new BufferedReader(new FileReader("test"));
BufferedReader sr = new BufferedReader(new StringReader("test\nasad"));
System.out.println(sr.readLine());
//注意雖然BufferedInputStream是實現了FilterInputStream,但是BufferReader並不是來自FilterReader,主要原因或許是BufferReader不需要使用FilterReader提供的特性,而是需要自己的特性,因此在製作新IO時就將這兩個分開了,而目前FilterReader的子類只有PushbackReader。
System.out.println(fr.readLine());
File path = new File("test");
System.out.println(path.length());
FileReader f = new FileReader("test");
BufferedReader fr2 = new BufferedReader(f);
BufferedReader fr3 = new BufferedReader(fr2);
char []all = new char[(int)path.length()];
all[all.length-1] = '$';
f.read(); //如果裝飾器中的一環使用了read,readline後面的都會被影響,所以當沒有把握的時候最好因此創建完所有的裝飾,不要留下其他局部變量,否則容易造成奇怪的問題
System.out.println(f.read(all));
System.out.println(Arrays.toString(all));
all = new char[(int)path.length()]; //另外,如果在相應位置沒有讀入數據,則不會修改當前的這個字符,這樣很容易造成誤解,以爲讀入了數據,比如如果註釋掉這一行和下一行就會引起這樣的誤會
all[all.length-1] = '$';
fr2.read(all);
System.out.println(Arrays.toString(all));
all = new char[(int)path.length()];
all[all.length-1] = '$';
fr3.read(all);
System.out.println(Arrays.toString(all));
}
static void test1() throws IOException {
String s = "adfafafadaaf";
ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes());
DataInputStream dis = new DataInputStream(bais); //我們可以用DataInputStream來包裝ByteArrayInputStream
while (dis.available()!=0) //在使用ByteArrayInputStream時所有字符都會正常返回,所以只能用available判斷還有多少個可讀字符
System.out.print((char)dis.read()); //但是這個available對於不同的流不同,它的意思是沒有阻塞情況下可以最多讀幾個,比如對於基類InputStream這個函數總是返回0
}
static void test2() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("test"));
BufferedWriter bw = new BufferedWriter(new FileWriter("test2"));
String s;
while ((s = br.readLine())!=null)
bw.write(s);
bw.close(); //使用close或者flush刷新緩衝區,否則結果無法輸出
BufferedWriter bw2 = new BufferedWriter(new FileWriter("test2"));
for (int i =0;;++i) {
if (i%1000==0) bw2.write("a"); //緩衝區滿了也會輸出
}
}
static void test3() throws IOException {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("test")));
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("test")));
dos.writeDouble(3.0);
dos.writeInt(19);
dos.close(); //這裏要關閉寫的流,不然沒法讀
//System.out.println(dis.readDouble()); //使用這種方法可以在任何平臺上讀取一組輸入,這非常重要
//System.out.println(dis.readInt());
System.out.println(dis.readInt()); //但是如果搞錯了順序會得到非常奇葩的結果
System.out.println(dis.readDouble());
}
static void test4() throws IOException {
RandomAccessFile raf = new RandomAccessFile("test2","rw"); //RandomAccessFile是一個可讀可寫的類,而且可以隨機訪問,但是它無法使用裝飾器,與其他的IO類隔絕
raf.writeDouble(11);
raf.writeDouble(2);
raf.writeDouble(33);
raf.writeDouble(41);
raf.close();
RandomAccessFile raf2 = new RandomAccessFile("test2","r");
for (int i = 0;i<4;++i) System.out.println(raf2.readDouble());
raf2.close();
raf = new RandomAccessFile("test2","rw");
raf.seek(2*8); //這裏設置訪問位置
raf.writeDouble(113);
raf.close();
raf2 = new RandomAccessFile("test2","r");
for (int i = 0;i<4;++i) System.out.println(raf2.readDouble());
raf2.close();
}
}