Java IO编程 - 输入与输出支持

输入与输出支持

1、打印流

如果要实现内容的输出,核心的本质一定要依靠OutputStream类完成,但是OutputStream_类有一个最大的缺点,这个类的输出操作功能有限

使用PrintWriter实现数据的输出操作

public class JavaDemo {
   public static void main(String[] args) throws IOException {
      File file = new File("E:" + File.separator + "666.txt");
      PrintWriter out = new PrintWriter(new FileOutputStream(file));
      out.println("姓名:linlin");
      out.print("年龄:");
      out.println("18");
      out.close();
   }
}

从JDK1.5开始PrintWriter追加了格式化输出的支持

public class JavaDemo {
   public static void main(String[] args) throws IOException {
      File file = new File("E:" + File.separator + "666.txt");
      PrintWriter out = new PrintWriter(new FileOutputStream(file));
      String name = "linlin";
      int age = 18;
      out.printf("姓名:%s、年龄:%d" , name , age);
      out.close();
   }
}

比起直接使用OutputStream类,那么使用PrintWriter、PrintStream类的处理会更加简单。

2、System类对IO的支持

System类是一个系统类,在这个系统类之中实际上提供有三个常量:

  • 标准输出(显示器):public static final PrintStream out
  • 错误输出:public static final PrintStream err
  • 标准输入:public static final InputStream in

System.out和System.err都是同一种类型的

最早设置两个输出的操作的目的是System.out是输出希望用户看到的信息,而System.err输出的是不希望用的看见的信息,如果有需要也可以修改输出的位置

  • 修改out的输出位置:public static void setOut(PrintStream out)
  • 修改err的输出位置:public static void setErr(printStream err)

在 System类里面还提供有一个in的常量,而这个常量对应的是标准输入设备键盘的输入处理,可以实现键盘数据输入

public class JavaDemo {
   public static void main(String[] args) throws IOException {
      InputStream in = System.in;
      System.out.println("输入信息:");
      byte[] data = new byte[1024];
      int len = in.read(data);
      System.out.println("输出信息:" + new String(data , 0 , len));
   }
}

但是这样的键盘输入处理本身是有缺陷的:如果你现在的长度不足,那么只能够接收部分数据,所以这个输入就有可能进行重复的输入流数据接收,而且在接收的时候还有可能会牵扯到输入中文的情况,如果对于中文的处理不当,则也有可能造成乱码问题

3、BufferedReader缓冲输入流

BufferedReader类提供的是一个缓冲字符输入流的概念,也就是说利用BufferedReader类可以很好的解决输入流数据的读取问题,这个类是在最初的时候提供的最完善的数据输入的处理(JDK1.5之前,JDK 1.5之后除了一个功能更强大的类代替此类),这个类中提供有一个重要的方法:

  • 读取一行数据:public String readLine()throws IOException

实现键盘的标准输入

public class JavaDemo {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      System.out.println("输入信息:");
      String msg = in.readLine();
      System.out.println("输出信息:" + msg);
   }
}

在以后实际的开发过程之中经常会遇见输入数据的情况,而所有输入数据的类型都是通过String描述的,这样就方便了接收者进行各种处理

接收整形输入并且验证

public class JavaDemo {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      System.out.println("输入三位数字:");
      String msg = in.readLine();
      if (msg.matches("\\d{1,3}")){
         int age = Integer.parseInt(msg);
         System.out.println("数字为:" + age);
      } else {
         System.out.println("输入错误");
      }
   }
}

对于现代的.Java开发由键盘输入数据的情况并不多了,但是做为一些基础的逻辑训练还是可以使用键盘输入数据的而键盘输入数据的标准做法就是上面的实现操作,实际开发中所有输入的数据全部都是字符串,这样方便用户验证与进行字符串的复杂处理

4、Scanner扫描流

java.util.Scanner是从JDK1.5之后追加的一个程序类,其主要的目的是为了解决输入流的访问问题的,可以理解为 BufferedReader的替代功能类,Scanner类有如下几种常用方法

  • 构造:public Scanner(inputStream source)
  • 判断是否有数据:public boolean hasNext()
  • 取出数据:public String next()
  • 设置分隔符:public Scanner userDelimiter(String pattern)

使用Scanner实现键盘数据输入

public class JavaDemo {
   public static void main(String[] args) throws IOException {
      Scanner scanner = new Scanner(System.in);
      System.out.println("请输出年龄:");
      if (scanner.hasNextInt()){ //判断是否有整数输出
         int age = scanner.nextInt();    //直接获取数字
         System.out.println("年龄为:" + age);
      }else {
         System.out.println("请输出数字!!!");
      }
      scanner.close();
   }
}

此时可以明显的感受到Scanner的处理会更加的简单

输入字符串

public class JavaDemo {
   public static void main(String[] args) throws IOException {
      Scanner scanner = new Scanner(System.in);
      System.out.println("请输入信息:");
      if (scanner.hasNext()){
         String msg = scanner.next();
         System.out.println("信息为:" + msg);
      }
      scanner.close();
   }
}

使用Scanner输入数据还有一个最大的特点是可以直接利用正则进行验证判断

输入生日

public class JavaDemo {
   public static void main(String[] args) throws IOException, ParseException {
      Scanner scanner = new Scanner(System.in);
      System.out.println("请输入生日:");
      if (scanner.hasNext("\\d{4}-\\d{2}-\\d{2}")){
         String msg = scanner.next("\\d{4}-\\d{2}-\\d{2}");
         System.out.println("信息为:" + new SimpleDateFormat("yyyy-MM-dd").parse(msg));
      }
      scanner.close();
   }
}

现在可以发现Scanner的整体设计要好于BufferedReader,而且要比直接使用InputStream类读取要方便

使用Scanner读取文件

public class JavaDemo {
   public static void main(String[] args) throws IOException, ParseException {
      Scanner scanner = new Scanner(new File("E:" + File.separator + "666.txt"));
      while (scanner.hasNext()) {
         System.out.println(scanner.next());
      }
      scanner.close();
   }
}

在以后的开发过程之中,如果程序需要输出数据一定使用打印流,输入数据使用Scanner (BufferedReader)

下一篇:对象序列化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MyRedScarf

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值