精华内容
下载资源
问答
  • 文件转换流
    千次阅读
    2020-10-14 15:42:25

    文件转流

     

    public static byte[] file2byte(String filePath) {
            byte[] buffer = null;
            try {
                File file = new File(filePath);
                FileInputStream fis = new FileInputStream(file);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                byte[] b = new byte[1024];
                int n;
                while ((n = fis.read(b)) != -1) {
                    bos.write(b, 0, n);
                }
                fis.close();
                bos.close();
                buffer = bos.toByteArray();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return buffer;
        }

    流转文件

     public void byte2File(byte[] buf, String filePath, String fileName) {
            BufferedOutputStream bos = null;
            FileOutputStream fos = null;
            File file = null;
            try {
                File dir = new File(filePath);
                if (!dir.exists() && dir.isDirectory()) {
                    dir.mkdirs();
                }
                file = new File(filePath + File.separator + fileName);
                fos = new FileOutputStream(file);
                bos = new BufferedOutputStream(fos);
                bos.write(buf);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (bos != null) {
                    try {
                        bos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

     

    更多相关内容
  • FileReader可以读取idea默认编码格式(utf-8)的文件,读取系统默认编码(中文gbk)会产生乱码 gbk中文码表,使用两个字节存储一个中文,utf-8国际标准码表,使用三个字节存储一个中文 package file_main; import java....

    字符集charset

    也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。

    GBxxx字符集:gbk、gb2312、gb18030(最新的中文码表)

    InputStreamReader

    FileReader可以读取idea默认编码格式(utf-8)的文件,读取系统默认编码(中文gbk)会产生乱码

    gbk中文码表,使用两个字节存储一个中文,utf-8国际标准码表,使用三个字节存储一个中文

    package file_main;
    
    import java.io.FileReader;
    import java.io.Reader;
    
    public class Test2 {
    	
    	public static void main(String[] args) throws Exception{
    		
    		Reader reader = new FileReader("C:\\Users\\27427\\Desktop\\1.txt");
    		// 这个文件是在电脑桌面新建的一个文件
    		char[] chars = new char[1024];
    		int count=reader.read(chars);
    		System.out.println(new String(chars,0,count));
    		reader.close();
    	}
    }
    
    // 结果乱码
    

    使用InputStreamReader来读取

    package file_main;
    
    import java.io.FileInputStream;
    import java.io.InputStreamReader;
    import java.io.Reader;
    
    public class Test2 {
    	
    	public static void main(String[] args) throws Exception{
    		
    		Reader r = new InputStreamReader(new FileInputStream("C:\\Users\\27427\\Desktop\\1.txt"),"gbk");
    		
    		char[] chars = new char[1024];
    		int count=r.read(chars);
    		System.out.println(new String(chars,0,count));
    		r.close();
    	}
    }
    
    
    OutputStreamWriter(父类为Writer,是字符流通向字节流的桥梁,可使用指定charset将要写入流中的字符编码成字节)

    构造方法

    OutputStreamWriter(OutStream out)

    OutputStreamWriter(OutStream out,String charsetName)

    package file_main;
    
    import java.io.FileOutputStream;
    import java.io.OutputStreamWriter;
    
    public class Test2 {
    	
    	public static void main(String[] args) throws Exception{
    		
    		OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("C:\\Users\\27427\\Desktop\\1.txt"),"utf-8");
    		writer.write("你好!");
    		writer.flush();
    		writer.close();
    	}
    }
    
    转换文件编码步骤
    1. 创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码名称
    2. 创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码名称
    3. 使用InputStreamReader对象相应的方法读取文件
    4. 使用OutputStreamWriter对象中相应方法,把读取的 数据写入到文件中
    5. 释放资源
    展开全文
  • Java流处理之转换编码的转换流

    千次阅读 2022-04-29 09:12:15
    ‍♂️字符编码和字符集 字符编码 ‍♀️字符集 ⛹编码引出的问题 InputStreamReader类 构造方法 指定编码读取 OutputStreamWriter类 ...‍♂️转换流理解图解 ⛷️转换文件编码案例 ‍♂️案例分析 ‍♂️案例实现

    之前的博客梳理了基本的字节流和字符流:Java字节流和字符流详解,本文主要讲基于基础的字节字符流做转换编码的转换流。

    🤦‍♂️字符编码和字符集

    🏃字符编码

    计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。
    编码:字符(能看懂的)–字节(看不懂的)
    解码:字节(看不懂的)–>字符(能看懂的)

    • 字符编码Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则。
      编码表:生活中文字和计算机中二进制的对应规则

    🏃‍♀️字符集

    • 字符集Charset:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。

    计算机要准确的存储和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有ASCII字符集、GBK字符集、Unicode字符集等。编码与解码
    可见,当指定了编码,它所对应的字符集自然就指定了,所以编码才是我们最终要关心的。

    • ASCII字符集
      • ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
      • 基本的ASCII字符集,使用7位(bits)表示一个字符,共128字符。ASCII的扩展字符集使用8位(bits)表示一个字符,共256字符,方便支持欧洲常用字符。
    • ISO-8859-1字符集
      • 拉丁码表,别名Latin-1,用于显示欧洲使用的语言,包括荷兰、丹麦、德语、意大利语、西班牙语等。
      • ISO-8859-1使用单字节编码,兼容ASCII编码。
    • GBxxx字符集
      • GB就是国标的意思,是为了显示中文而设计的一套字符集。
      • GB2312:简体中文码表。一个小于127的字符的意义与原来相同。但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
      • GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。
      • GB18030:最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。
    • Unicode字符集
      • Unicode编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。
      • 它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF-32。最为常用的UTF-8编码。
      • UTF-8编码,可以用来表示Unicode标准中任何字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。所以,我们开发Web应用,也要使用UTF-8编码。它使用一至四个字节为每个字符编码,编码规则:
        1. 128个US-ASCII字符,只需一个字节编码。
        2. 拉丁文等字符,需要二个字节编码。
        3. 大部分常用字(含中文),使用三个字节编码。
        4. 其他极少使用的Unicode辅助字符,使用四字节编码。

    ⛹编码引出的问题

    在IDEA中,使用FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。

    public class ReaderDemo {
        public static void main(String[] args) throws IOException {
            FileReader fileReader = new FileReader("E:\\File_GBK.txt");
            int read;
            while ((read = fileReader.read()) != -1) {
                System.out.print((char)read);
            }
            fileReader.close();
        }
    }
    输出结果:
    ���
    

    那么如何读取GBK编码的文件呢?🧐

    🏋InputStreamReader类

    转换流java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

    🚴构造方法

    • InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流。
    • InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流。

    构造举例,代码如下:

    InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
    InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");
    

    🤾指定编码读取

    public class ReaderDemo2 {
        public static void main(String[] args) throws IOException {
          	// 定义文件路径,文件为gbk编码
            String FileName = "E:\\file_gbk.txt";
          	// 创建流对象,默认UTF8编码
            InputStreamReader isr = new InputStreamReader(new FileInputStream(FileName));
          	// 创建流对象,指定GBK编码
            InputStreamReader isr2 = new InputStreamReader(new FileInputStream(FileName) , "GBK");
    		// 定义变量,保存字符
            int read;
          	// 使用默认编码字符流读取,乱码
            while ((read = isr.read()) != -1) {
                System.out.print((char)read); // ��Һ�
            }
            isr.close();
          
          	// 使用指定编码字符流读取,正常解析
            while ((read = isr2.read()) != -1) {
                System.out.print((char)read);// 大家好
            }
            isr2.close();
        }
    }
    

    🛀OutputStreamWriter类

    转换流java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

    👫构造方法

    • OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符流。
    • OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流。

    构造举例,代码如下:

    OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
    OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");
    

    🏊指定编码写出

    public class OutputDemo {
        public static void main(String[] args) throws IOException {
          	// 定义文件路径
            String FileName = "E:\\out.txt";
          	// 创建流对象,默认UTF8编码
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(FileName));
            // 写出数据
          	osw.write("你好"); // 保存为6个字节
            osw.close();
          	
    		// 定义文件路径
    		String FileName2 = "E:\\out2.txt";
         	// 创建流对象,指定GBK编码
            OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream(FileName2),"GBK");
            // 写出数据
          	osw2.write("你好");// 保存为4个字节
            osw2.close();
        }
    }
    

    🏄‍♂️转换流理解图解

    转换流是字节与字符间的桥梁!
    字节与字符转换

    ⛷️转换文件编码案例

    将GBK编码的文本文件,转换为UTF-8编码的文本文件。

    🚣‍♂️案例分析

    1. 指定GBK编码的转换流,读取文本文件。
    2. 使用UTF-8编码的转换流,写出文本文件。

    🤽‍♂️案例实现

    public class TransDemo {
       public static void main(String[] args) {      
        	// 1.定义文件路径
         	String srcFile = "file_gbk.txt";
            String destFile = "file_utf8.txt";
    		// 2.创建流对象
        	// 2.1 转换输入流,指定GBK编码
            InputStreamReader isr = new InputStreamReader(new FileInputStream(srcFile) , "GBK");
        	// 2.2 转换输出流,默认utf8编码
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(destFile));
    		// 3.读写数据
        	// 3.1 定义数组
            char[] cbuf = new char[1024];
        	// 3.2 定义长度
            int len;
        	// 3.3 循环读取
            while ((len = isr.read(cbuf))!=-1) {
                // 循环写出
              	osw.write(cbuf,0,len);
            }
        	// 4.释放资源
            osw.close();
            isr.close();
      	}
    }
    

    相关文章:
    Java流处理之高效读写的缓冲流
    Java流处理之序列化和打印流
    File类详解(获取文件名称、大小、路径、创建等)

    展开全文
  • java ->IO流_转换流

    千次阅读 2021-02-12 21:50:54
    转换流在学习字符流(FileReader、FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter,这又是什么意思呢?OutputStreamWriter类...

    转换流

    在学习字符流(FileReader、FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter,这又是什么意思呢?

    OutputStreamWriter类

    查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。

    l  代码演示:

    public static void writeCN() throws Exception {

    //创建与文件关联的字节输出流对象

    FileOutputStream fos = new FileOutputStream("c:\\cn8.txt");

    //创建可以把字符转成字节的转换流对象,并指定utf-8编码

    OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");

    //调用转换流,把文字写出去,其实是写到转换流的缓冲区中

    osw.write("你好");//写入缓冲区。

    osw.close();

    }

    OutputStreamWriter流对象,它到底如何把字符转成字节输出的呢?

    其实在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。

    InputStreamReader类

    查阅InputStreamReader的API介绍,InputStreamReader 是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

    l  代码演示

    public class InputStreamReaderDemo {

    public static void main(String[] args) throws IOException {

    //演示字节转字符流的转换流

    readCN();

    }

    public static void readCN() throws IOException{

    //创建读取文件的字节流对象

    InputStream in = new FileInputStream("c:\\cn8.txt");

    //创建转换流对象

    //InputStreamReader isr = new InputStreamReader(in);这样创建对象,会用本地默认码表读取,将会发生错误解码的错误

    InputStreamReader isr = new InputStreamReader(in,"utf-8");

    //使用转换流去读字节流中的字节

    int ch = 0;

    while((ch = isr.read())!=-1){

    System.out.println((char)ch);

    }

    //关闭流

    isr.close();

    }

    }

    注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。

    转换流和子类区别

    发现有如下继承关系:

    OutputStreamWriter:

    |--FileWriter:

    InputStreamReader:

    |--FileReader;

    父类和子类的功能有什么区别呢?

    OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。

    FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。

    InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。

    InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

    FileReader fr = new FileReader("a.txt");

    这三句代码的功能是一样的,其中第三句最为便捷。

    注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?

    条件:

    1、操作的是文件。2、使用默认编码。

    总结:

    字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。InputStreamReader

    字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

    展开全文
  • 文件转换为二进制

    热门讨论 2013-02-19 16:06:26
    文本字符串与byte[], 整个物理文件与byte[], 物理文件内容与byte[], stream与byty[] 之间的相互转换。 从磁盘读取文件,将文件写入磁盘。
  • Base64与文件流之间的相互转换

    千次阅读 2021-11-26 16:02:59
    Base64与文件流之间的相互转换 文件流转换成Base64 /** * 文件流转换成Base4 */ public String fileToBase64(String path){ String base64 = null; InputStream in = null; try { File file = new File(path...
  • C# FileToStream 文件转换成文件

    千次阅读 2019-11-20 17:26:40
    /// 文件转换成文件 /// </summary> /// <param name="filePath">文件名</param> /// <returns>文件</returns> public static Stream FileToStream(string filePath) { ...
  • 本文实例讲述了Java实现文件和base64的相互转换功能。分享给大家供大家参考,具体如下:import java.io.FileInputStream;import java.io.FileOutputStream;import sun.misc.BASE64Decoder;import sun.misc.BASE64...
  • 文件转换base64

    千次阅读 2020-08-23 16:28:14
    在日常开发中 经常需要将文件转换base64给前台 这是我经常使用的base64工具类 在此和大家分享一下 /** * 文件转为base64字符串 * @param document * @return */ public static String PDFToBase64(File ...
  • java 将文件流文件名称转换文件

    千次阅读 2021-03-01 06:19:45
    private class MultipartFileResource extends InputStreamResource {private String fileName;private InputStream inputStream;public MultipartFileResource(InputStream inputStream, String fileName) {super(i...
  • 1.第一步,引入bc包的安装依赖。在pom.xml中引入。...2.pdf文件转换成Base64./*** @Description:* @param:* @return:* @author: TateBrown* @Date: 2018/7/25*/@ApiOperation("根据docid返回pdf...
  • ImageIO 图片文件转换文件

    千次阅读 2019-10-29 18:08:19
    ByteArrayOutputStream bs = new ByteArrayOutputStream(); BufferedImage bufferedImage=....逻辑...; ImageOutputStream imOut; try { imOut = ImageIO.createImageOutputStream(bs); ...
  • C# 文件与二进制间的转换

    千次阅读 2019-03-26 08:54:07
    前言: 将jar包或者zip包,保存到数据库里面。 private void UploadFile() { OpenFileDialog dialog = new OpenFileDialog();... dialog.Filter = "压缩文件|*.zip;*.jar";//文件扩展名 dialog.Ch...
  • public File operaFileData(String path, byte[] by){{FileOutputStream fileout = null;String fileName = path + "baidu.apk";File file = new File(fileName);if (file.exists()){file.delete();...
  • 练习:转换文件编码。题目: 将GBK编码的文本文件转换为UTF-8编码的文本文件。分析:1.创建InputStreamReader对象,构造方法中传递字节输入和指定的编码表名称GBK。2.创建OutputTreamWrite对象,构造方法中传递...
  • Java转换流

    千次阅读 2021-03-16 20:57:10
    前面提到IO流可分为字节流和字符流,有时字节流和字符...转换流也是一种包装流,其中OutputStreamWriter是Writer的子类,它可以将一个字节输出流包装成字符输出流,方便直接写入字符,而InputStreamReader是Reader的...
  • 如果要直接对物理磁盘目录里的文件进行操作,则只能实用File进行操作,有时由于一些定制化的需求,需要对File和MultipartFile流转换,笔者分享一个已经完美实现的转换工具类,如果觉得对您有帮助,敬请点赞并...
  • 前端 文件流 / blob / file 转换

    万次阅读 2020-09-30 17:43:35
    把上传的/后台返回的图片文件加一个图片转换文字的ocr功能。 目前遇到两种情况,一个是从后台接收的文件流,类似以下: 一个是用elementui组件获取的file对象类型格式文件。 解决: 关于blob/file blob参数要求看这...
  • 二进制文件、文本文件转换工具

    热门讨论 2010-04-21 16:03:28
    在论坛想上传文件,不行! 直接粘贴文件内容,不行!可能它是二进制文件。 怎么办,用“二进制文件、文本文件转换工具” C#应用示例,含源码。
  • 第一次接收到此时,在将缓冲区转换为图像之前,我能够一次读取16位,以便对每个像素执行一些计算,即每个像素存在16位数据块.现在下半部分是Django网络应用程序,这次我也通过ffmpeg,nginx,hls流向您展示了此视频输出...
  • 文件流转换
  • java 文件读取

    千次阅读 2021-03-07 08:56:42
    在Java语言的IO编程中,读取文件是分两个步骤:1、将文件中的数据转换,2、读取内部的数据。其中第一个步骤由系统完成,只需要创建对应的对象即可,对象创建完成以后步骤1就完成了,第二个步骤使用输入...
  •  /// 文件转化成byte[]数组  /// &lt;/summary&gt;  /// &lt;param name="fileName"&gt;&lt;/param&gt;  /// &lt;returns&gt;&lt;/returns&gt;  private ...
  • 然后封装成报文发送给终端,终端在得到报文之后发送给终端,终端在获取到json字符串后读取内容并还原成zip文件包,而且要对zip文件中的某些特定文件内容进行入库保存。 要达到上面的要求,无非是要将zip文件转化成...
  • 对象说白了就是一堆进制码,并不支持和文件的直接转换,因为本身并不知道文件的类型 实现思路: 先使用File创建出一个对应的文件,指定好类型,把对象输入文件中,判断为-1则表示输入完成 @Test public void...
  • 代码如下:import sysNumbers_In_Line = 16 #一行...* 将一个文件转换为二进制文件(binary)* python3 tran_to_binary.py input_file out_file* 20190713"""class TranStrToBinary():def tran_string_...
  • js 文件文件流之间互换

    千次阅读 2019-09-17 14:48:10
    直接看代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="ie=edge">...js文件间互换</title> &...
  • js将base64转换为上传文件文件流 今天开发中遇见一个有意思的问题,由于使用html2canvas和jsPDF这两个插件将html转化为pdf文件,但是需要将生成的pdf文件上传给后端,然而pdf.output(‘dataurlstring’)返回的结果为...
  • 前端如何把流文件转换为json

    千次阅读 2020-03-25 10:08:55
    之前使用axios下载一直是好好的,知道产品提出,下载的错误信息需要提示出来而不是显示在下载文件里面。 在网上搜索良久,也没有答案没办法,只能去这里找...
  • vue获取后台的文件流并且转换成图片 1.添加request的responseType export function addCode(Equip,data) { return request({ method: “post”, url: ‘/upload/create/’+Equip.width+’/’+Equip.height, data: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 619,926
精华内容 247,970
关键字:

文件转换流