我对流的理解是:源到目的地的轨迹,所以流的一端是数据源(输入流)或者接收器(输出流),另一端是 io中的某个类;这里说明下, Scanner 不是 io类,这个从它的导入包就可以看出( java.util.Scanner) ,我的理解 Scanner是个方便输入操作的工具类;
我把流分为 4类,字节级,字符级,对象级,其他;
一,字节级
1.文件输入 /输出流( FileInputStream/FileOutputStream)建立文件到本程序的流
2字节数组输入 /输出流( ByteArrayInputStream/ByteArrayOutputStream)
3.数据输入 /输出流( DataInputStream /DataOutputStream)
4缓存输入输出流( BufferedInputStream/BufferedOutputStream)
5回退输入字节流( PushbackInputStream)
6格式化输出流( PrintStream)
二,字符级
1.FileReader/FileWriter
2.BufferedReader/BufferedWriter
3CharArrayReader/CharArrayWriter
4PushbackReader
5PrintWriter
三,对象级
ObjectInputStream/ObjectOutputStream
四,其他
StreamTokenizer
File
RandomAccessFile
另外还有三个标准系统流: System.in( InputStream类型), System.out( PrintStream类型), System.err( InputStram类型);
System.out 和 System.err已经被封装成了PrintStream对象,因此具有强大的输出功能,而System.in却仍然是原始的InputStream,需要在使用是进行封装;
可以用 setIn(in) ,setOut(out),setErr(err)重新指定参数流为对应标准流
附上acm中常用的测试文件写法(linux)
// FileInputStream fin = new FileInputStream("/home/bird/workspace/ACM/in.txt");
// PrintStream fout = new PrintStream("/home/bird/workspace/ACM/out.txt");
// System.setIn(fin);
// System.setOut(fout);
以下是读单个字符的方法
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for(int i=0; i<2; ++i) {
char ch = (char) in.read();
System.out.println(ch);
}
//先打个框架,具体实例有时间了,再来添加