学习Java,你需要知道这些——输入输出流(一)

输入输出流的概念

预定义的I/O流类

  • 从流的方向划分
    输入流
    输出流
  • 从流的分工划分
    节点流
    处理流
  • 从流的内容划分
    面向字符的流
    面向字节的流

java.io包的顶级层次结构

  • 面向字符的流:专门用于字符数据
  • 面向字节的流:用于一般目的

面向字符的流

  • 源或目标通常是文本文件;
  • 实现内部格式和文本文件中的外部格式之间转换
    • 内部格式: 16-bit char数据类型
    • 外部格式:
      1.UTF(Universal character set Transformation Format) :很多人称之为"Universal Text Format"
      2.包括ASCII码及非ASCII码字符,比如:斯拉夫(Cyrillic)字符, 希腊字符,亚洲字符等

面向字符的抽象流类-- Reader和Writer

  • java.io包中所有字符流的抽象超类。
  • Reader提供了输入字符的API。
  • Writer提供了输出字符的API。
  • 它们的子类又可分为两大类
    • 节点流:从数据源读入数据或往目的地写出数据;
    • 处理流:对数据执行某种处理。
  • 多数程序使用这两个抽象类的一系列子类来读入/写出文本信息
    例如FileReader/FileWriter用来读/写文本文件。

标准输入输出流对象

  • System类的静态成员变量
  • 包括
    • System.in : InputStream类型的 ,代表标准输入流,默认状态对应
      于键盘输入。
    • System.out : PrintStream类型的,代表标准输出流,默认状态对应
      于显示器输出。
    • System.err : PrintStream类型的,代表标准错误信息输出流,默认
      状态对应于显示器输出。

按类型输入/输出数据

  • printf方法
System.out.printf("%-12s is %2d long", name, l);
System.out.printf("value = %2.2F",value); 

%n是平台无关的换行标志。

  • Scanner
Scanner s = new Scanner(System.in);
int n = s.nextInt();

口还有下列方法: nextByte(),nextDouble(),nextFloat(),nextInt(),
nextLine(),nextLong(),nextShort().

写文本文件

创建文件并写入若干行文本

import java.io.*;
class FileWriterTester {
    public static void main ( String[] args ) throws IOException {
        //main方法中声明抛出IO异常
        String fileName = "Hello.txt";
        FileWriter writer = new FileWriter( fileName );
        writer.write( "Hello!\n");
        writer.write( "This is my first text file,\n" );
        writer.write( "You can see how this is done.\n" ); 
        writer.write("输入一行中文也可以\n");
        writer.close();
    }
}

运行结果:
在这里插入图片描述但是有时候换行那里会出现问题,后面可以用BufferedWriter解决。

写入文本文件,处理IO异常

import java.io.*;
class FileWriterTester {
    public static void main ( String[] args){
    String fileName = "Hello.txt" ;
    try { //将所有IO操作放入try块中
            FileWriter writer = new FileWriter( fileName ,true );
            writer.write( "Hello!\n");
            writer.write( "This is my first text file,\n" );
            writer.write( "You can see how this is done. \n" );
            writer.write("输入-行中文也可以\n");
            writer.close();
        }
        catch (IOException iox) { System.out.println("Problem writing" + fileName ); }
    }
}

说明:
运行此程序,会发现在原文件内容后面又追加了重复的内容,这就是将构
造方法的第二个参数设为true的效果。
如果将文件属性改为只读属性,再运行本程序,就会出现IO错误,程序将
转入catch块中,给出出错信息。

写入文本文件使用BufferedWriter

BufferedWriter类

  • FileWriter和BufferedWriter类都用于输出字符流,包含的方法几乎完
    全一样,但BufferedWriter多提供了一个newLine()方法用于换行。
  • 不同的系统对文字的换行方法不同。newLine()方法可以输出在当前
    计算机上正确的换行符。
import java.io.*;
class BufferedWriterTest {

    public static void main ( String[] args ) throws IOException {
        String fileName = "newHello.txt" ;
        BufferedWriter out = new BufferedWriter(new FileWriter( fileName ));
        out.write( "Hello!" );
        out.newLine() ;
        out.write( "This is another text file using BufferedWriter," );
        out.newLine();;
        out.write( "So I can use a common way to start a newline" );
        out.close();
    }
}

运行结果:
在这里插入图片描述

读文本文件

读文本文件相关的类

  • FileReader类
    从文本文件中读取字符。
    继承自Reader抽象类的子类InputStreamReader。
  • BufferedReader
    读文本文件的缓冲器类。
    具有readLine(方法,可以对换行符进行鉴别,一行一行地读取输入流中的内容。
    继承自 Reader。

读文本文件并显示

import java.io.*;
class BufferedReaderTester {
    public static void main ( String[] args ){
        String fileName = "Hello.txt" ,line;
        try{
            BufferedReader in = new BufferedReader(new FileReader( fileName ));
            line = in.readLine(); //读取一 行内容
            while ( line!= null) {
                System.out.println( line ); line = in.readLine();
            }
            in.close();
            }
        catch ( IOException iox ) { System.out.println("Problem reading " + fileName ); }
    }
}

运行结果:
在这里插入图片描述

  • 运行该程序,屏幕上将逐行显示出Hello.txt文件中的内容。
  • FileReader对象:创建后将打开文件,如果文件不存在,会抛出一个IOException
  • BufferedReader类的readLine(方法:从一个面向字符的输入流中读取一行文本。如果其中不再有数据,返回null
  • Reader类的read(方法:也可用来判别文件结束。该方法返回的一个表示某个字符的int型整数,如果读到文件末尾,返回-1。据此,可修改本例中的读文件部分:
int c;
while((c=in.read()!= -1) System.out.print((char)c);
  • close()方法:为了操作系统可以更为有效地利用有限的资源,应该在读取完毕后,调用该方法.
原创文章 477 获赞 911 访问量 28万+

猜你喜欢

转载自blog.csdn.net/qq_41505957/article/details/106079818