Java中IO(三、转换流与打印流)

本文详细探讨了Java中的转换流和打印流。转换流InputStreamReader作为从字节流到字符流的桥梁,通过指定字符集解码字节。通常结合BufferedReader使用以提高效率。打印流PrintStream提供了方便的数据打印功能,并可用于文件复制操作。
摘要由CSDN通过智能技术生成

InputStreamReader是从字节流到字符流的桥梁,它读取字节并使用指定的字符集将其解码为字符,通常将InputStreamReader包装在BufferedReader中使用。PrintStream为另一个输出流添加了功能,即方便地打印各种数据。



一、转换流


/*
* 转换流
*   输入流:InputStreamReader,将字节输入流转换成字符输入流
*   输出流:OutputStreamWriter,将字节输出流转换成字符输出流
*   特点:字节流向字符流转换
*
* 构造方法:
*   InputStreamReader(InputStream in): 创建一个使用默认字符集的对象
*   InputStreamReader(InputStream in, Charset cs):创建使用给定字符集的对象
*   InputStreamReader(InputStream in, CharsetDecoder dec):创建使用给定字符集解码器的对象
*   InputStreamReader(InputStream in, String charsetName):创建使用指定字符集的对象
*
* 常用方法:
*   void close(): 关闭流释放资源
*   String getEncoding(): 返回此流使用的字符编码的名称
*   int read(): 读取的单个字符
*   int read(char[] cbuf, int offset, int length): 将字符读入数组中的一部分
*   boolean ready(): 判断此流是否已经准备好用于读取
* */

public class _01_InputStreamReader {

    public static void main(String[] args) {
        try (
                // 创建字节输入流对象
                FileInputStream fis = new FileInputStream(
          "./SE/src/com/tianl/IO/_01_FileInputStream/_03_IO_FileInputStream.java");
                // 创建转换流对象,把字节流传入,转换为字符流
                InputStreamReader isr = new InputStreamReader(fis);
                // 创建字符缓冲流,把转换流传入
                BufferedReader br = new BufferedReader(isr)
        ){
            // 读取一行
            System.out.println(br.readLine());

            // 循环读取
            String temp = null;
            while ((temp= br.readLine())!=null){
                System.out.println(temp);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

二、打印流


/*
* 打印流:打印流是输出最方便的类
*   字节打印流:PrintStream,是OutputStream的子类。把一个输出流的实例传递到打印流之后
*       可以更加方便的输出,相当于把输出流重新包装了一下
*       该类中的print()方法被重载了很多次,根据参数的不同有不同的输出
*   字符打印流:PrintWriter
*
* 标准输入/输出
*   java的标准输入/输出分别通过System.in和System.out来表示,默认代表键盘和显示器
*   当程序通过System.in类获得输入时,时通过键盘获取。
*   当程序通过System.out类执行输出时,总是输出到屏幕。
*
* System类中提供了三个重定向标准输入/输出方法
*   static void setErr(PrintStream err),重定向”标准“错误输出流
*   static void setIn(PrintStream in),重定向”标准“输入流
*   static void setOut(PrintStream out),重定向”标准“输出流
* */

public class _01_PrintStream {

    public static void main(String[] args) throws FileNotFoundException {
        // 标准打印流,打印到控制台
        System.out.println("今天天气好吗");

        // 保存标准打印流对象
        PrintStream control = System.out;
        System.out.println(control);

        // 创建输出流
        FileOutputStream fos = new FileOutputStream("D:/log.txt");
        // 创建打印流,并传入输出流
        PrintStream ps = new PrintStream(fos);
        // 调用打印方法,打印到指定文件
        ps.println("日志系统111");

        // 设置System中的out
        System.setOut(ps);
        // 设置System中的out后,在使用打印语句,会打印到指定文件
        // 设置打印到指定文件后,如何在设置打印到控制台?
        // 先保存标准输出流对象,指定打印到文件使用结束后可根据标准输出流对象重新设置
        System.out.println("hahahhhahh----------");

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        System.out.println("test方法开始执行:"+simpleDateFormat.format(new Date()));
        test();
        System.out.println("test方法执行结束:"+simpleDateFormat.format(new Date()));

        // 重设置会控制台输出
        System.setOut(control);
        System.out.println("重新设置完成");
    }

    public static void test(){
        System.out.println("test方法执行!");
    }
}

三、使用打印流完成文件复制


/*
* 使用打印流完成文件复制
*   实例:将D:/111.txt文件 复制到 D:JavaTest/111.txt
*   1 复制:就只输入和输出
*   2 先获取数据
*   3 再输出数据
* */
public class _02_PrintStreamTest {

    public static void main(String[] args) {
        try (
                FileInputStream fis = new FileInputStream("D:/111.txt");
                FileOutputStream fos = new FileOutputStream("D:/JavaTest/111.txt");
                PrintStream ps = new PrintStream(fos);
                ){
            byte[] bytes = new byte[1024];
            int temp;
            while ((temp=fis.read(bytes))!=-1){
                ps.println(new String(bytes,0,temp));
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
扩展:非打印流实现 压缩包复制
/*
 * D盘下一个压缩包test.zip
 * 使用程序复制到另一个文件夹D:/JavaTest
 * 非打印流实现
 *   1 复制:就只输入和输出
 *   2 先获取数据
 *   3 在输出数据
 * */
public class CopyTest2 {

    public static void main(String[] args) {
        try (
                FileInputStream fis = new FileInputStream("D:/test1.zip");
                BufferedInputStream bis = new BufferedInputStream(fis);
                FileOutputStream fos = new FileOutputStream("D:/JavaTest/test1.zip");
                BufferedOutputStream bos = new BufferedOutputStream(fos)
                ){
            byte[] bytes = new byte[1024];
            int temp;
            while ((temp= bis.read(bytes))!=-1){
                bos.write(bytes,0,temp);
            }
            bos.flush();
            System.out.println("完成");
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
扩展:zip流实现
/*
* D盘下一个压缩包test.zip,压缩包中默认无下级目录
* 使用程序复制到另一个文件夹D:/JavaTest
* 非打印流实现
*   1 复制:就只输入和输出
*   2 先获取数据
*   3 在输出数据
* */
public class CopyTest {

    public static void main(String[] args) throws IOException {
        try (
                FileInputStream fis = new FileInputStream("D:/test.zip");
                FileOutputStream fos = new FileOutputStream("D:/JavaTest/test.zip");
                // zip输入流,传入文件输入流
                ZipInputStream zis = new ZipInputStream(fis);
                // zip输出流,传入文件输出流
                ZipOutputStream zos = new ZipOutputStream(fos)
        ){
            // zip压缩包中子文件
            ZipEntry entry = null;
            while ((entry= zis.getNextEntry())!=null){
                // 子文件文件名
                String name = entry.getName();
                // 子文件非目录
                if (!entry.isDirectory()){
                    // zip输出流中设置文件名
                    zos.putNextEntry(new ZipEntry(name));
                    int temp;
                    byte[] bytes = new byte[1024];
                    // zip输出流读取bytes
                    while ((temp=zis.read(bytes))!=-1){
                        // zip输出流写入
                        zos.write(bytes,0,temp);
                    }
                }
            }
            System.out.println();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值