JAVA---数据输入与输出

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均为静态成员常量,因此,可以通过“类名,成员变量点成员常量名”形式来直接调用它们。

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()方法用于确认是否还有下一行数据,此方法主要针对文件,用于判断是否到达文件结尾处。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会尽力回答你的问题。首先,让我们来看一下字节数据输入输出基础知识。 在Java中,我们可以使用InputStream和OutputStream类来处理字节数据输入输出。其中,InputStream是一个抽象类,表示输入字节流的基本类。OutputStream同样是一个抽象类,表示输出字节流的基本类。这两个类都是Java IO库中的基本类,它们提供了一系列的方法来处理字节数据输入输出。 下面是一个简单的例子,演示如何使用InputStream和OutputStream类来读取和写入字节数据: ```java import java.io.*; public class ByteIOExample { public static void main(String[] args) { byte[] data = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33}; // 写入字节数据到文件 try (OutputStream output = new FileOutputStream("hello.txt")) { output.write(data); } catch (IOException e) { e.printStackTrace(); } // 从文件中读取字节数据 try (InputStream input = new FileInputStream("hello.txt")) { byte[] buffer = new byte[1024]; int length = input.read(buffer); String message = new String(buffer, 0, length); System.out.println(message); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个例子中,我们首先创建了一个byte数组,表示要写入文件的数据。然后,使用OutputStream类将数据写入到名为"hello.txt"的文件中。接着,使用InputStream类从文件中读取数据,并将其存储在一个byte数组中。最后,将这个byte数组转换成字符串并打印出来。 希望这个例子能够帮助你更好地理解字节数据输入输出。如果你有任何其他问题,可以继续问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

尘 关

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

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

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

打赏作者

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

抵扣说明:

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

余额充值