java中实现输入输出的操作就需要IO流
I/O流按照流的方向分为输入流(InputStream)和输出流(OutputStream)

I/O流按照数据单位
·字符流 操作的数据单元是8位的字节。InputStream、OutputStream作为抽象基类。
·字节流 操作的数据单元是字符。以Writer、Reader作为抽象基类。
很明显可以看出来字符流只能处理纯文本的数据,而字符流则任意文件都可以处理

IO流中的三类数据源
基于磁盘文件:FileInputStream、FileOutputSteam、FileReader、FileWriter
基于内存:ByteArrayInputStream ByteArrayOutputStream(ps:字节数组都是在内存中产生)
基于网络:SocketInputStream、SocketOutputStream(ps:网络通信时传输数据)
帅

主要介绍字节流
1.InputStream、OutputStream
其是所有字节输入输出类的超类

system.in :println()就是java.io.PrintStream类里的一个方法,它的作用是向控制台输出信息。因为System.out是java.io.PrintStream类的实例的引用,所以可以通过 System.out.println(); 来调用此方法。

2.InputStreamReader
InputStreamReader类是从字节流到字符流的桥接器:它使用指定的字符集读取字节并将它们解码为字符。 它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。 为了实现字节到字符的有效转换,可以从基础流中提取比满足当前读取操作所需的更多字节。为了获得最高效率,请考虑在BufferedReader中包InputStreamReader

3.InputReader PrintWrite 是字符打印和输出流
4.BufferedReader 字符缓冲输入流

//模板
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

class Main{
    public static void main(String[] args) throws IOException {
//        public static InputReader in = new InputReader(System.in); 输入是重点
//        public static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); 直接将字节流变成字符流
        InputReader in =new InputReader(System.in);
        PrintWriter out = new PrintWriter(System.out);
        String aString = in.next();
        System.out.println(aString.length());
        out.flush();
        out.close();
    }

    static class InputReader {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public InputReader(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public double nextDouble() {
            return Double.parseDouble(next());
        }

    }
}