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();
}
}