System类对IO的支持(系统输入、系统输出)

1.系统输入

系统输出一共有两个常量:out、err,并且这两个常量表示的都是PrintStream类的对象。

  1. out输出的是希望用户能看到的内容
  2. err输出的是不希望用户看到的内容

System.err只是作为一个保留的属性而存在,现在几乎用不到。唯一可能用到的就是System.out。

eg:

public class Test {   
    public static void main(String[] args) throws Exception {     
        try {          
            Integer.parseInt("abc") ;    
        } catch (Exception e) {     
            System.out.println(e) ;       
            System.err.println(e) ;  
        }  
    }
}

由于System.out是PrintStream的实例化对象,而PrintStream又是OutputStream的子类,所以可以直接使用 System.out直接为OutputStream实例化,这个时候的OutputStream输出的位置将变为屏幕。

eg:使用System.out为OutputStream实例化

import java.io.OutputStream;

public class Test {
    public static void main(String[] args) throws Exception {
        OutputStream out = System.out ;
        out.write("大家好".getBytes());
    }
}

抽象类不同的子类针对于同一方法有不同的实现,而用户调用的时候核心参考的是抽象类。

2.系统输入

System.in对应的类型是InputStream,而这种输入流指的是由用户通过键盘进行输入(用户输入)。java本身并没有 直接的用户输入处理,如果要想实现这种操作,必须使用java.io的模式来完成。

eg:利用InputStream实现数据输入


import java.io.InputStream;

public class Test {
    public static void main(String[] args) throws Exception {
        InputStream in = System.in ;
        byte[] data = new byte[1024] ;
        System.out.print("请输入信息:");
        int temp = in.read(data) ;
        // 数据读取到字节数组中
        System.out.println("输出内容为 :" +new String(data,0,temp)) ;
    }
}

现在发现当用户输入数据的时候程序需要暂停执行,也就是程序进入了阻塞状态。直到用户输入完成(按下回车), 程序才能继续向下执行。

以上的程序本身有一个致命的问题,核心点在于:

开辟的字节数组长度固定,如果现在输入的长度超过了字节数组长 度,那么只能够接收部分数据。

这个时候是由于一次读取不完所造成的问题,所以此时好的做法是引入内存操作流来进行控制,这些数据先保存在内存流中而后一次取出。

eg:引入内存流。

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class Test {
    public static void main(String[] args) throws Exception {
        InputStream in = System.in ;
        ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
        byte[] data = new byte[10] ;
        System.out.print("请输入信息:");
        int temp = 0 ;
        while((temp = in.read(data)) != -1) {
            bos.write(data,0,temp) ;
            // 保存数据到内存输出流中
            // 这里面需要用户判断是否输入结束
            if (temp < data.length) {
                break ;
            }
        }
        in.close() ;
        bos.close() ;
        System.out.println("输出内容为 :" +new String(bos.toByteArray())) ;
    }
}

如果要想在IO中进行中文的处理,最好的做法是将所有输入的数据保存在一起再处理,这样才可以保证不出现乱码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
io流简介 File createNewFile() File.pathSwparator 与系统有关的路径分隔符,它被表示为一个字符串 windows为 分号";" File.pathSwparatorChar 与系统有关的路径分割符,它被表示为一个字符 File.separator 与系统有关的 默认名称分隔符 ,它被表示为一个字符串 windows为 斜杠"\" File.separatorChar 与系统有关的 默认名称分隔符 ,它被表示为一个字符 获取目录和文件 File.list() 返回String[] File.listFile() 返回File[] 字节流 FileInputStream("文件路径") FileOutputStream(File file) 逐个读取 存入字节read() write() close() 字符流 FileReader("文件路径") FileWriter("文件路径") 逐个读取 存入字符read() 无缓冲的输入输出流每一次读写都肯引发磁盘的读写操作,占用大量资源 缓冲流(装饰器模式) 缓冲流是一种装饰器 可实现按规定字符数、按行等方式的高效读写 缓冲区的大写可指定 也可使用默认大小 FileInputStream fis = new FileInputStream("Car.java"); 装饰器 in = new 装饰器(fis); BufferedReader in = new BufferedReader(new FileReader("Car.java")); BufferedWriter out = new BufferedWriter(new FileReader("Car2.java")); 利用缓冲流读取的时候是逐行读取 存入字符串 in.readLine() out.write("") out.newLine()写入分行符 需要即时写入的时候 调用 flush()方法,手动刷新缓冲流 注意 关闭流的时候也会自动刷新缓冲流中的数据 字节流转换为字符流 InputStreamReader(System.in) 适配器模式的使用 其意图是将一个的接口转换成客户希望的另外一个接口 数据流 简单来说就是容许字节流直接操作基本数据型和字符串 DataInputStream out = new DataInputStream(new BufferedInputStream(new FileInputStream("数据存储文件路径"))) DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("数据存储文件路径")))
序列化是将对象转换为字节流的过程,以便在网络上传输或保存到文件中。Java提供了ObjectOutputStream和ObjectInputStream来实现对象的序列化和反序列化。 要序列化一个对象,需要满足以下条件: 1. 对象必须实现Serializable接口。 2. 对象的所有成员变量都必须是可序列化的,即它们必须是基本型、String型或实现了Serializable接口的对象。 3. 对象的所有成员变量都必须是私有的。 下面是一个示例代码,演示如何序列化一个对象: ``` import java.io.*; public class SerializationDemo { public static void main(String[] args) { // 创建一个Person对象 Person person = new Person("张三", 20); try { // 创建一个ObjectOutputStream对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser")); // 序列化对象 oos.writeObject(person); // 关闭流 oos.close(); System.out.println("对象已经被序列化到person.ser文件中。"); } catch (IOException e) { e.printStackTrace(); } } } class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } ``` 在上面的代码中,我们创建了一个Person对象,并将其序列化到person.ser文件中。要序列化一个对象,我们需要创建一个ObjectOutputStream对象,并调用其writeObject()方法将对象写入文件中。注意,Person必须实现Serializable接口,否则会抛出NotSerializableException异常。 反序列化一个对象也很简单,只需要创建一个ObjectInputStream对象,并调用其readObject()方法即可。下面是一个示例代码: ``` import java.io.*; public class DeserializationDemo { public static void main(String[] args) { try { // 创建一个ObjectInputStream对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser")); // 反序列化对象 Person person = (Person) ois.readObject(); // 关闭流 ois.close(); System.out.println("从person.ser文件中反序列化出的对象为:" + person.getName() + "," + person.getAge() + "岁。"); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们创建了一个ObjectInputStream对象,并调用其readObject()方法从person.ser文件中反序列化出一个Person对象。注意,我们需要将返回的Object对象强制转换为Person型。如果文件中的对象型与强制转换的型不一致,会抛出ClassCastException异常。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CUNZ_1997

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值