Java 高级编程-输入与输出支持

学习阿里云大学零基础学Java系列 Java高级编程

1. 打印流

如果现在要想通过程序实现内容的输出,核心的本质一定要依靠OutputStream类完成,但是OutputStream类有一个最大的缺点,这个类中的数据输出操作功能有限(public void write(byte[] b) throws IOException),所有的数据一定要转为字节数组后才可输出,于是假设说现在项目里可能输出long、double、Date,再这样的情况下就必须将这些数据变为字节的形式来处理,这样的处理一定是非常麻烦,所以在开发之中为了避免此类重复操作,往往会由开发者自行定义一些功能类来简化输出过程。

范例:打印流设计思想

package IOKnowledge;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
 *
 * @author sunlh
 *
 */
class PrintUtil implements AutoCloseable {// 实现一些常用数据的输出
     private OutputStream output;// 不管现在如何进行输出操作,核心使用的就是OutputStream
     public PrintUtil(OutputStream output) {// 由外部来决定输出的位置
           this.output = output;
     }

     public void print(long num) {
           this.print(String.valueOf(num));
     }

     public void println(long num) {
           this.println(String.valueOf(num));
     }

     public void print(String str) {// 输出字符串
           try {
                this.output.write(str.getBytes());// 输出
           } catch (IOException e) {
                e.printStackTrace();
           }
     }

     public void println(String str) {
           this.print(str + "\r\n");
     }
     @Override
     public void close() throws Exception {
           this.output.close();
     }


}
public class Test {

     public static void main(String[] args) throws Exception {
           File file = new File("d:" + File.separator + "hello" + File.separator + "mldn.txt");// 定义操作文件
           PrintUtil pu = new PrintUtil(new FileOutputStream(file));
           pu.println("姓名,小强子");
           pu.print("年龄,");
           pu.println(78);
           pu.close();
     }

}

在整个操作过程中打印流的设计思想的本质在于:提高已有类的功能,例如:OutputStream是唯一可以实现输出的操作标准来,所以应该以其为核心根本,但是这个类输出的操作功能有限,所以不方便进行输出各个数据类型,那么就为它做出了一层包装,所以此时采用的设计思想就是“装饰设计模式”。

但是既然所有的开发者都已经发现了原始中的OutputStream功能的不足,设计者也一定可以发现,所以为了解决输出问题,在java.io包里面提供有打印流:PrintStream、PrintWriter

PrintStreamPrintWriter
public class PrintStream extends FilterOutputStream implements Appendable, Closeablepublic class PrintWriter extends Writer
JDK1.0JDK1.1
public PrintStream(OutputStream out)public PrintWriter(OutputStream out)public PrintWriter(Writer out)

这里写图片描述

下面使用PrintWriter来实现数据的输出操作
范例:数据输出

package IOKnowledge;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
/**
 *
 * @author sunlh
 *
 */
public class Test {

     public static void main(String[] args) throws Exception {
           File file = new File("d:" + File.separator + "hello" + File.separator + "mldn.txt");// 定义操作文件
           PrintWriter pu = new PrintWriter(new FileOutputStream(file));
           pu.println("姓名,小强");
           pu.print("年龄,");
           pu.println(78);
           pu.close();
     }

}

从JDK1.5开始PrintWriter类里面追加有格式化输出的操作支持:public PrintWriter printf(String format, Object… args)

     public static void main(String[] args) throws Exception {
           File file = new File("d:" + File.separator + "hello" + File.separator + "mldn.txt");// 定义操作文件
           PrintWriter pu = new PrintWriter(new FileOutputStream(file));
           String name = "小强子";
           int age = 78;
           double salary = 72343.23423;
           pu.printf("姓名:%s,年龄:%d,收入:%9.2f", name, age, salary);
           pu.close();
     }

比起直接使用OutputStream类,使用PrintWriter、PrintStream类的处理操作会更加简单。以后只要是程序进行内容输出的时候全部使用打印流。

2. System类对IO的支持

System类是一个系统类,而且是一个从头到尾一直都在使用的系统类,而在这个系统类中提供有三个常量:

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

范例:观察输出

     public static void main(String[] args) throws Exception {
           try {
                Integer.parseInt("a");                
           } catch (Exception e) {
                System.out.println(e);
                System.err.println(e);
           }
     }
java.lang.NumberFormatException: For input string: "a"
java.lang.NumberFormatException: For input string: "a"(红色)

System.out和System.err都是同一种类型的,如果现在使用的是Eclipse则在进行使用System.err输出的时候会使用红色字体,而在使用System.out的时候使用黑色字体。

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

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

范例:修改System.err的输出位置

     public static void main(String[] args) throws Exception {
           System.setErr(new PrintStream(new FileOutputStream(new File("d:" + File.separator + "hello" + File.separator + "mldn.txt"))));
           try {
                Integer.parseInt("a");                
           } catch (Exception e) {
                System.out.println(e);
                System.err.println(e);// 输出到文件里
           }
     }

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

     public static void main(String[] args) throws Exception {
           InputStream input = System.in;// 此时的输入流为键盘输入
           System.out.println("请输入信息:");
           byte [] data = new byte[1024];
           int len = input.read(data);
           System.out.println("输入内容为:" + new String(data, 0, len));
     }

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

3. BufferedReader缓存输入流

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

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

这里写图片描述
下面将利用这个类实现键盘输入数据的标准化定义

     public static void main(String[] args) throws IOException {
           BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
           System.out.println("请输入信息:");
           String msg = input.readLine();// 接收输入信息
           System.out.println("输入内容为:" + msg);
     }

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

范例:接收整型输入并且验证

     public static void main(String[] args) throws IOException {
           BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
           System.out.println("请输入您的年龄:");
           String msg = input.readLine();// 接收输入信息
           if(msg.matches("\\d{1,3}")) {// 是否由数字所组成
                int age = Integer.parseInt(msg);
                System.out.println("年龄为:" + age);
           } else {
                System.out.println("请输入正确的年龄数字");
           }

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

4. Scanner扫描流

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

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

范例:使用Scanner实现键盘数据输入

     public static void main(String[] args) throws Exception{
           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 static void main(String[] args) throws Exception{
           Scanner scanner = new Scanner(System.in);
           System.out.println("请输入信息:");
           if(scanner.hasNext()) {// 判断是否有输入,直接空格不算输入
                String msg = scanner.next();// 直接获取输入内容
                System.out.println("输入的内容:" + msg);
           }
           scanner.close();
     }

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

范例:输入一个人的生日

     public static void main(String[] args) throws Exception{
           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类读取要方便

如果要读取一个文本文件中的所有内容信息,如果采用的是InputStream类,那么就必须依靠内存输出流进行临时数据保存,还需要判断的内容是否需要换行,最后输出。

范例:使用Scanner读取

     public static void main(String[] args) throws Exception{
           Scanner scanner = new Scanner(new File("d:" + File.separator + "hello" + File.separator + "mldn.txt"));
           System.out.println("请输入生日日期:");
           scanner.useDelimiter("\n");// 设置读取分隔符(换行符)
           while (scanner.hasNext()) {
                System.out.println(scanner.next());
           }
           scanner.close();
     }

在开发过程中,如果程序需要输出数据一定使用打印流,输入数据一定使用ScannerBufferedReader)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java是一门流行的编程语言,具有强大的输入输出(I/O)和多线程支持。在本文中,我们将讨论如何在Java中进行输入输出和多线程编程输入输出Java中进行输入输出通常需要使用Java I/O库。这个库包含了各种类和方法,可以帮助我们进行文件读写、网络通信、控制台输入输出等操作。 文件读写 在Java中,我们可以使用FileInputStream和FileOutputStream类来读写文件。这两个类都是字节流类,可以读写任何类型的文件。 读取文件示例: ```java try (FileInputStream fileInputStream = new FileInputStream("input.txt")) { int data; while ((data = fileInputStream.read()) != -1) { System.out.print((char) data); } } catch (IOException e) { e.printStackTrace(); } ``` 写入文件示例: ```java try (FileOutputStream fileOutputStream = new FileOutputStream("output.txt")) { String data = "Hello world!"; fileOutputStream.write(data.getBytes()); } catch (IOException e) { e.printStackTrace(); } ``` 控制台输入输出Java中,我们可以使用System.in和System.out来进行控制台输入输出。这两个对象都是标准输入输出流,可以帮助我们读取用户输入,以及输出结果给用户。 读取用户输入示例: ```java Scanner scanner = new Scanner(System.in); System.out.print("Enter your name: "); String name = scanner.nextLine(); System.out.println("Hello, " + name + "!"); ``` 输出结果给用户示例: ```java System.out.println("Hello, world!"); ``` 多线程 在Java中,我们可以通过创建线程来实现多线程编程Java提供了Thread类,可以帮助我们创建一个新的线程,并且启动它去执行某个任务。 创建线程示例: ```java Thread thread = new Thread(() -> { // 线程任务 }); thread.start(); ``` 在Java中,也可以使用ExecutorService和Future接口来实现更高级的多线程编程。ExecutorService可以帮助我们管理线程池,并且执行任务。Future接口可以帮助我们获取线程执行的结果。 创建线程池示例: ```java ExecutorService executorService = Executors.newFixedThreadPool(10); ``` 执行任务示例: ```java Future<String> future = executorService.submit(() -> { // 线程任务 return "Hello, world!"; }); String result = future.get(); ``` 以上是Java输入输出和多线程编程的简单介绍。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值