JAVA---数据输入与输出

news/2024/6/18 21:17:21 标签: java, jvm, 开发语言

1.什么是输入流与输出流

  在Java中,把所有的输入和输出都当作流(stream)来处理。流是按一定顺序排列的数据集合。例如,从键盘或文件输入的数据,向显示器或文件输出的数据等都可以看作是一个个的数据流。
输入数据时,一个程序打开数据源上的一个流(文件或内存等),然后按照顺序输入这个流中的数据,这样的流称为输入流,如图7-1上图所示。
输出数据时,一个程序可以打开一个目的地的流(如文件或内存等),然后按顺序向这
个目的地输出数据,这样的流称为输出流,如图7-1下图所示。
输入流和输出流的方向还可以这样理解,它们是以程序为基准的。向程序中输入数据的流定义为输入流,从程序输出数据的流称为输出流。因此,我们把从输入流向程序中输入数据称为读数据(read),而把从程序中将数据输出到输出流称为写数据(write)。

2.字节流和字符流

       输入/输出流根据处理数据的类型不同可分为两类:一类是字节流,另一类是字符流。字节流表示按照字节的形式读/写数据,字符流表示按照字符的形式读/写数据。
       在Java中,抽象类InputStream和OutputStream及其派生子类用来处理字节流的输入与输出,抽象类Reader 和Writer 及其派生子类用来处理字符流的输入与输出。
        另外,系统还提供了用于标准输入、输出的System 类,以及用来解析各种类型数据(如整数、浮点数、字符串等)的 Scanner 类。
       请注意,虽然Java 从本质上来说将输入/输出流分成了字节流和字符流,但这并不是说,我们只能以这两种最低级的形式来输入/输出数据。事实上,我们可以通过调用很多类的构造方法和成员方法来输入/输出各种类型的数据。 

 3.标准输入/输出类System


     无论是调试程序,还是在程序调试成功交付工作时,我们经常需要通过键盘向程序输入一些数据,以及通过显示器显示一些程序运行的状态信息或数据处理结果。因此,基本的输入/输出功能使用非常频繁。为此,Java 专门提供了一个System类来帮助用户处理基本的输入/输出问题。对于这一点,我们在前面的程序中已多次使用,如下面的语句所示:
 //声明一个Scanner 类对象inStatus,其内容来自键盘输入(System.in)
Scanner inStatus = new Scanner(System.in);
//输出字符串和变量值
System.out.println("纳税人需要缴纳的税额为"+ tax+"¥");
         System 类属于java.lang 包,它提供的一些方法可用来终止当前正在运行的Java虚拟机,运行垃圾回收器,以及获取指定的环境变量值等。
         System 类有两个非常有用的静态成员常量in和out,分别表示标准输入设备(一般为键盘)和标准输出设备(一般为显示器),其作用如下:
① in:声明形式为public static final InputStream in。使用时,我们可以利用System.in.read()方法从键盘读入字节数据。不过,System.in更经常被作为其他对象的参数,表示将键盘输入的数据作为其数据源。例如,Scanner in=new Scanner(System.in);语句表示创建一个Scanner 类对象in,其内容来自键盘输入的数据.

②out:声明形式为public static final PrintStream out。使用时,我们可以利用System.out.print("字符串");语句和System.out.println("字符串");语句在显示器上示各种类型的数据,如字符串、数值型数据、布尔型数据、字符数据等,并且前者表示在当前行显示数据,后者表示在当前行显示数据并换行。
温馨提示
PrintStream 类为字节输出流类OutputStream 的子类 FilterOutputStrean的子类,利用其printO方法和println方法可输出各种类型的数据。由于in和out均为静态成员常量,因此,可以通过“类名,成员变量点成员常量名”形式来直接调用它们。

java">package com.sxt;

import java.io.IOException;


public class Text {
    public static void main(String[] args ) throws IOException{
   int b;
   System.out.println("请输入数据:");
   while((char)(b=System.in.read())!='N')
   {
       System.out.print((char)b);
   }
    }}

由上述代码可得出:(1)系统遇到read()方法后将等待,只有在换行时才逐个读入字符,这在Java中称为阻塞,实际上就是等待。

(2)由read()方法是逐个读入字符,因此,他无法识别用户输入的整数、浮点数、字符串等。

(3)由read()方法是按字符读取字符,因此,他只能识别单字节的字符(如英文字母、数字和英文标点符号等),无法识别双字节的汉字。

4.字符与字符输入/输出流类

        抽象类InputStream和OutputStream及其派生类子类用来处理字节流的输入与输出,抽象类Reader和Wrtite及其派生子类用来处理字符流的输入与输出。

 (1)字节输入流类 InputStream

 字节输入流类(InputStream)用于以字节形式从数据源中读取数据,它是所有字节输入流类的父类。此外,由于该类是抽象类,因而不能被实例化,即无法基于该类创建对象。
        抽象类虽然无法用于创建对象,但可用于声明对象,例如,在System类中,系统利用public static final InputStream in;语句声明了一个InputStream类对象in。
           在上述代码中,我们使用了System.in.read()语句来读取从键盘输入的数据。此时的in 已被实例化为InputStream 类的某个子类的对象,因此,此时调用的readO方法实际上是某个子类的read()方法。
InputStream 类的主要派生子类包括:FileInputStream(按字节读取文件中的数据)、BufferedInputStream(将按字节形式读入的数据保存到缓冲区)等。

其层次结构如下:

InputStream
ByteArrayInputStream

 FileInputStream

 FilterInputStream
            BufferedInputStream

            DatalnputStream 

            LineNumberInputStream

           PushbackInputStream

 ObjectInputStream

PipedInputStream

SequenceInputStream

StringBufferInputStream

  在上面的各子类中,BuffereInputStream是一个非常有用的类,他可以缓冲输入的数据,从而提高数据输入效率。其构造方法为:public BufferedInputStream(InputStream in)。其中,in可以是文件输入流或键盘输入流。该类有如下几个主要方法:
public void close():关闭此输入流并释放与该流关联的所有系统资源。
public abstract int read():从输入流中读取数据的下一个字节。其返回值为整数,
如果到达流的末尾,则返回-1。
    从键盘输入数据时(即数据源为System.in),read()方法被阻塞,直至按回车键。
    如果按【Ctrl+Z】组合键,表示输入流结束,此时该行输入的内容均被忽略,read()返回值为-1。
     读取文件时(此时的数据源为FileInputStream类对象),如果到达文件结尾,readO方法返回值为-1。
public int read(byte[] b):将从输入流读取的内容存储在字节数组b中。其返回值为读入的字节数。如果因为已经到达流末尾而不再有数据可用,则返回-1。

(2)字节输出流类OutputStream

字符输出流类 OutputStream用于字节形式将数据写入目的地,其主要派生子类包括:FileOutputStream(将数据写入文件)、PrintStream(用于输出各种类型的数据,如整数、浮点数、字符、字符串、布尔值等,其主要方法有print()和println())等。其层次结构如下:
OutputStream
   ByteArrayOutputStream
   FileOutputStream
   FilterOutputStream
        BufferedOutputStream
        DataOutputStream
        PrintStream
  ObjectOutputStream
  PipedOutputStream
         在上面的各子类中,BufferedOutputStream是一个非常有用的类,它可以缓冲输出的数据,从而提高数据输出效率。该类的构造方法如下:
public BufferedOutputStream(OutputStream out)
它表示创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
-> public void close():关闭此缓冲输出流并释放与此流有关的所有系统资源。

-> public void write(int b):将指定的字节写入此缓冲输出流。

->public void write(byte[] b): 将b.length字节写入此缓冲输出流。 

(3).字符输入流类Reader

     字符输入流类 Reader 用于以字符形式从数据源中读取数据,其主要派生子类包括InputStreamReader(读取字节数据并将其解码为字符)、FileReader(用来读取字符文件的内容)、BufferedReader(从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取)等。其层次结构如下:
Reader
      BufferedReader
            LineNumberReader

     CharArrayReader 

     FilterReader
           PushbackReader

     InputStreamReader 

           FileReader 

           PipedReader 

          StringReader
其中,InputStreamReader 类的构造方法为:public InputStreamReader(InputStream in);
其主要成员方法有:
-> public void close0:关闭该流并释放与之关联的所有资源。
-> public int readO:读取单个字符。
-> public int read(charü cbuf):将字符读入数组。返回值为读取的字符数。如果已到达流的末尾,则返回-1。

BufferedReader 类的构造方法为:public BufferedReader(Reader in),它用于创建一个使用默认大小输入缓冲区的缓冲字符输入流。其成员方法与InputStreamReader 类似,只是新增了一个readLineO方法,其声明方式和作用如下:
->public String readLine():读取一个文本行。通过下列字符之一即可认为某行已终止:换行("\n)、回车(\r)或回车后直接跟着换行。其返回值为包含该行内容的字符串,并且不包含任何行终止符。如果已到达流末尾,则返回null。

(4) 字符输出流类Writer
 

         字符输出流类Writer 用于以字符的形式将数据写入目的地。Writer类是所有字符输出
流类的父类,其主要派生子类包括OutputStreamWriter(将字符以字节形式写入输出流)、
 FileWriter(将字符数据写入文件)、BufferedWriter(将字符数据写入缓冲区)、PrintWrie
(格式化输出字符数据)等子类。其层次结构如下:
Writer
       Buffered Writer

       CharArray Writer

        FilterWriter
        OutputStream Writer
              File Writer Piped Writer
PrintWriter
String Writer
       其中,OutputStreamWriter 类的构造方法为:public OutputStreamWriter(OutputStream out);

其主要成员方法包括:
——>public void close():关闭此流
——>public void write(int c):写入单个字符。
——>public void write(char|] cbuf):写入字符数组。
——>public void write(String str):写入字符串。
BufferedWriter 类的构造方法为public BufferedWriter(Writer out),其主要成员方法包
——>public void close0:关闭此流。
——>public void write(int c):写入单个字符。
——>public void write(char[]cbuf:写入字符数组。
——>public void write(String str):写入字符串。
——>public void newLine0:写入一个行分隔符。

5.使用Scanner类输入各种类型的数据

      Scanner 类是一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器,我
们在前面的很多程序中都用到了它。Scanner 类表示一个文本扫描器,他可以扫描从键盘输入的字符。

所谓正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。


该类有一组重要的方法,其意义如下:
nextByte()、nextShort()、nextInt()、nextLong()、nextFloat()、nextDouble()、nextBoolean()等方法分别用来读取字节、短整型、整型、长整型、浮点数、双精度浮点数和布尔值等。
hasNextByte()、hasNextShort()、hasNextIntO、hasNextLong()、hasNextFloat()、hasNextDouble()、hasNextBoolean()等方法分别用来判断要读入的数据是否是字节、短整型、整型、长整型、浮点数、双精度浮点数或布尔值等。
nextLine()方法用于读取一行数据,如果已用nextByte()、nextShort()等方法读取数据,此方法用于读取当前行中后续数据;hasNextLine()方法用于确认是否还有下一行数据,此方法主要针对文件,用于判断是否到达文件结尾处。

如果在一行输入多个数据,可以用空格分隔各数据 。


http://www.niftyadmin.cn/n/177917.html

相关文章

网络编程套接字( TCP协议通讯流程)

目录 1、绑定失败问题 2、TCP协议通讯流程 三次握手的过程 数据传输的过程 四次挥手的过程 TCP和UDP对比 1、绑定失败问题 当我们测试网络代码时,先将服务端绑定8080端口运行,然后运行客户端,并让客户端连接当前服务器: 当有客户…

摸着OpenAI过河,百度文心一言能否“重拳出击”?

“文心一言”对标ChatGPT,饱含争议。文心一言作为一款语言大模型,并提出了自己在技术对就业的影响方面的理解,现阶段正处于摸着OpenAI过河的时候,路该如何走? GPT-4太惊艳,压力给到文心一言 这段时间&…

Android生成签名证书(.keystore)

命令行方式: 首先安装JRE环境,然后使用JRE自带的keytool命令生成签名证书。 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore -alias是证书别名,建议使用英文字母和数字 -keystore是…

Spring入门之反射机制

Spring相关概念1.1初始Spring在这一节,主要通过以下两个点来了解下Spring:1.1.1Spring家族官网:https://spring.io,从官网我们可以大概了解到:Spring能做什么:用以开发web、微服务以及分布式系统等光这三块就已经占了JavaEE开发的九成多。Spr…

时不我待,拥抱趋势,开源IM项目OpenIM技术简介

坚持开源 开源的理念是基于共享、合作和透明的原则,将软件、代码等知识资源公开并允许他人使用、修改和重新分发,以促进创新和发展。以下是几个开源的优点: 创新:开源可以促进创新,通过让其他人改进或扩展已有的代码…

【思维模型】五分钟了解<金字塔原理>,为什么学习金字塔原理?什么是金字塔原理?如何应用金字塔原理?

【思维模型】五分钟了解<金字塔原理>,为什么学习金字塔原理?什么是金字塔原理?如何应用金字塔原理?1. 为什么学习金字塔原理?2. 什么是金字塔原理?3. 如何应用金字塔原理&#xff1f…

kotlin基础知识复习

kotlin基础知识复习range 范围 从哪里 到哪里Double转Int与类型初始化尽量使用内联函数inlineList和set集合防止空指针和数据获取list去重Mapfield 关键字学习防范竞太条件构造函数运算符重载枚举泛型复习泛型约束中缀表达式重命名了解KT的变换函数KT单例类似java的双重校验效果…

JVM(八)低延迟垃圾收集器

衡量垃圾收集器的三项最重要的指标是:内存占用(Footprint)、吞吐量(Throughput)和延迟(Latency),三者共同构成了一个“不可能三角”。三者总体的表现会随技术进步而越来越好&#xf…