JAVA输入输出流(IO)

本文详细介绍了Java中的IO流概念,包括字节流和字符流的区别,以及如何在程序中实现这两种流的转换。同时,文章提供了具体的代码示例来展示如何使用InputStreamReader和OutputStreamWriter在字节流和字符流之间进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流的概念

     流是一个很抽象的概念,当程序需要读写数据时,就会开启一个通向数据源的流,这个数据源可以是文件、内存或者网络连接,在程序读写数据过程中,数据就像在“流”动一样。

     由上图可知,流代表经过管道流通的数据。为了进行数据的输入和输出操作,JAVA把不同的输入和输出源(例如键盘、文件和网络连接等)抽象表述为流。

     按流向不同,可以分为输入流和输出流。按处理单位不同,可以分为字节流(在数据读取和写入时以字节为单位)和字符流(在数据读取和写入时以字符为单位)。
     字节流包括InputStream和OutputStream两个基础类。字符流包括Reader和Writter两个基础类。


字节与字符的概念

     字节:通过网络传输信息(或硬盘、内存中存储信息)的单位。字节是用于计量存储容量和传输容量的一种计量单位,1个字节等于8个二进制位。是一个很具体的存储空间。
     字符:人们使用的记号,符号。 如'1', '中', 'a', '$', '¥', ……
    
     下面是几种不同编码方式中字符和字节的对应关系:
     ①、ASCII码中,一个英文字母(不分大小写)占1个字节的空间,一个中文汉字占2个字节。
     ②、Unicode编码中,一个英文和一个中文都占2个字节。
     ③、UTF-8编码中,一个英文字符1个字节,一个中文字符3个字节


字节流和字符流之间的转化
     
     一般在处理图片、多媒体等原始字节信息时,选用字符流,如FileInputStream/FileOutputStream等。如果文件包含的是字符信息,应选用字符流,例如FileReader、FileWriter等。在字符流和字节流相互转化时下需要注意编码问题,如果使用错误的编码格式,流信息将会失真,出现乱码。
     InputStreamReader是字节流通向字符流的桥梁,可以完成字节流向字符流的转化。它使用指定的字符集读取字节并将其解码为字符。为提高效率,可以考虑使用BufferedReader包装InputStreamReader。

package test.io;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
      public static void main(String[] args) {
            FileInputStream fis = null;
            InputStreamReader isr = null;
            BufferedReader br = null;

            try {
                  fis = new FileInputStream("D:\\1.txt");
                  isr = new InputStreamReader(fis, "UTF-16LE");
                  br = new BufferedReader(isr);
                  String content = br.readLine();
                  System.out.println(isr.getEncoding() + ";" +content);
            } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }

            if(br != null){
                  try {
                        br.close();
                  } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                  }
            }

            if(isr != null){
                  try {
                        isr.close();
                  } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                  }
            }

            if(fis != null){
                  try {
                        fis.close();
                  } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                  }
            }
      }
}
     OutputStreamWriter是字符流通向字节流的桥梁,可以完成字符流到字节流的转化。通过BufferedWriter对OutputStreamWriter进行包装,提高效率。

private void writeFile() {
            // TODO Auto-generated method stub
            FileOutputStream fos = null;
            OutputStreamWriter osw = null;
            BufferedWriter bw = null;

            try {
                  fos = new FileOutputStream("D:\\1.txt");
                  osw = new OutputStreamWriter(fos, "UTF-8");
                  bw = new BufferedWriter(osw);

                  bw.write("测试输入输出流。");
            } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }finally{
                  try{
                        if(bw != null){
                              bw.close();
                        }

                        if(osw != null){
                              osw.close();
                        }

                        if(fos != null){
                              fos.close();
                        }
                  }catch (IOException e) {
                        // TODO: handle exception
                  }

            }

      }

     使用close()方法会默认执行flush()方法,将缓冲区信息输出。





















     
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值