Java基础 -> 标准输入(in)输出(out)流{键盘输入数据到文件},打印流

模块 java.base
软件包 java.lang
Class System
java.lang.Object
java.lang.System

public final class System extends Object

System类包含几个有用的类字段和方法。 它无法实例化。 System类提供的设施包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 加载文件和库的方法; 以及用于快速复制阵列的一部分的实用方法。

static PrintStream	err			“标准”错误输出流。
static InputStream	in			“标准”输入流。
static PrintStream	out			“标准”输出流。

从键盘输入数据到文件例子

 /**
     * 键盘输入数据到文件中;
     *      输出到文件用到两种方式: 1.一行一行输出.readLine();
     *                      2.一个一个输出.read();
     */
    public static void main(String[] args) {
        BufferedWriter bufferedWriter = null;
        BufferedReader bufferedReader = null;

        try {
            //新建的输出(内存输出到文件),不能放到循环里面,否则会一直循环创建新的文件.
            //选择流(输入还是输出),这里是字符流(字节流)
            FileWriter fileWriter = new FileWriter("Test921复制文件.txt");
            //选择了一个对应的处理流,使流不会阻塞(勉强理解,不然有时候好像会写不进去要调用flush())
            bufferedWriter = new BufferedWriter(fileWriter);
            //循环键盘输入
            while (true) {
                //从键盘输入(键盘输入到内存),System.in
                InputStreamReader inputStreamReader = new InputStreamReader(System.in);
                bufferedReader = new BufferedReader(inputStreamReader);
                //读一行字符串
                //方式一;使用读取一行的.readLine();
//                String s = bufferedReader.readLine();
//                if ("esc".equals(s)) {
//                    break;
//                }else  bufferedWriter.write(s + '\n');//手动加换行

                //方式二:使用一个一个读取的.read(chars);
                char[] chars = new char[1024];
                int len;
                len = bufferedReader.read(chars);
                //需要将chars转化为string类型的输出,再与给定的值比较
                //且数组大小很大,只输入esc不一定输出的值就是esc(123esc),需要判断是否包含
                if (String.copyValueOf(chars).contains("esc")) {
                    //需要手动停止程序,最后才会有数据进入文件
                    break;
                }else bufferedWriter.write(chars,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

附加:System.out:System.setOut()的使用

很方便,使用System.setOut()可以不使用输出的Filewriter等,直接输出到文件,不用新建输出流

 /**
     * System.out:System.setOut()的使用
     *
     */
    @Test
    public void test5() throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("Test921.txt"),"gbk"));
        String s ;
        //PrintStream out = System.out;//这一行与下面的System.setOut(out);对应
        //加这一行就是直接是输出到控制台,后面的所有System.out.println都是输出到对应的文件里
        System.setOut(new PrintStream("Test920.txt"));
        /**
         *  这一行取消注释就是取消输出到文件,与PrintStream out = System.out配合使用
         *         1.需要先保存标准的输出流,2.再调System.setOut(out),才会继续输出到控制台
         *         如果不保存,之后的所有System.out都会默认为new PrintStream("Test920.txt")
         *         直接System.setOut(System.out);是不行的
         */
        //System.setOut(out);

//        读取文件内容,基本相当于System.setIn()
//        如果需要键盘输入,就直接标准的System.In,需要文件输入就如同最前面的
//        BufferedReader bufferedReader;既需要键盘又需要文件时只需用
//        InputStream in = System.in;
//        System.setIn(in);解除标准输入
        while ((s = bufferedReader.readLine())!= null){
            System.out.println(s + '\t');
        }
        bufferedReader.close();
    }

附加:键盘输入和文件输入同时使用,使用System.setIn()

	使用System.setIn()不能转换编码,有时候似乎不方便
public static void main(String[] args) throws Exception {
        BufferedWriter bufferedWriter = null;
        BufferedReader bufferedReader = null;
        bufferedWriter = new BufferedWriter(new FileWriter("Test921复制文件.txt"));
        //这里是键盘输入		循环键盘输入
        while (true) {
            bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            char[] chars = new char[1024];
            int len;
            len = bufferedReader.read(chars);
            if (String.copyValueOf(chars).contains("esc")) {
                break;
            } else bufferedWriter.write(chars, 0, len);
                        //方式二;使用读取一行的.readLine();
//           String s = bufferedReader.readLine();
//           if ("esc".equals(s)) {
//                 break;
//           }else  bufferedWriter.write(s + '\n');//手动加换行
        }

        //这里开始读取文件,不使用键盘输入
        //方式一:不使用System.setIn()
        bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("Test921.txt"), "gbk"));
        String s;
        System.setOut(new PrintStream("Test920.txt"));
        while ((s = bufferedReader.readLine()) != null) {
            System.out.println(s + '\t');
        }
        //方式二:使用System.setIn(fileInputStream);
        //缺点;出现乱码好像没法,因为不能选择编码,例如我现在这个是gbk的不是utf-8的会乱码
//        FileInputStream fileInputStream = new FileInputStream("Test921.txt");
//        System.setIn(fileInputStream);
//        System.setOut(new PrintStream("Test920.txt"));
//        byte[] bytes = new byte[1024];
//        int len;
//        while ((len = fileInputStream.read(bytes)) != -1){
//            //string的构造器将byte数组转化为string
//            System.out.println(new String(bytes));
//        }
        bufferedReader.close();
        bufferedWriter.close();

    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值