精华内容
下载资源
问答
  • JAVA 流分为 字节流 字符流

    千次阅读 2020-07-31 09:25:46
    字符流处理的是以2个字节为单元的unicode字符 字符数组 字符串 字节流处理的是 字节 字节数组 字节流一次操作一个字节 字符流一次操作一个缓冲区

    字符流处理的是以2个字节为单元的unicode字符 字符数组 字符串
    字节流处理的是 字节 字节数组
    字节流一次操作一个字节 字符流一次操作一个缓冲区

    展开全文
  • Java的字节流字符流的互换。转换流是字符流的子类,构造函数传参为字节流。(多态运用) 文章目录文件IO——转换流字符转字节构造方法字节转字符构造方法 Java转换流为我们提供的两种编码集(支持中文) GBK ...

    java基础(jdk1.8)

    **

    文件IO——转换流

    **

    Java的字节流和字符流的互换。转换流是字符流的子类,构造函数传参为字节流。(多态运用)

    Java转换流为我们提供的两种编码集(支持中文)
        GBK   中文2个字节
        utf-8  中文3个字节
        
    转换流原理:
    	字节流来操作文件,
    	转换流(即字符流)操作字节流
    	- 1.先声明字节流,并绑定文件
    	- 2.声明字符流,给定转换流实例化的引用,传入字节流和编码集
    

    字符转字节

    • OutputStreamWriter

    继承于Writer 子类:FileWrite

    构造方法

    OutputStreamWriter(OutputStream) //接收所有字节输出流

    OutputStreamWriter(OutputStream,String) //传入字节输出流,编码表(gbk、utf-8)

        //采用gbk进行写入
        FileOutputStream fo = new FileOutputStream("d://a.txt");
        OutputStreamWriter ow = new OutputStreamWriter(fo,"gbk");
        ow.write("你好");
        ow.close();
    
    
        //采用utf-8
        FileOutputStream fo = new FileOutputStream("d://a.txt");
        OutputStreamWriter ow = new OutputStreamWriter(fo,"utf-8");
        ow.write("你好");
        ow.close();
    
    

    字节转字符

    • InputStreamReader

    继承于Reader 子类:FileReader

    构造方法

    InputStreamReader(InputStream) //接收所有字节输入流

    InputStreamReader(InputStream,String) //传入字节输入流,编码表(gbk、utf-8)

        //采用gbk进行写入
        FileInputStream fi = new FileInputStream("d://a.txt");
        InputStreamReader iw = new InputStreamReader(fi,"gbk");
        
    
        //采用utf-8
        FileInputStream fi = new FileInputStream("d://a.txt");
        InputStreamReader iw = new InputStreamReader(fi,"utf-8");
    
    
        int len;
        char [] chars = new char[10];
        while ((len = iw.read(chars)) != -1)
        {
            System.out.println(new String(chars,0,len));
        }
        iw.close();
    

    注意:

    • 这里分别使用了两种编码集进行读写,将字符流使用编码转为字节流写到文件内后,读取时字节流转字符流应使用同编码集进行解码,否则就会出现中文乱码情况。
    • 转换流一般是用于网络通信中进行转换的。因为Java网络中提供的是字节流,要传输中文文字的话就要使用转换流进行操作

    有兴趣的关注我的公众号,一起学习交流啊
    在这里插入图片描述

    上一篇 》字符流


    下一篇 》缓冲流

    展开全文
  • IO 字节流 字符流 高效缓冲流 close()flush()区别 这篇也是纯课堂笔记,没做什么总结和编辑,都是理解性的内容,直接流的概念和怎么用就行 IO input和output 输入和输出, 用于设备与设备进行交互,数据从其他设备...

    IO 字节流 字符流 高效缓冲流 close()flush()区别

    这篇也是纯课堂笔记,没做什么总结和编辑,都是理解性的内容,直接流的概念和怎么用就行

    IO

    input和output 输入和输出, 用于设备与设备进行交互,数据从其他设备进入到内存就是输入,从内存把数据写到其他设备中称之为输出
    在这里插入图片描述

    IO的分类

    在这里插入图片描述

    四类都是抽象类,定义字节流和字符流操作的公共方法

    IO程序书写流程

    • 导包: IO包

    • 操作流对象时会有异常,需处理

    • 操作完流对象要关闭流资源

    InputStream

    字节输入流的顶层父类

    是一个抽象类,不能创建对象,只能由子类创建

    常用方法:

    • close() 关闭流资源,释放资源

    • read() 获取一个字节数据

    • read(byte[] b) 从当前流对象,读取数据存储到数组b中

    字节流

    • 可以直接操作字节信息的流对象

    • 根据流向输入流和输出流

    FileInputStream

    是字节输入流的一个子类,用于磁盘上的文件交互 是原始字节的图像数据流

    一次读取一个或多个字节的内容,图片,音乐视频都可

    构造方法:

    • FileInputStream(File file) :读取file文件中的数据

    • FileInputStream(String path):读取path路径所代表的文件

    无论你使用哪个构造方法,都只能封装文件的路径,不能封装文件夹

    常用方法:

    • read():一次读取一个字节,返回int类型,每读取一个字节后指向位置会自动向后偏移一个字节,如果已读到末尾,会返回-1,即获取到-1就表示读取结束

    • read(byte[] b):一次读取多个字节,把字节存储到数组b中,返回中代表向b数组存储的字节个数,如返回值是-1,说明读取文件结束

    package Inp;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class Inpu {
    	public static void main(String[] args) throws IOException {
    		File file = new File("11.txt");
    		FileInputStream fis = new FileInputStream(file);
    		int len = 0;
    		byte[] i =  new byte[1024];//b数组的长度,一般是1024,或是1024的整数倍,目的是为了减少IO的次数
    		while ((len = fis.read(i))!=-1) {
    			System.out.println(new String(i,0,len));
    		}
    	}
    }
    

    OutputStream

    1、字节输出流的顶层父类

    2、常用方法:

    • close() 关闭流对象

    • flush() 将缓冲区的内容刷新到文件中

    • write() 一次写出一个字节

    • write(byte[] b) 一次写出一个b数组的内容

    • write(byte[] b,int offset, int len) 一次性从b数组指定位置offset开始,写出len个元素

    FileOutputStream

    可以写出纯文本的内容,也可以写出图像,音乐,视频

    构造方法:

    (1) FileOutputStream(File f):字节输出流,把数据写到file文件中去

    (2) FileOutputStream(String path):把数据写到path路径所描述文件中

    (3) FileOutputStream(String|File parm ,boolean append):表示是否要在指定文件中把输入内容拼接到目标文件中,append =true 是拼接,false就是覆盖

    常用的对象方法

    • close()

    • write()

    • write(byte[] b)

    • write(byte[] b,int offset,int len)

    文件拷贝本质:

    从一个文件中,用输入流对象读取一个字节,再使用输出流,把这字节输出到另一文件中

    文件拷贝效率提升:使用一个字节拷贝IO次数比较多,有多少字节,就要io两倍的次数

    提升的思路:一次读取多个字节,一次写出多个字节,read(byte[] b) write(byte[] b),减少io次数,提高效率

    package Inp;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Inpu {
    	public static void main(String[] args) throws IOException {
    		med1();
    		med2();
    	}
    	private static void med2() throws IOException {
    		long t1 = System.currentTimeMillis();
    		File file = new File("1.mp4");
    		File file2 = new File("2.mp4");
    		FileInputStream fis = new FileInputStream(file);
    		FileOutputStream fos = new FileOutputStream(file2);
    		int len = 0;
    		while ((len = fis.read())!=-1) {
    			fos.write(len);
    		}
    		fos.close();
    		fis.close();
    		long t2 = System.currentTimeMillis();
    		System.out.println("单个字节拷贝效率为"+(t2-t1));
    	}
    
    	private static void med1() throws FileNotFoundException, IOException {
    		long t1 = System.currentTimeMillis();
    		File file = new File("1.mp4");
    		File file2 = new File("22.mp4");
    		FileInputStream fis = new FileInputStream(file);
    		FileOutputStream fos = new FileOutputStream(file2);
    		int len = 0;
    		byte[] i =  new byte[1024];
    		while ((len = fis.read(i))!=-1) {
    			fos.write(i);
    		}
    		fos.close();
    		fis.close();
    		long t2 = System.currentTimeMillis();
    		System.out.println("多字节拷贝效率为"+(t2-t1));
    	}
    }
    

    read()和read(byte[] b)方法的比较

    读取字节个数的区别:

    • read() 一次读取一个字节

    • read(byte[] b) 一次读取多少,取决于b的大小

    读取的内容存储位置不同

    • read() 读取到的内容存储在返回值中

    • read(byte[] b) 读取到的信息存储在数组中

    3、返回值得含义不同:

    • read:返回的是读取的内容

    • read(byte[] b):返回的向数组存储数据的长度

    • 如果读到-1,说明文件末尾

    高效缓冲流

    BufferedInputStream 和 BufferedOutputStream

    缓冲区的意思

    这两个流对象,本身不具备读写的能力,但能提高文件的读取写入效率

    构造方法:

    • BufferedInputStream(InputStream is):增强输入流

    • BufferedOutputStream(OutputStream os) :增强输出流

    增强的原理:

    • BufferedInputStream:准备个数组,每调用一次read(),增强流就会一次性从文件中读取8192个字节,存到缓冲区中,只会给你返回一个,当再次调用时,就从缓冲区里拿出来一个给你,不会再进行io了,由于数据在内存中获取数据是非常快的,当8192个字节全部读取完,再调用read()方法,他就会再次获取8192个字节,并返回一个,就减少了io的次数提高效率

    • BuffOutputStream:准备个数组,存储输出的信息,当调用write写出一个字节时,不是写到磁盘中,而是先写在缓冲数组中,当大小达到8192时,如果这个数据写满了,就一次性存储到磁盘中,再一次写出,就再准备一个数组,重复操作,写够8192个字节,才会操作一次磁盘

    package Inp;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Inpu {
    	public static void main(String[] args) throws IOException {
    		med3();
    		med4();
    	}
    	private static void med4() throws IOException {
    		long t1 = System.currentTimeMillis();
    		File file = new File("1.mp4");
    		File file2 = new File("bu22.mp4");
    		FileInputStream fis = new FileInputStream(file);
    		BufferedInputStream bis = new BufferedInputStream(fis);
    		FileOutputStream fos = new FileOutputStream(file2);
    		BufferedOutputStream bos = new BufferedOutputStream(fos);
    		int len = 0;
    		byte[] i =  new byte[1024];
    		while ((len = bis.read(i))!=-1) {
    			bos.write(i);
    		}
    		bos.close();
    		fos.close();
    		bis.close();
    		fis.close();
    		long t2 = System.currentTimeMillis();
    		System.out.println("多字节拷贝buffer效率为"+(t2-t1));
    	}
    
    	private static void med3() throws IOException {
    		long t1 = System.currentTimeMillis();
    		File file = new File("1.mp4");
    		File file2 = new File("bu2.mp4");
    		FileInputStream fis = new FileInputStream(file);
    		BufferedInputStream bis = new BufferedInputStream(fis);
    		FileOutputStream fos = new FileOutputStream(file2);
    		BufferedOutputStream bos = new BufferedOutputStream(fos);
    		int len = 0;
    		while ((len = bis.read())!=-1) {
    			bos.write(len);
    		}
    		bos.close();
    		fos.close();
    		bis.close();
    		fis.close();
    		long t2 = System.currentTimeMillis();
    		System.out.println("单个字节拷贝buffer效率为"+(t2-t1));
    	}
    }
    
    

    输出流的close()和flush的区别

    close()方法被调用前,会自动flush

    close()关闭流对象,一旦关了,流对象就不能再用了

    flush方法调用后,仅是把文件刷新到缓冲区,并不是把流关了,即调用完后还可以接着调用流

    字符流

    字节流处理字符问题

    • 需要先把字符变为字节数组,才能写到目标文件中

    字节读取字符

    • 纯英文,每次读取一个字节

    • 纯中文,每次读取两个字节(GBK) UTF-8一次读取3个

    • 中英文混杂,每次不知道要读取多少字节

    字符流的体系

    抽象顶层父类:Reader和Writer

    字符流具体子类:FileReader和FileWriter

    Reader的常用方法

    • close

    • read()

    • read(char[] arr):一次读取一组字符放到arr中,返回值表示放到数组中的字符个数

    Writer的常用方法

    • close

    • flush

    • 字符流拷贝效率提升write(int c):写出一个字符

    • write(String str): 写出一个字符串

    • write(char[] arr):

    • write(char[] arr,int offset,int len):

    都是抽象类,不能实例化,需要使用子类对象来调用方法

    字符流的拷贝使用场景:

    • 如果在读取字符之后,需要人为阅读,或修改之类,就有必要使用字符流了

    • 如果只单纯的文件拷贝,就不需要使用

    字符流不能操作流媒体文件:当字符流读取到字节信息,先查询编码表,将其转为字符信息,如果是非纯文本文件了,就有可能读取的字节信息无法转为对应的字符,因为字节信息在编码表中查不到,就会使用?来替代,再输出时,就能查到?的编码,则导致了字节信息被篡改,导致文件不可用

    字符流拷贝效率提升同字节流,使用FileReader的read(char[] arr)一次读取一个小数组的字符,能减少io的次数,提高读取效率

    FileWriter write(char[] arr) 一次写出一个小数组,同理增加效率

    字符的高效缓冲流

    和字节同理,只不过数组换成了char

    • BufferedReader:

    • BufferedWriter:

    高效缓冲流特有的方法

    BufferedReader

    • readLine(): 可以从流中,一次读取一行文本,返回一个String对象,读取到末尾的时候返回null

    BufferWriter

    • newLine(): 写出一个换行符
    package Inp;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class Fi {
    	public static void main(String[] args) throws IOException {
    		med1();
    		med2();
    	}
    
    	private static void med2() throws IOException {
    		File file = new File("233.txt");
    		FileReader fr = new FileReader(file);
    		int len =0;
    		while ((len=fr.read())!=-1) {
    			System.out.println((char)len);
    		}
    		fr.close();
    	}
    
    	private static void med1() throws FileNotFoundException, IOException {
    		File file = new File("233.txt");
    		File file2 = new File("234.txt");
    		FileReader fr = new FileReader(file);
    		FileWriter fw = new FileWriter(file2);
    		int len =0;
    		while ((len=fr.read())!=-1) {
    			fw.write(len);
    		}
    		fr.close();
    		fw.close();
    	}
    }
    
    
    展开全文
  • 1.流的概念 流是一组有顺序的,有起点和终点的字节...IO流分为字符流字节流.  3.字节流字符流的区别 1.字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节

    1.流的概念

    流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

    2.IO流的分类

    IO流分为字符流和字节流. 
    字符流

    字节流

    3.字节流和字符流的区别

    1.字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。 
    2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

    4.通过代码体现IO流中各种流的方法的使用

    1.用普通字节流复制a文件的内容到b文件中

    public class CopyFileDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("a.txt");
        FileOutputStream fos=new FileOutputStream("b.txt");
    
        //方式一:一次读取写入单个字节
        int i=0;
        while((i=fis.read())!=-1){
            fos.write(i);
        }
        fos.close();
        fis.close();
    
        //方式二:一次读取写入一个字节数组
        byte[] by=new byte[1024];
        int len=0;
        while((len=fis.read(by))!=-1){
            fos.write(by,0,len);
        }
        fos.close();
        fis.close();
    }
    }
    

    2.使用高效字符流复制文件

    public class CopyFileDemo3 {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new FileReader("a.txt"));
        //如果d文件中有数据,true表示继续往文件中追加数据
        BufferedWriter bw=new BufferedWriter(new FileWriter("d.txt",true));
    
        String line=null;
        //高效字符输入流的特有方法readline(),每次读取一行数据
        while((line=br.readLine())!=null){
            bw.write(line);
            //高效字符输出流的特有方法newline()
            bw.newLine();
            //将缓冲区中的数据刷到目的地文件中
            bw.flush();
        }
        //关闭流,其实关闭的就是java调用的系统底层资源。在关闭前,会先刷新该流。
        bw.close();
        br.close();
    }
    }
    注:
    a.高效流不能直接对文件进行操作,必须通过普通流操作.高效流是从输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了
    b.字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的,并且可以使用flush方法强制进行刷新缓冲区
    

    5.转换流

    InputStreamReader 是字节流通向字符流的桥梁 
    OutputStreamWriter 是字符流通向字节流的桥梁 
    转换流可以将字节转成字符,原因在于,将获取到的字节通过查编码表获取到指定对应字符。 
    转换流的最强功能就是基于 字节流 + 编码表 。没有转换,没有字符流

    6.打印流

    PrintWriter 
    PrintStream 
    注: 
    A:只操作目的地,不操作数据源 
    B:可以操作任意类型的数据 
    C:如果启用了自动刷新,在调用println(),printf(),format()方法的时候,能够换行并刷新 
    D:可以直接操作文件

    7.序列化流

    ObjectOutputStream序列化流 
    ObjectInputStream反序列化流 
    序列化:把对象作为一个整体按照流一样的方式传输或者存储。 
    反序列化:把网络中的流数据或者文件中的流数据还原成对象 
    主要方法有: 
    1.Object readObject();该方法抛出异常:ClassNotFountException。 
    2. void writeObject(Object):被写入的对象必须实现一个接口:Serializable,否则就会抛出:NotSerializableException 
    3.如果实现了该接口,想解决黄线问题就生成一个随机的serialVersionUID号码

    8.综合小案例:键盘录入数据保存到文件中

    public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
        //创建键盘录入
        InputStream is=System.in;
        //将字节流转换为字符流
        InputStreamReader isr=new InputStreamReader(is);
        //高效字符流读取数据
        BufferedReader br=new BufferedReader(isr);
        //打印流写入数据,第一个true表示如果文件中有内容就追加数据,第二个true表示启用自动刷新
        PrintWriter pw=new PrintWriter(new FileWriter("a.txt",true),true);
    
        String line=null;
        while((line=br.readLine())!=null){
            if("over".equals(line)){
                break;
            }
            //PrintWriter启用自动刷新
            pw.println(line);
        }
        pw.close();
        br.close();
    }
    }

    展开全文
  • Java 字节流 字符流 转换流

    万次阅读 2015-05-10 13:55:16
    我们知道Java中的流分为字符流字节流,其中字符流主要针对字符文本进行处理,而字节流处理范围更为广泛,毕竟图片、电影等只要是文件都是以二进制的形式存在的,而不是字符。 字符流: FileReader FileWriter。 ...
  • 字节流字节流 又称 万能流 不但可以读写文本,还可以读写图片 音频 视频使用字节流进行 文件的复制需要对异常进行处理 且计算复制时间long start = System.currentTimeMillis(); // 被读文件 File file1 = new ...
  • java 字节流 字符流

    2014-04-26 17:27:02
    java中的字节流字符流的存储区别,用几个常用类型的数据来比较字节流字符流的区别  int a=5;  boolean b=true;  char c='G';  String d="你好";  使用字符流打印以上类型的数据到文件中:  ...
  • IO(Input Output)流IO流用来处理设备之间的数据传输Java对数据的操作是通过流的方式Java用于操作流的对象都在IO包中流按照操作数据分为两种:字节流字符流流按照流向分为:输入流和输出流输入流和输出流是相对于...
  • 字节流 字符流 乱码

    2016-05-17 12:17:55
    字节流转字符流有可能出现乱码问题 在new String 的时候加上需要的编码格式 InputStream is = StockCache.class.getResourceAsStream(path); BufferedInputStream bis = new BufferedInputStream(is); byte[] ...
  • java字节流字符流

    2013-08-10 14:12:53
    字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以...
  • 字节流字符流的区别

    2014-05-05 19:27:04
    字节流能写任何数据 字符流只能写字符 还有。。。百度
  • 按流中处理的数据是以字节(8位)为单位还是以字符(16位)为单位分为字节流字符流字节流: InputStream和OutputStreamInputStreamInputStream是抽象类,不能直接用new InputStream()构造实例。 FileInputStre
  • 字节流字符流的使用

    2015-10-19 09:18:30
     字节流的抽象基类  InputStream,outputStream 字符流的抽象基类  Reader,Writer 二、数据的读写 1,将数据写到文件当中,使用字节输出流。FileOutputStream write(byte[] b) 将b.length个字节从指定...
  • 总结: stringBuilder的tostring返回的是new出来的字符串 如果没有那么返回空字符串而不是null 字符流:缓冲流内部都维护了一个数组 不是缓冲流的只有字符流的writer维护了一个... 但是字节流的话 缓冲流没有...
  • 流可以看作一组有序字节... java流按操作数据分有两种: -----字节流:(8 bit)inputstream ,outputstream -----字符流:(16bit)Reader, Writer 按流向分有两种: -----输入流:inputstream ,Reader -...
  • 字节流一般用于传输视频文件等,字符流一般用于传输文本类型的文件。 Java的字节流 InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。 Java的字符流 Reader是所有读取字符串输入流...
  • 利用字节流字符流操作数据读写

    千次阅读 2017-08-23 16:41:59
    字节流操作数据读写   import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;   /**  * 利用流来拷贝文件  * @author ...
  • JAVA基础再回首(二十二)——转换流概述及用法、简化写法FileWriter和 FileReader、字符缓冲流及特殊用法、字节流字符流复制文件方法总结 版权声明:转载必须注明本文转自程序员杜鹏程的博客:...
  • 分别使用字节流字符流完成以下程序: 1. 在指定的路径下新建一个 txt 文件 "aura.txt",利用程序在文件中写入如下内容: "Hadoop(hdfs、mapreduce、yarn) 元老级大数据处理技术框架,擅长离线数据分析,Hbase ...
  • 1 Java 字节流(byte),字符流(char,string)区别? 什么是流:IO操作就是流。比如,标准输入输出,读写文件,内存赋值。 字节,字符区别:byte 1个字节,java char is 两个字节. c++ char is 1个字节 应用场景:字符...
  • Byte是字节,肯定使用字节流操作,所有的数据基本上都可以直接使用byte数组表示出来 1、OutputStream 字节输出流 import java.io.File ; import java.io.OutputStream ; import java.io.FileOutputStream ; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,274
精华内容 12,509
关键字:

字节流字符流