【java基础】13.I/O:流2

时间:2023-02-17 16:17:48
1.标准输入输出
System.out是标准的输出流。默认情况下,它是一个控制台。System.in是标准输入,默认情况下,它指的是键盘。System.err指的是标准错误流,它默认是控制台。然而,这些流可以重定向到任何兼容的输入/输出设备
System.in 是InputStream的对象;System.out和System.err是PrintStream的对象。它们都是字节流,尽管它们用来读写外设的字符。如果愿意,你可以用基于字符的流来包装它们
 
class StreamDemo{
    public static void main(String[] args) throws IOException{
      //获取键盘录入对象
      InputStream in = System.in;
      //将字节流对象转换为字符流对象,使用转换流InputStreamReader
      InputStreamReader isr = new InputStreamReader(in);
      //为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
      BufferedReader br = new BufferedReader(isr);
      String line = null;
      while((line=br.readLine())!=null){
          System.out.println(line.toUpperCase());
       }
        br.close();
    }
}
//键盘输入的最常见写法
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));


可以使用InputStream类的read()和skip(longn)等方法来从输入流获得数据。read()从输入流中读一个字节,skip(longn)在输入流中跳过n个字节。
可以使用PrintStream类的print()和println()等方法来输出数据
 
2.文件的读写:
所有的文件都是字节形式的
两个最常用的流类是FileInputStream和FileOutputStream,它们生成与文件链接的字节流。 为打开文件,你只需创建这些类中某一个类的一个对象,在构造方法中以参数形式指定文件的名称
•当你对文件的操作结束后,需要调用close()来关闭文件。
 
2.1FIleInputStream(文件输入流)
FileInputStream 类创建一个能从文件读取字节的InputStream 类,它的两个常用的构造方法如下
–FileInputStream(String filepath)
–FileInputStream(File fileObj)
–它们都能引发FileNotFoundException异常。这里,filepath 是文件的全称路径,fileObj是描述该文件的File对象。
为读文件,可以使用在FileInputStream中定义的read()方法,该方法每次被调用,它仅从文件中读取一个字节并将该字节以整数形式返回。当读到文件尾时
2.2FileOutputStream(文件输出流)
•FileOutputStream 创建了一个可以向文件写入字节的类OutputStream,它常用的构造方法如下
–FileOutputStream(String filePath)FileOutputStream(File fileObj)FileOutputStream(String filePath, boolean append)
•它们可以引发IOException或SecurityException异常。这里filePath是文件的全称路径,fileObj是描述该文件的File对象。如果append为true,文件以追加模式打开,即新写入的字节将附加在文件的末尾,而不是从头开始
向文件中写数据,需用FileOutputStream定义的write()方法。它的最简单形式如下–该方法按照byteval指定的数向文件写入字节。尽管byteval作为整数声明,但仅低8位字节可以写入文件
2.3ByteArrayInputStream/3ByteArrayOutputStream(字节数组输入/输出流)
ByteArrayInputStream是把字节数组当成源的输入流。该类有两个构造方法,每个构造方法需要一个字节数组提供数据源
–ByteArrayInputStream(byte array[ ])
–ByteArrayInputStream(byte array[ ], intstart, intnumBytes)
 
–writeTo:将此字节数组输出流的全部内容写入到指定的输出流参数中
–reset:将此字节数组输出流的count字段重置为零,从而丢弃输出流中目前已累积的所有输出。通过重新使用已分配的缓冲区空间,可以再次使用该输出流
2.4缓冲字节流:是过滤流
对于字节流,缓冲流(buffered stream),通过把内存缓冲区连到输入/输出流扩展一个过滤流类。该缓冲区允许Java对多个字节同时进行输入/输出操作,提高了程序性能。因为缓冲区可用,所以可以跳过、标记和重新设置流。缓冲字节流类是BufferedInputStream 和BufferedOutputStream。PushbackInputStream 也可实现缓冲流
BufferedInputStream
BufferedInputStream 有两个构造方法
–BufferedInputStream(InputStream inputStream)
–BufferedInputStream(InputStream inputStream, int bufSize)
–第一种形式创建BufferedInputStream流对象并为以后的使用保存InputStream参数in,并创建一个内部缓冲区数组来保存输入数据。
–第二种形式用指定的缓冲区大小size创建BufferedInputStream流对象,并为以后的使用保存InputStream参数in。
 
DataIntputStream/DataOutputStream过滤流
由于DataOutputStream写入的为二进制信息,所以我们无法使用记事本查看内容
注意:读取的顺序一定要与写入的顺序完全一致,否则会发生错误
  
使用数据文件流的一般步骤
–(1)建立字节文件流对象;
–(2)基于字节文件流对象建立数据文件流对象;
–(3)用流对象的方法对基本类型的数据进行输入/输出。

流操作的基本规律:
   a.明确源和目的:
        源:输入流,InputStream,Reader
目的:输出流,OutputStream,Writer
   b.操作的数据是否是纯文本
是:字符流
否:字节流
    c.当体系明确后,再明确要使用哪个具体的对象。
通过设备来进行区分
源设备:内存,硬盘,键盘
目标设备:内存,硬盘,控制台

eg:1.将一个文本文件的数据储存到另一个文件中,复制文件
先分析
源:因为是源,故使用读取流,InputStream,Reader,是否操作文本文件,是,则可选择Reader,这样体系就明确了。
接下来要明确使用该体系中的那个对象
  明确设备:硬盘,上一个文件
Reader体系中可以操作文件的对象 FileReader
是否需要提高效率,是,则加入缓冲区,即BufferedReader
BufferedReader br = new  BufferedReader(new FileReader("a.txt")); 
 
目的:OutputStream,Writer,是否文本文件,是则用Writer
设备:硬盘,一个文件
Writer体系中可以操作文件的对象 FileWriter
是否需要提高效率,是,则加入缓冲区,即Buffered Writer
Buffered Writer bw = new Buffered Writer(new File Writer("b.txt")); 

 eg:2.将键盘录入的数据保存在一个文件中
源和目的都存在,则分别分析
源:InputStream,Reader,是否纯文本,是,则选择Reader。
  明确设备:键盘 对应的对象是System.in
不是选择了Reader吗?System.in对应的不是字节流吗?为了操作键盘文本的数据方便,转成字符流按字符串操作是最方便的,所以既然明确 了Reader,则将System.in转换为Reader。
运用Reader体系中的InputStreamReader
InputStreamReader isr = newInputStreamReader(System.in);
是否需要提高效率,是,则加入缓冲区,即BufferedReader
BufferedReader br = new BufferedReader(isr); 
 
目的:OutputStream,Writer,是否文本文件,是则用Writer
设备:硬盘,一个文件 FileWriter
FileWriter fw = newFileWriter("c.txt");
是否需要提高效率,是,则加入缓冲区,即BufferedWriter
BufferedWriter bw = new BufferedWriter(fw); 
 
 此处需注意:
若想把录入的数据按照指定的编码表(utf-8)将数据存在文件中
目的:OutputStream,Writer,是否文本文件,是则用Writer
设备:硬盘,一个文件 FileWriter
但 FileWriter使用的是默认编码表GBK,存储时,需要指定编码格式,指定的编码表只有转换流可以指定。要使用OutputStreamWriter
而该转换流对象要接收一个字节输出流,且还可以操作文件的字节输出流,即 FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"utf-8" );
是否需要提高效率,是,则加入缓冲区,即BufferedWriter
BufferedWriter bw = new BufferedWriter( osw); 
 
通常,涉及到字符编码转换时,需要用到转换流。是字符和字节之间的桥梁。
 
 Properties是hashtable的子类
具备map集合的特点,其存储的键值对都是字符串,
是集合和IO技术相结合的集合容器;
可以用于键值对形式的配置文件。
 
 
 
    注:此文档为学习圣思园风中叶教程结合自身学习所记录。