36.InputStream OutputStream

字符流:
FileReader
FileWriter

BufferedReader
BufferedWriter

字节流:
InputStream 读
OutputStream 写

public class FileStream_08 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        //writeFile();

        //readFile_1();

        //readFile_2();

        readFile_3();
    }

    //一个一个读
    public static void readFile_1() throws IOException{
        FileInputStream fis=new FileInputStream("d:\\demo.txt");

        int ch=0;

        while((ch=fis.read())!=-1){
            System.out.println((char)ch);
        }

        fis.close();
    }

    //数组读
    public static void readFile_2() throws IOException{
        FileInputStream fis=new FileInputStream("d:\\demo.txt");

        byte [] buf=new byte[3];

        int len=0; 

        while((len=fis.read(buf))!=-1){
            System.out.println(new String(buf,0,len));
        }
    }

    //inputStream特有的读法
    public static void readFile_3() throws IOException{
        FileInputStream fis=new FileInputStream("d:\\demo.txt");

        int num=fis.available();

        byte [] buf=new byte[num]; //一个刚刚好的缓冲区,不用循环了

        fis.read(buf);

        System.out.println("num="+num);
        System.out.println(new String(buf));
    }

    public static void writeFile() throws IOException{
        FileOutputStream fos=new FileOutputStream("d:\\fos.txt");

        fos.write("abcde".getBytes());

        fos.close();
    }

}

复制一张图片

思路:
1.用字节读取流和图片关联
2.用字节写入流对象创建一个图片文件,用于存储获取到的图片数据
3.通过循环读写,完成数据的存储
4.关闭你资源

public class CopyPic_09 {

    public static void main(String[] args) throws IOException  {
        // TODO Auto-generated method stub

        FileOutputStream fos=null; //输出流  写入
        FileInputStream fis=null;  //输入流 读取

        try {

            fis=new FileInputStream("e:\\myphoto.jpg");

            fos=new FileOutputStream("d:\\copy.jpg");

            byte [] buf=new byte[1024];

            int num=0;

            while((num=fis.read(buf))!=-1){
                fos.write(buf);
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException("复制文件失败");
        }finally{
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    throw new RuntimeException("写入关闭失败");
                }
            }
            if(fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    throw new RuntimeException("读取关闭失败");
                }
            }
        }
    }

}

字节流的缓冲区:
mp3的复制,通过缓冲区

public class Copy_10 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        long start=System.currentTimeMillis();
        copy_1();
        long end=System.currentTimeMillis();
        System.out.println((end-start));
    }

    //通过字节流的缓冲区完成复制
    public static void copy_1() throws IOException{

        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("e:\\Trouble Is A Friend.mp3"));

        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("d:\\copy.mp3"));

        int by=0;
        while((by=bis.read())!=-1){
            bos.write(by);
        }

        bis.close();
        bos.close();
    }
}

读取键盘录入
System.out:对应的是标准输出设备,控制台
System.in:对应的标准输入设备,键盘

需求:通过键盘录入数据。
当录入一行数据后,就将该行数据进行打印。
如果录入的数据是over,那么停止录入。

通过键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理。readLine

能不能直接使用readLine方法来完成键盘录入一行数据的读写?

readLine方法是字符流BufferedReader类中的方法,
而键盘录入的read方法是字节流InputStream的方法。

那么能不能将字节流转成字符流再使用字符流缓冲区的方法呢?

public class ReadIn_12 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

            InputStream in=System.in;

            /*int by=in.read();  //只读第一个

            System.out.println(by);*/

            StringBuffer sb=new StringBuffer();

            while(true){
                int ch=in.read(); 

                if(ch==‘\r‘){
                    continue;
                }

                if(ch==‘\n‘){
                    String s=sb.toString();  //缓冲区变成字符串

                    if("over".equals(s)){
                        break;
                    }

                    System.out.println(s.toUpperCase());

                    sb.delete(0,sb.length()); //打印完后对缓存区清空一次
                }else{
                    sb.append((char)ch);
                }
            }
    }

}

InputStreamReader 是字节流通向字符流的桥梁

public class InputStreamReader_13 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        //获取键盘录入对象
        InputStream in=System.in;

        //将字节流对象转成字符流对象,使用转换流,InputStreamReader
        InputStreamReader isr=new InputStreamReader(in);

        //为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
        BufferedReader bufr=new BufferedReader(isr);

        String line=null;

        while((line=bufr.readLine())!=null){
            if("over".equals(line)){
                break;
            }
            System.out.println(line.toUpperCase());
        }

    }

}

OutputStreamWriter 是字符流通向字节流的桥梁

public class OutputStreamWriter_14 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        OutputStream out=System.out; //返回 PrintStream,是OutputStream子类

        OutputStreamWriter osw=new OutputStreamWriter(out);

        BufferedWriter bufw=new BufferedWriter(osw);

        InputStream in=System.in;
        InputStreamReader isr=new InputStreamReader(in);
        BufferedReader bufr=new BufferedReader(isr);

        String line=null;

        while((line=bufr.readLine())!=null){
            if("over".equals(line)){
                break;
            }
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush(); //字符输出流内部有缓冲区
        }
    }
}

1.
源:键盘录入
目的:控制台

2.需求:把键盘录入的数据存储到一个文件中
源:键盘录入
目的:文件

3.需求:想要将一个文件的数据打印在控制台上
源:文件
目的:控制台

流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪个。
通过三个明确来完成。
1.明确源和目的
源:输入流
目的:输出流
2.明确操作的数据是否是纯文本
是:字符流
不是:字节流
3.当体系明确后,再明确要使用哪个具体的对象。通过设备来进行区分。
源设备:内存 硬盘 键盘
目的设备:内存 硬盘 控制台

public class TransStreamDemo1_15 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        //method_1();

        //method_2();

        method_3();

    }

    //键盘录入--控制台
    public static void method_1() throws IOException{
        InputStream in=System.in;
        InputStreamReader isr=new InputStreamReader(in);
        BufferedReader bufr=new BufferedReader(isr);

        OutputStream out=System.out;
        OutputStreamWriter osw=new OutputStreamWriter(out);
        BufferedWriter bufw=new BufferedWriter(osw);

        String line=null;
        while((line=bufr.readLine())!=null){
            if("over".equals(line)){
                break;
            }

            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();
        }

        bufr.close();
        bufw.close();
    }

    //键盘--文件
    public static void method_2() throws IOException{
        InputStream in=System.in;
        InputStreamReader isr=new InputStreamReader(in);
        BufferedReader bufr=new BufferedReader(isr);

        OutputStream out=new FileOutputStream("d:\\newCopy.txt");
        OutputStreamWriter osw=new OutputStreamWriter(out);
        BufferedWriter bufw=new BufferedWriter(osw);

        String line=null;
        while((line=bufr.readLine())!=null){
            if("over".equals(line)){
                break;
            }

            bufw.write(line.toUpperCase());
            bufw.flush();
            bufw.newLine();
        }

        bufr.close();
        bufw.close();
    }

    //文件--控制台
    public static void method_3() throws IOException{

        OutputStream out=System.out;
        OutputStreamWriter osw=new OutputStreamWriter(out);
        BufferedWriter bufw=new BufferedWriter(osw);

        FileInputStream fis=new FileInputStream("d:\\buf.txt");
        InputStreamReader isr=new InputStreamReader(fis);
        BufferedReader bufr=new BufferedReader(isr);

        String line=null;
        while((line=bufr.readLine())!=null){
            bufw.write(line.toUpperCase());
            bufw.flush();
            bufw.newLine();
        }

        bufr.close();
        bufw.close();
    }
}

原文地址:https://www.cnblogs.com/syj1993/p/8337167.html

时间: 2024-10-14 18:48:05

36.InputStream OutputStream的相关文章

InputStream && OutputStream

InputStream && OutputStream 介绍 IO流操作中非常重要的一组接口(其实是抽象类)是InputStream和OutputStream. InputStream字节输入流其最核心的一个方法是read()方法 OutputStream字节输出流其最核心的一个方法是write()方法 所有字节输入输都要实现read方法,所有字节输出流都要实现write()方法. 字节流可以操作任意类型的文件(二进制或文本文件) 首先了解几个概念: 01机器码:只有机器才能识别0101串

InputStream & OutputStream 使用方法以及注意事项

1 /* 2 * To change this license header, choose License Headers in Project Properties. 3 * To change this template file, choose Tools | Templates 4 * and open the template in the editor. 5 */ 6 package InputStream; 7 8 import java.io.BufferedInputStre

java的inputstream, outputstream, reader和writer的比较

java的文件读写有多种方式,在此通过代码做以下比较. 比较一:FileWriter和FileReader public class MyCode1 { public static void main(String[] args) throws IOException { File f = new File("my.txt"); FileWriter fw = new FileWriter(f); fw.write("HELLO"); fw.close(); Fil

黑马程序员——22,字节流InputStream,OutputStream,字节流缓冲区技术,BufferedInputStream,BufferedOutputStream

------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- /* 字节流的相关讲解: InputStream(读操作),OutputStream(写操作) 在用法上和之前的字符流差不多 */ import java.io.*; class Ioliou13 { public static void

[五] JavaIO之InputStream OutputStream简介 方法列表说明

InputStream 和 OutputStream 对于字节流的输入和输出 是作为协议的存在 所以有必要了解下这两个类提供出来的基本约定 这两个类是抽象类,而且基本上没什么实现,都是依赖于子类具体的去实现 但是他是对于其子类 协议纲领一般的存在 了解清楚每一个方法含义,对于后续具体的子类将会有非常大的帮助 基本含义 InputStream 所有字节输入流的 超类 他是一个抽象类 OutputStream 所有字节输出流的 超类 他是一个抽象类 方法列表 InputStream  包含了读取方法

Java I/O中的InputStream/OutputStream

原文地址:https://www.cnblogs.com/sunupo/p/10475906.html

java面试题大全

java面试笔试题大汇总     第一,谈谈final, finally, finalize的区别. 最常被问到. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别. 这个问得很少. 第五,HashMap和Hashtable的区

java基础面试题

问题:1.List,Set,Map是否继承自Collection接口? 答:List,Set是,Map不是 2.short s1=1;s1 = s1+1;有什么错?short s1 = 1; s1 +=1;有什么错? 答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)short s1 = 1; s1 += 1;(可以正确编译) 3.运行时异常有何异同? 答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到

springmvc学习(四)

1.使用 @CookieValue 绑定请求中的 Cookie 值 例子: java 1 @RequestMapping(value="/testCookieValue") 2 public String testCookieValue(@CookieValue(value="JSESSIONID")String cookie) 3 { 4 5 System.out.println("testRequestCookie"+cookie); 6 r