精华内容
下载资源
问答
  • 文件流是什么
    千次阅读
    2019-08-31 16:20:29

    文件流详解:

    低级流:

    FileOutputStream fos = new FileOutputStream("fos.txt",true);
    		String str = "回首~掏~轨道一开~看不见";
    		fos.write(str.getBytes("GBK"));
    `FileInputStream fir = new FileInputStream("rt.txt");
    		byte[] byt = new byte[100];
    		int len = fir.read(byt);
    

    上面是文件流中两个低级流,低级流以字节进行读写,参数可以为File或String;
    FileOutputStream可以有第二个参数boolean,为true时,第二次运行输入会接着文件内容末尾写入;

    转换流:

    FileInputStream dir = new FileInputStream("ISRDemo.java");
    InputStreamReader dis = new InputStreamReader(dir,"GBK");
    int len = -1;
    while((len = dis.read())!=-1){
    char c = (char)len;
    System.out.print(c);
    }
    dis.close();
    FileOutputStream fir = new FileOutputStream("osw.txt",true);
    OutputStreamWriter fis = new OutputStreamWriter(fir,"GBK");
    fis.write("圣剑啊,我是你的主人!");
    fis.close();
    

    转换流就是把字节转换为字符(char)进行读写,因为转为字符,所以我们需要定义编码,用的最多是编码是万国码“UTF-8”;

    缓冲字符流

    FileOutputStream fos = new FileOutputStream("fis.txt");
    			OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
    			BufferedWriter bw = new BufferedWriter(osw);
    			bw.write("你好");
    			bw.write("渣渣们");
    			bw.close();
    			
    			FileInputStream fis = new FileInputStream("fis.txt");
    			InputStreamReader isr = new InputStreamReader(fis,"utf-8");
    			BufferedReader br = new BufferedReader(isr);
    			String str = null;
    			str = br.readLine();
    			br.close();
    			System.out.println(str);
    

    缓冲流输出流没什么区别,换行写入还是需要PrintWriter流,这个在下面讲,输入流就是BufferedReader流的方法readLine()就是读出整行,缓冲流需要一个流程:低级流-转换字符流-缓冲流输入…也就字节-字符-整行的过程;

    缓冲字符输出流:

    PrintWriter pw = new PrintWriter("pw.txt","GBK");
    			pw.println("我,是你永远得不到的爸爸!");
    			pw.println("你好!")
    

    PrintWriter流是输出流,写入文档以换行结束;参数可以是文件名,也可以是低级流,也可以是缓冲流,第二参数就是编码;具有自动行刷新功能的缓冲字符输出流(内部连接了BufferedWriter作为缓冲功能),这是一个很简单实用的高级流;

    总结:转换流,缓冲流,缓冲字符输出流都是高级流,必须在其他流之上,就是必须嫁接在别的流才行。
    在缓冲流有一个fiush()方法用于强制把缓冲区中已经缓冲的内容写出,close()中默认调用此方法;
    上面如果有报错,记得把异常抛出!

    更多相关内容
  • File文件,字节输入,字节输入,字符输入,字节输出的详解 File文件概述 1.File类型:用于表示一个文件或者是文件夹的路径的对象(抽象路径名) 2.路径:用于描述文件或者是文件夹的所在路径的所在的字符串 3....

    File文件,字节输入流,字节输入流,字符输入流,字节输出流的详解

    File文件概述
    1.File类型:用于表示一个文件或者是文件夹的路径的对象(抽象路径名)
    2.路径:用于描述文件或者是文件夹的所在路径的所在的字符串
    3.路径分类:绝对路径和相对路径
    4.绝对路径:从跟目录开始的路径,称为绝对路径,在window中盘符路径就是跟目录,在Linu目录中从根目录开始的路径就是绝对路径
    5.相对路径:相对于某个路径而言的路径,相对于不同的路径,同样的相对路径,表达的是不同的路径
    File文件的构造方法:
    1.File(String path) 把字符的路径,封装成一个File对象
    2.File(String parent,String child) 将父级路径和子级路径封装成File对象,其实就是描述的就是父级路径和子级路径封装的一个路经
    3.File(File parent,String child) 将父级File对象和字级路径封装成一个File对象,其实就是在描述父级路径和资级路径封装的路径

    public class FileDemo01 {
         public static void main(String[] args) {
        	 //将一个字符串串封装成一个file文件对象
    	     File file = new File("x");
    	     System.out.println(file);
    	     
    	     //将一个父级路径和子级路径封装成一个file文件,其实 就是描述的是父级和子级拼接后的路径
    	     File file2 = new File("x/y","z");
    	     System.out.println(file2);
    	     
    	     //将父级File对象和字节路径封装成一个file对象,其实就是父级路径和子级路径的拼接后的路径
    	     File file3 = new File("x/y/z");
    	     file3 = new File("x/y/z","aaa.txt"); 
    	     System.out.println(file3);
    	     
    	 }
    }
    

    File类型的创建方法和删除方法
    1.boolean createNewFile() 创建当前的File对象所描述的路径的文件
    2.boolean mkdir() 创建当前对象的所描述的路径的文件夹(如果父级路径不存在,那么就会自动创建父级路径)
    3.boolean mkirs() 创建当前的File对象所描述的路径的文件夹
    4.delete():删除调用者所描述的文件或者文件夹
    备注:delete在删除文件夹的时候,只能删除空的文件夹,delete不能走回收站

           //创建一个文件
    		File file = new File("x/y/a.txt");
    		file.createNewFile();
    		//创建一个文件夹
    		File nFile = new File("k");
    		nFile.mkdir();
    		//创建多级文键夹
    		File nFile2 =new File("a/b/c/n");
    		nFile2.mkdirs();
    		//删除
    		nFile.delete();
    

    File类型的重名功能
    1.renameTo(File dest)
    调用者是当前的文件或者文件夹的路径对象
    参数列表是变化后的文件或者是文件夹的路径对象
    2.注意事项:
    如果在同一个文件夹下,修改路径就是 重命名
    如果不在同一个文件夹下,修改路径就是剪切

          //重命名方法,实现数据的重名称,如果在不同的目录下相同的文件就是剪切
    	   File file = new File("x/y/a.txt");
    	   File file2 = new File("a/b/c/d/a.txt");
    	   file.renameTo(file2);
    	   //调用者是当前的文件夹或者是目录,被调用者是变化之后的文件夹或者路径对象,如果在相同的目录下就是重命名
    	   File file3 = new File("a/b/c/d/f.txt");
    	   file2.renameTo(file3);
    

    File文件的判断功能和获取功能
    1.exists();判断当前调用者File文件,是否存在
    2.isFile();判断当前调用者是否是文件
    3.isDiretory():判断当前文件是不是文件夹
    4.getAbsolutepath():获取当前File对象的绝对路径
    5.getPath():获取的就是在构造方法中封装的路径
    6.String[] String:获取当前文件夹中的所有的文件和文件夹的名称,到数组中
    7.File[] listFiles():获取当前文件夹的所有的文件和文件夹的File对象在File对象数组中

    File file = new File("a");
    System.out.println(file.exists());       //判断文件是否存在
    System.out.println(file.isFile());       //判断当前调用者是不是文件
    System.out.println(file.isDirectory());  //判读当前的调用者是不是文件夹
    //获取最底层的文件的名称
    File file = new File("a/b/c/d/f.txt");
    //打印构造方法的路径
    System.out.println(file.getName());
    //打印文件的路径
    System.out.println(file.getParent());
    //打印文件的绝对路径
    System.out.println(file.getAbsolutePath());
    

    通过控制台输入一个字符串,判断是否是指定的文件夹下,所有的大于20M的以.wmv的文件的绝对路径?

    package cn.ujiuye.file;
    import java.io.File;
    import java.util.Scanner;
    /**
     * @author liugang
     *
     */
    public class FileTest {
    	public static void main(String[] args) {
    		@SuppressWarnings("resource")
    		Scanner sc = new Scanner(System.in);
    		while (true) {
    			System.out.println("请输入你要查询的路径:");
    			String src = sc.next();
    			if (src.equals("d:/aaa")) {
    				File file = new File(src);
    				File[] listFiles = file.listFiles();
    				//判断该文件夹下所有的大于.20M的所有的文件的绝对路径
    				if (listFiles != null) {
    					for (File file2 : listFiles) {
    						if (file2.isFile() &&file2.getName().endsWith(".wmv") &&file.length() > 20 * 1024 * 1024) {
    							System.out.println(file2.getAbsolutePath());
    						}
    					}
    					break;
    				}
    			} else {
    				System.out.println("您当前输入的路径不对,请重新输入");
    			}
    		}
    
    	}
    }
    
    

    IO概述
    站在内存的角度上,从其他的设备进入内存的,都是输入,从内存到其他的设备的都是输出,I/O就是用于设备之间的进行传递的数据交互的对象的所属的类型。
    字节流
    可以直接操作字节信息的流对象,根据流对象,可以分成字节输入流和字节输出流,顶层父类分别是:InputStream和OuputStream

    InputStream
    1.字节输入流的顶层父类
    2.常用的方法:
    int read(): 从当前的字节流获取一个字节
    int read(byte[] arr):将arr.length个字节,读取到arr中
    InputStream是一个抽象类,不能直接创建对象,只能由子类创建对象
    read():一次读取一个字节,返回值类型是int类型,原因是要把返回的字节的前面加上24个0.无论读取到的是负数还是整数,都会是变成整数,只要是从文件中读取的数据,都是整数,如果返回值是-1,说明不是从文件中读取的数据,而是专门为方法准备的文件末尾的标记,说明:虽然每次都调用了该方法,但是返回的却不同,因为文件的指针不断的向后移。

           //创建字节输入流对象,将输入流从磁盘的文件中读取到计算机的内存中
    		FileInputStream fis = new FileInputStream("a.txt");
    		//读取的字节
    		int ins;
    		while((ins = fis.read())!=-1) {
    			System.out.println((char)ins);
    		}
    		//关闭流
    		fis.close();
    
     public class FileInPutStreamDemo03 {
    	public static void main(String[] args) throws IOException {
    		//创建字节输入流对象,将输入流从磁盘的文件中读取到计算机的内存中
    		FileInputStream fis = new FileInputStream("a.txt");
    		byte[] arr = new byte[2];
    		//显然将你读取到的数据写到文件中去
    		int len =fis.read(arr);
    		System.out.println(Arrays.toString(arr) + ">>>" +new String(arr,0,len)+">>>"+len);
    		
    		len =fis.read(arr);
    		System.out.println(Arrays.toString(arr) + ">>>" +new String(arr,0,len)+">>>"+len);
    		
    		fis.close();
    	}
    }
    

    OutputStrea字节输出流
    1.字节输出流的顶层父类
    2.常用方法:
    write(int b) :将一个字节信息写到指定的设备中
    write(byte[] arr):将一个字节的所有的信息,写到指定的设备中
    write(byte[] arr,int offsert,int len):将一个字节数组从arr中的offert索引开始,共len字节写到指定的设备中
    3.字节输出流
    FileOutputStream(File f) 将f的描述的路径封装成字节输出流对象
    FileOutputStream(String path):将path描述的文件路径封装成字节输出流对象,使用字节输出流写入数据,关联到文件中

    package cn.ujiuye.inputOut;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * @author liugang
     *
     */
    public class FileOutStreamDemo06 {
        public static void main(String[] args) throws IOException {
        	//创建一个文件输出流对象
    		FileOutputStream fis = new FileOutputStream("y.txt");
    		//声明一个数组
    		byte[] arr = {100,101,102};
    		//fis.write(arr);
    		//将数组指定的元素填到指定的位置
    		fis.write(arr,0,2);
    		fis.close();
    	}
    }
    
    package cn.ujiuye.inputOut;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * @author liugang
        *    一个一个的拷贝
     */
    public class FileOutStreamDemo05 {
        public static void main(String[] args) throws IOException {
        	//创建一个文件输入流对象
        	FileInputStream fis = new FileInputStream("y.txt");
        	//创建一个文件输出流对象
    		FileOutputStream fos = new FileOutputStream("y.copy.txt");
    		int read;
    		while((read = fis.read())!=-1){
    			fos.write(read);
    		}
    		//关闭字节
    		fos.close();
    		fis.close();
    		
    	}
    }
    
    

    高效缓存流
    1.BufferedInputStream和BufferOutputStream
    2.是包装类型:本身不具备读写的功能,只是在具体的流对象的基础上,对其进行加强,例如FileInputStream和FileOutputStream,原本的效率较低,加强之后,就效率较高。

    package cn.ujiuye.inputOut;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * @author liugang
        *    一个一个的拷贝
     */
    public class BufferedOutStreamInputStream {
        public static void main(String[] args) throws IOException {
        	
        	long start = System.currentTimeMillis();
        	//创建一个文件输入流对象
        	FileInputStream fis = new FileInputStream("aa.avi");
        	//创建一个文件输出流对象
    		FileOutputStream fos = new FileOutputStream("bb.avi");
    		//加强版的输入流和输出流  高效缓存流
    		BufferedInputStream in = new BufferedInputStream(fis);
    		BufferedOutputStream out =  new BufferedOutputStream(fos);
    		//从文件中读取数据
    		int read;
    		while((read = in.read())!=-1) {
    			//把数据从内存中写到文件中去
    			out.write(read);
    		}
    		//关闭字节
    		in.close();
    		out.close();
    		long end = System.currentTimeMillis();
    		System.out.println(end - start);
    	}
    }
    
    

    字符流
    使用字符流处理字符的问题:
    1.使用字节流写字符
    可以使用,但是要先把字符串转化成字节数组,再储存在文件中,比较麻烦
    2,使用字节流读取字符
    如果是纯文本可以一次读取一个字节
    如果是存中文,可以一次读取两个字节(GBK)
    如果是中英文混砸,每次不知道读取多少字节,因此无论字节数组准备多大都会出现乱码
    解决方法:
    在GBK编码中,如果是一个英文,那么读取的字节是正数,如果读取的是正数,那么就可以断定是英文字符,就读取一个字节转化为字符即可。
    在GBK编码,如果是一个中文,那么就一定读取的是第一个字节是负数,如果读取的是一个负数,就说明读取到的就是一个中文,两个字节一起转化为字符。
    字符流的使用
    1.顶级顶层父类:Reader Writer
    2.常用方法:
    Reader:
    read():读取一个字符,返回值如果是-1,表达到达文件的末尾
    read(char[] arr):将一堆字符储存在一个字符数组中
    Writer:
    writer(int c):写出一个字符
    write(String str):写出一个字符串
    write(将一个字符数组的所有的内容写出)
    write(char[] arr,int offset,int len):将字符数组的一部分写到目标中
    3.抽象类不能直接创建子类。需要具体的子类来创建
    4.使用FileReader和FileWriter可以作为创建对象的类型

    public class FileReaderDemo01 {
        public static void main(String[] args) throws IOException {
    		//加载字符输入流对象
        	FileReader reader = new FileReader("a.txt");
    		//循环遍历,实现数据的读取操作,每次内部会根据其数据的特点会分配空间
        	int b;
    		while((b = reader.read()) != -1) {
    			System.out.println(b + "::" +(char)b);
    		}
    		reader.close();
    	}
    
    public class WriterDemo02 {
        public static void main(String[] args) throws IOException {
    		//字符输出流
        	FileWriter wr = new FileWriter("a.txt",true);
    		//直接写入你想写入的对象
        	wr.write("你好你好呀");
    		wr.write("谢女士,请问你还好吗?");
    		wr.write("加油");
    		wr.write("love");
    		wr.close();
    	}
    }
    
    public class WriterDemo03 {
        public static void main(String[] args) throws IOException {
    		//字符输入流
        	FileReader fr = new FileReader("a.txt");
        	//字符输出流
        	FileWriter wr = new FileWriter("a_copy.txt");
        	
        	//循环遍历数据实现复制操作
        	int b;
        	while((b = fr.read())!= -1) {
        		wr.write(b);
        	}
        	//关闭流对象
        	fr.close();
        	wr.close();
    	
    	}
    }
    

    字符流的拷贝
    1.使字符输入流读取信息,使用的字符流出流写出信息,完成文件的使用字符流拷贝
    2.字符流拷贝的必要性:
    没有必要使用字符流来进行拷贝,因为字符流会先将字节信息转化为字符,读取到内存中,最后还有把字符信息转化为字节信息,写到另外的一个文件中,中间做了两个没有意义的相反的操作,浪费了时间.
    应用场景:
    1.如果是在读取到字符以后,需要人为的阅读和修改这个字符,那么就使用字符流
    2.如果只是简单的将信息进行转移或者是拷贝,就不需要转成字符了
    在这里插入图片描述

    public class FileReaderDemo03 {
        public static void main(String[] args) throws IOException {
    		//创建字符输入流和字节输出流
        	FileReader fr = new FileReader("a.txt");
    		FileWriter fw = new FileWriter("a_capy1.txt");
    		//创建数组,一次读入一组字符,加快读的效率
    		char[] chs = new char[1024*8];
    		int b;
    		while((b = fr.read(chs))!=-1) {
    			fw.write(chs,0,b);
    		}
    		fr.close();
    		fw.close();
    	}
    }
    
    
    

    字符流不能操作非纯文本文件:因为当字符流读取到一个字节的时候,需要查询编码表是不是非纯文本,如果是,就有可能读取的字符无法转化成对应的字符,因为这个字节信息在编码表中没有对应的字符,就只能使用英文的?来代替,这一步就是对内容进行篡改,字符信息,后面再转化就不可能正确了.

    高效缓存字符流和高效缓存字节流基本上类似,就不多介绍了,下面举个例题来介绍一下:将文件夹中的第一行转化成最后一行,第二行转化成倒数第二行?

    package cn.ujiuye.writerreader;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author liugang
     *
     */
    public class BufferReadWriterTest {
        public static void main(String[] args) throws IOException {
        	//定义一个缓存字符输入流
    		BufferedReader br = new BufferedReader(new FileReader("x.txt"));
    		//定义一个集合
    		List<String> list = new ArrayList<String>();
    		//集合遍历
    		String line;
    		while((line = br.readLine())!=null) { //一行一行的读入数据,便于反转时读出方便
    			list.add(line);
    		}
    		br.close();
    		//定义一个字符输出流
    		BufferedWriter bw = new BufferedWriter(new FileWriter("x_copyfan.txt"));
    		//遍历集合倒序输出
    		for(int i = list.size()-1;i >= 0;i--) {
    			bw.write(list.get(i));
    			bw.newLine();              //换行操作
    		}
    		bw.close();
    	}
    }
    
    
    展开全文
  • pdf.js使用文件流预览pdf

    千次下载 热门讨论 2015-09-27 23:16:40
    网上大部分pdf.js都是用url方式预览pdf,此处给出pdf.js使用文件流预览pdf的Web工程; 此是maven工程; 100%能运行;
  • JS处理文件流

    万次阅读 2018-11-14 15:10:12
    然后后台开发看不下去了,就是转成文件流给我吧。他们那里是分布式部署,也没有办法持久化存储。遂发生了一下的故事 百度 没有怎么做过,肯定是百度啦,然后找打了一段代码,代码内容如下 function download() {.....

    最近做一个项目,遇到了一个问题,就是导出Excel功能。多普通呀,多大众化,哪里都有,可惜我们后台说给我JSON数据,自己处理。我果断拒绝了,拒绝的里有是我菜,实现不了啊。然后后台开发看不下去了,就是转成文件流给我吧。他们那里是分布式部署,也没有办法持久化存储。遂发生了一下的故事

    百度

    没有怎么做过,肯定是百度啦,然后找打了一段代码,代码内容如下

    function download() {
    	    var xmlResquest = new XMLHttpRequest();
    	    xmlResquest.open("POST", "/eksoft/fileUpload/download", true);
    	    xmlResquest.setRequestHeader("Content-type", "application/json");
    	    xmlResquest.setRequestHeader("Authorization", "Bearer 6cda86e3-ba1c-4737-972c-f815304932ee");
    	    xmlResquest.responseType = "blob";
    	    xmlResquest.onload = function (oEvent) {
    
    	    var content = xmlResquest.response;
    	    var elink = document.createElement('a');
    	    elink.download = "test.xlsx";
    	    elink.style.display = 'none';
    	    var blob = new Blob([content]);
    	    elink.href = URL.createObjectURL(blob);
    	    document.body.appendChild(elink);
    	     elink.click();
    	    document.body.removeChild(elink);
    	    };
    	     xmlResquest.send();
    }
    
    • 简单的分析了一下,自己有用的代码如下:
    var content = 'content';
    var elink = document.createElement('a');
    var blob = new Blob([content]);
    	elink.download = "test.xlsx";
    	elink.style.display = 'none';
    	elink.href = URL.createObjectURL(blob);
    	elink.click();
    	
    
    • 看到这里,发现有两个不认识的api,果断去mdn取经

    createObjectURL

    • URL.createObjectURL(), 静态方法,会创建一个DOMString,其中包含一个表示参数中给出的对象URL。这个URL的生命周期和创建他的窗口中的document绑定,这个新的URL对象表示File对象或者Blob对象。
    • 语法:objectURL = URL.createObjectURL(blob);

    revokeObjectURL

    • URL.revokeObjectURL静态方法。 来释放之前通过调用createObjectURL创建的已经存在的对象。当结束使用某个URL对象时,应该通过这个方法来访浏览器知道不再需要这个文件的引用了。
    • 语法:window.URL.revokeObjectURL(objectURL); bjectURL: 是一个 DOMString,表示通过调用 URL.createObjectURL 方法产生的 URL 对象

    DOMString

    • DOMString 是一个UTF-16字符串。由于JavaScript已经使用了这样的字符串,所以DOMString 直接映射到 一个String
    • null传递给接受DOMString的方法或参数时通常会把其stringifies为“null”。

    动手改造阶段

    • 通过有了以上的条件,具备了自己动手改造的条件。
    • 我的思路如下,
      • 通过fetch请求拿到数据流
      • 将下载的代码封装为一个函数
      • 将下载拿到的文件流直接传入该函数
      • 函数内部处理下载,然后删除该链接
    /**
     * 导出文件工具方法
     * 需要将返回的文件流对象直接传入,
     * 如果没有数据, 返回一个对象
     */
    export let exportFile = (data, name = 'name') => {
    	return data.blob().then((blob) => {
    		// js无法判断文件刘是否存在,只能通过类型
    		// 文件流没有数据的时候转码是/html结尾,我这个直接返回一个对象,方便调用的时候处理
    		if (blob.type.endsWith('/html')) {
    			return {
    				msg: "暂无数据"
    			}
    		}
    		let downloadUrl = window.URL.createObjectURL(blob);
    		let anchor = document.createElement("a");
    		let filename = data.headers.get('Content-Disposition');
    		anchor.href = downloadUrl;
    		anchor.download = filename.replace('filename=', '');
    		anchor.click();
    		window.URL.revokeObjectURL(downloadUrl);
    	})
    }
    
    // 调用文件导出方法
    async function export () {
        let res = await axios.post('http://xxx.com', {})
        let err = await exportFile(res.data, '推送日志')
    	if (err) message.warning(err.msg)
    }
    
    export()
    
    • 改造后的方法如上,在本地实现了文件流保存到磁盘。
    • 但是我代码到生产环境的时候发现fetch的response的type变了,在本地,response.type是base, 但是在线上去成了cors,嗯么么,具体别的没有感受到区别,就是报错了
    • 到了这里,当然是检查自己的代码…ok,检查响应头…ok,百度… 没有类似的情况。找后端同事商量…没有个所以然, 然后回头仔细看了一眼代码,提示filename.replace没有这个方法,索性自己慢慢的使用console.log查看,就是无法从data.headers中拿到文件描述了,然后在下载赋值文件名的时候报错了。
    • 遂自己和后台商量了一下,采用简单的规则,我自己本地指定文件名,不读取相应头了。更在如下
    /**
     * 导出文件工具方法
     * 需要将返回的文件流对象直接传入,
     * 如果没有数据, 返回一个对象
     * 文件命名规范为手动传入一个文件名,然后加上日期,时分秒
     */
    export let exportFile = (data, name = 'name') => {
    	return data.blob().then((blob) => {
    		if (blob.type.endsWith('/html')) {
    			return {
    				msg: "暂无数据"
    			}
    		}
    		let downloadUrl = window.URL.createObjectURL(blob);
    		let anchor = document.createElement("a");
    		anchor.href = downloadUrl;
    
    		anchor.download = `${name}${Format(new Date(), 'yyyyMMddhhmmss')}.csv`;
    		anchor.click();
    		window.URL.revokeObjectURL(downloadUrl);
    	})
    	
    
    }
    
    

    总结

    到了这里,简单的文件处理就结束了,后台又差了一下,说这个会有兼容性问题,然后有一段处理兼容的代码,我这里目前没有管ie,遂没有验证,但是还是把代码贴过来,留着总是好的

       if (window.navigator.msSaveOrOpenBlob) {
            navigator.msSaveBlob(blob, filename);
        } else {
    
        var a = document.createElement('a');
         blob.type = "application/excel";
         var url = createObjectURL(blob);
         a.href = url;
         a.download = filename;
         a.click();
         window.URL.revokeObjectURL(url);
        }
    
    展开全文
  • C#数据流:文件流、内存流、网络流

    千次阅读 2017-10-06 16:28:56
    System.IO下的Stream类是所有数据的基类,当我们对数据进行逐字节操作时,首先需要将数据转换为数据。C#数据主要分为三类:FileStream、MemoryStream、NetworkStream,还有常用的StreamReader、S

    全栈工程师开发手册 (作者:栾鹏)

    c#教程全解

    C#编程中数据流的使用一直不很熟练,没有一个系统的认识,但是它的重要性显然不言而喻。System.IO下的Stream类是所有数据流的基类,当我们对数据进行逐字节操作时,首先需要将数据转换为数据流。C#数据流主要分为三类:FileStream、MemoryStream、NetworkStream,还有常用的StreamReader、StreamWriter和TextWriter类等。

    1.FileStream(文件流),继承Stream类。

    由名字可以看到这个类主要是对文件进行操作的。得到FileStream对象的常用方式有如下两种:

    FileStream fs=new FileStream(string path,FileMode mode,FileAccess access);//利用构造函数创建,FileMode枚举和FileAccess枚举这里就不总结了。

    FileStream fs=File.OpenWrite(@“C:”);//还有File.Open、File.OpenRead、File.OpenText都用的很多。

    得到FileStream对象后,调用常见的Read和Write方法即可进行读写,如果要读写比1kb字节大的文件时可以加个while循环来获得数据。

    //写文件流
    string str = "hh";
    byte[] bytes1 = new byte[1024];
    bytes1 = Encoding.UTF8.GetBytes(str);
    FileStream fst = new FileStream("sd", FileMode.OpenOrCreate, FileAccess.Write);
    fst.Write(bytes1, 0, bytes1.Length);
    //读文件流
    FileStream fs = File.OpenRead("sd");
    byte[] bytes2 = new byte[1024];
    int num = fs.Read(bytes2, 0, bytes2.Length);
    

    2.MemoryStream,内存流

    它是以内存流的形式对内存中的字节数组进行操作,支持对数据流的查找和随机访问,和文件流一样可以使用Position属性得到内存流的当前位置。内存流的优点是对长度不定的数据进行缓存时,由于内存流是可以自动增长的,因此使用很方便。

    byte[] bytes=Encoding.UTF8.GetBytes("hh");
    using(MemoryStream ms=new MemoryStream())
    {
       ms.Write(bytes, 0, bytes.Length);
       byte[] byte2 = new byte[bytes.Length];
       ms.Position = 0;
       int n = ms.Read(byte2, 0, byte2.Length);
    }
    

    3.NetworkStream,网络流

    这个流在网络编程里使用非常普遍。当客户端程序与服务器程序进行通信时数据的接受与发送就要用到这个类,有一点要特别注意,NetworkStream类仅仅只支持面向连接的套接字,比如使用TcpClient编写聊天程序时,只有服务器与客户端的TcpClient进行了连接后才能使用NetworkStream。得到NetworkStream对象创建好后就可以利用网络流对象进行网络数据的传递,但是网络流对象是没有Position对象的,无法指定起始位置来进行读写。还有NetworkStream对象的CanSeek属性始终返回false,使用Position和Seek方法会出现异常。

    得到NetworkStream对象有2种方式,一种是利用socket对象获得,一种是利用TcpClient对象来获得,后者我用的非常多。

    	//写入数据到缓冲流
    
    NetworkStream ns = new NetworkStream(socket);
    
    NetworkStream ns = tcpClient.GetStream();
    
    if (ns.CanWrite)
    {
    
        byte[] bytes = Encoding.UTF8.GetBytes("hh");
    
        ns.Write(bytes, 0, bytes.Length);
    
    }
    
    //读取数据
    if (ns.CanRead)
    {
        int num;
        byte[] bytes = new byte[1024];
        while (ns.DataAvailable)
        {
            num = ns.Read(bytes, 0, bytes.Length);
        }
    }
    

    很明显,在实际编程中如果使用字节数组来接受或发送数据太麻烦了,后来从网络编程老师那学到了两个非常好用的类BinaryReader类和BinaryWriter类。我们在实际通信中使用最多的还是字符串通信,只要得到NetworkStream对象后,就可以得到字符串读取流和写入流,比如以下代码

    TcpClient tcp = new TcpClient();
    NetworkStream networkStream = new NetworkStream();
    BinaryReader reader;
    BinaryWriter writer;
    string msg = "hh";
    networkStream = tcp.GetStream();
    writer = new BinaryWriter(networkStream);
    writer.Write(msg);//写字符串
    string str = reader.ReadString();//读字符串
    

    还有StreamReader类和StreamWriter类用的也是比较多,比如读一个txt文档读到末尾,可以调用StreamReader对象的ReadToEnd方法来拿到这个txt的所有字符串内容。另外如果要对发送的数据进行加密的话,有一个CryptoStream类用起来也挺方便的,在创建这个对象时可以直接就指定采用的对称加密算法,比如DES加密算法。解密时也非常方便,只需要使用和加密时相同的密钥创建CryptoStream实例,并在创建实例时指定CryptoStreamMode为读模式,即可拿到解密后的数据。

    展开全文
  • 文件和文件流

    万次阅读 多人点赞 2019-08-08 20:16:26
    文件和文件流 1. File类 Java.io.File类可以获取文件以及文件夹的一些基本的属性 常用的方法 文件名称,路径,大小,判断是否存在,删除,创建 // 创建一个文件对象(可以是文件,可以是文件夹) File file = new ...
  • vue 接收后端文件流 并下载

    千次阅读 2021-11-09 16:37:49
    在vue框架中, 接收并下载文件流(blob对象)  可以通过将其转成blob对象,添加到a标签或者iframe标签中来模拟下载(或者pdf预览) 1.首先设置responseType对象格式为 blob:  responseType:‘blob’ 在项目reques....
  • java中文件的输入(FileInputStream)和输出(FileOutputStream),使用场景是什么,通过二者实现文件内容的写入和读取
  • Java实现文件写入——IO

    千次阅读 2021-02-12 14:52:34
    输入输出的重要性:输入和输出功能是Java对程序处理数据能力的提高,Java以的形式处理数据。是一组有序的数据序列,根据操作的类型,分为输入和输出。程序从输入读取数据,向输出写入数据。Java是面向...
  • 下载excel 文件流下载
  • C++ 文件流详解

    千次阅读 多人点赞 2020-02-05 14:20:31
    C++使用进行操作文件
  • 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> &...
  • 打印出后端返回的数据:乱码了 解决方法: 在前端请求的时候携带请求头responseType:blob, axios({ method: 'GET', url: '/api', params: params, responseType: 'blob' }).then(res=>...
  • 1.将headers配置中,Content-Type配置为multipart/form-data 2.根据接口的实际情况配置参数,我的是form-data 3.Body中的文件参数名称配置为file ,类型选择file,选择文件 运行结果
  • PostMan处理文件流,上传和下载文件流 一.遇到的问题 postman 进行call api的时候,如果得到的是文件,将会出现一堆乱码 二.解决方案 这时候可以直接下载 在返回body的右上角下载保存就行 也可以在call api的时候就...
  • java的几种IO读取文件方式

    千次阅读 2021-02-28 10:42:09
    一、超类:字节: InputStream(读入) OutputStream(写出)字符: Reader(字符 读入) Writer (字符写出)二、文件操作字节: FileInputStream ,FileOutputStream字符: FileReader, FileWriter(用法...
  • axios请求文件流下载文件

    万次阅读 2019-04-30 16:07:49
    axios.post('/api',{ // 传参 }, { responseType:'blob' // 设置响应数据类型 }) .then(res=>{ if (res.status == 200) { let url = window.URL.createObjectURL(new Blob([res.data])) ...
  • java 后台返回文件流到浏览器

    千次阅读 2021-02-28 10:44:51
    } @ApiOperation(value = "返回指定地址的文件流1") @ApiImplicitParams({ @ApiImplicitParam(name = "url", value = "图片地址", required = true, paramType = "query", defaultValue = "\\20180912\\7cd2e1a3-...
  • 前端文件流下载

    千次阅读 2020-12-23 15:27:47
    一、在vux中使用了 Axios 后,后端返回来的是文件流 这里我们可以直接用 Axios 方法返回的 res 赋值到 blob const blob = res const reader = new FileReader() reader.readAsDataURL(blob) reader.onload = ...
  • 输入输出含义和意义:输入和输出功能是Java对程序处理数据能力的提高,java以的形式处理数据。是一组有序的数据序列,根据操作类型,分为输入和输出。程序从输入读取数据,向输出写入数据。Java是面向...
  • Vue 前端显示文件流图片

    千次阅读 2020-08-07 15:17:53
    通过前端vue发送用户图片,后端flask进行处理后返回以文件流形式的图片。 前端代码 <template> <v-container> // 注意一个vue文件中只能有一个lable,否则npm run serve 会卡死 <input class=...
  • 文件输入和输出详解

    万次阅读 2018-06-24 14:30:38
    输出:就是以程序为中心点,程序中的数组或者其他的可以存储数据的东西中的内容输出到硬盘文件中,用write方法,需要用flush方法刷新一下,确保程序中的数组内容写出到硬盘文件中 按照传输的数据划分为字节和...
  • Java 安全 后端返回文件流

    千次阅读 2021-12-28 17:01:09
    1,起由 业务流程:上传文件——...根据请求执行后端的代码(代码逻辑:根据路径读取文件,输出文件流,响应给前端) 3,配置文件 配置上存文件的保存路径 4,代码: import org.apache.commons.io.IOUtils; @Va
  • js实现文件流下载文件

    万次阅读 2020-04-27 12:48:03
    } // 文件流转blob对象下载 function downloadFile(data, type, fileName) { let blob = new Blob([data], {type: `application/${type};charset=utf-8`}); // 获取heads中的filename文件名 let downloadElement = ...
  • C++文件输入/输出

    千次阅读 2022-03-24 19:16:48
    文章目录文件输入/输出类表5: 文件读写模式表6:ios_base 标识的组合意义ofstream:写入文件类例8:输出文本文件例9:输出二进制文件ifstream:从文件中读取的类例10:输入文本文件例11:输入二进制文件表7:...
  • FileReader可以读取idea默认编码格式(utf-8)的文件,读取系统默认编码(中文gbk)会产生乱码 gbk中文码表,使用两个字节存储一个中文,utf-8国际标准码表,使用三个字节存储一个中文 package file_main; import java....
  • 在react项目中用到下载,请求后端接口返回文件流,前端来处理文件流生成文件后下载。 要设置responseType!! 采用的方法就是百度上随便一搜就可以搜到的Blob方法,最开始要下载的文件格式为.pdf,但是下载完的文件...
  • Java文件流下载

    千次阅读 2019-06-06 18:12:26
    用java的形式输出到页面,实现文件下载 @RequestMapping(value = "/page/file/download") @ResponseBody public void download(HttpServletRequest request, HttpServletResponse response,String fileName) ...
  • 这里写自定义目录标题后台传文件流blob对象前端下载文件问题解决方案,转成bolb对象创建Blob对象创建链接 后台传文件流blob对象前端下载文件 问题 在页面下载文件时,可以根据路径如 a 标签的 href="" ,但是有时将...
  • 第一步: 首先肯定是导入插件,我是从官网直接下载,链接:点击打开链接,注意需要放在static文件目录下 注意:这里面有核心的pdf.js和pdf.worker.js,以及展示pdf的viewer页面把它作为静态资源来编译,基本想要的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,918,934
精华内容 767,573
关键字:

文件流是什么