java文件流介绍
- 格式:doc
- 大小:38.50 KB
- 文档页数:5
java后端返回文件流原理
Java后端返回文件流原理指的是,Java后端在向客户端返回文
件时所采用的一种技术。
具体而言,Java后端通过将文件以二进制
流的形式写入HTTP响应对象中,实现了文件在网络传输过程中的无
损传输。
客户端可以通过解析HTTP响应对象中的二进制流数据,将
文件保存至本地或进行其他操作。
Java后端返回文件流的实现过程可以分为以下几个步骤:
1. 创建HTTP响应对象:在Java后端处理完请求后,需要创建
一个HTTP响应对象,用于向客户端返回数据。
2. 设置响应头信息:在创建HTTP响应对象后,需要设置响应头信息,包括Content-Type(文件类型)、Content-Disposition(文
件名及文件下载方式)等。
3. 获取文件数据:Java后端需要获取将要返回的文件数据,可以通过FileInputStream、ByteArrayInputStream等方式将文件读取进内存中。
4. 写入响应对象:获取文件数据后,Java后端将文件数据以二进制流的形式写入HTTP响应对象中。
5. 发送响应数据:通过HTTP响应对象将文件数据发送给客户端,客户端可以通过解析响应对象中的二进制流数据,将文件保存至本地或进行其他操作。
总之,Java后端返回文件流的原理是将文件数据以二进制流的
形式写入HTTP响应对象中,客户端通过解析响应对象中的二进制流
数据来获取文件。
这种方式不仅可以有效避免文件在网络传输过程中的损失,而且可以支持各种类型的文件传输。
JavaIO流详解(三)----字节流InputStream和OutPutStream我们都知道在计算机中,⽆论是⽂本、图⽚、⾳频还是视频,所有的⽂件都是以⼆进制(字节)形式存在的,IO流中针对字节的输⼊输出提供了⼀系列的流,统称为字节流。
字节流是程序中最常⽤的流。
在JDK中,提供了两个抽象类InputStream和OutputStream,它们是字节流的顶级⽗类,所有的字节输⼊流都继承⾃InputStream,所有的字节输出流都继承⾃OutputStream。
既然⼆者是抽象类,那么就不能实例化,都是依赖于具体继承它们的⼦类去实现。
但⼆者抽象类中也包含它们各⾃的⽅法,如果我们先了解清楚抽象类中每⼀个⽅法的含义,那么对于后续具体的⼦类将会有⾮常⼤的帮助。
1、字节输⼊流InputStreamInputStream是所有字节输⼊流的⽗类,定义了所有字节输⼊流都具有的共同特征。
其内部提供的⽅法如下:image上图中的三个read()⽅法都是⽤来读数据的。
int read():每次读取⼀个字节,返回读取到的字节。
int read(byte[] b):每次读取b 数组长度的字节数,然后返回读取的字节的个数[注意与read() ⽅法的区别],读到末尾时返回-1。
int read(byte[] b,int off,int len):每次读取b 数组长度的字节数,从数组b 的索引为off 的位置开始,长度为len个字节。
⼩贴⼠:close⽅法,当完成流的操作时,必须调⽤此⽅法,释放系统资源。
其中InputStream的实现类FileInputStream是专门⽤于读取⽂件中的数据,通过它将⽬标设备上的数据读⼊到程序。
FileInputStream的构造⽅法:FileInputStream(File file):通过打开与实际⽂件的连接来创建⼀个FileInputStream ,该⽂件由⽂件系统中的File对象file命名。
文件流(File Stream)是计算机编程中用于处理文件的一种抽象概念。
它是一种将文件内容视为连续数据流的方式,允许程序以顺序或随机访问的方式读取或写入文件。
文件流通常被用于读取和写入文件,包括文本文件、二进制文件等。
在许多编程语言中,文件流通常由相应的文件流类(File Stream Class)来表示和操作。
通过文件流类,程序可以打开文件、读取文件内容、写入数据到文件、移动文件指针等操作。
常见的文件流类包括输入流(Input Stream)用于读取文件内容,输出流(Output Stream)用于向文件写入数据等。
文件流的概念使得程序能够以流的方式对文件进行操作,这种连续的方式更符合文件数据在磁盘上存储的实际情况,同时也提供了灵活性和效率。
通过文件流,程序可以按照需要从文件中读取数据,并且可以动态地向文件中写入数据,实现了对文件的灵活管理。
总的来说,文件流是一种对文件进行读写操作的抽象概念,它提供了一种便捷而灵活的方式来处理文件数据,是编程中常用的重要概念之一。
JAVA读取⽂件流,设置浏览器下载或直接预览操作最近项⽬需要在浏览器中通过URL预览图⽚。
但发现浏览器始终默认下载,⽽不是预览。
研究了⼀下,发现了问题:// 设置response的Header,注意这句,如果开启,默认浏览器会进⾏下载操作,如果注释掉,浏览器会默认预览。
response.addHeader("Content-Disposition", "attachment;filename=" + FileUtil.getOriginalFilename(path));然后需要注意:response.setContentType(contentType);//不同的⽂件类型,contentType不⼀样,⽐如图⽚⼀般是image/jpeg、image/png等@RequestMapping(value = "getFile/{folder}/{fileName:.+}*", method = RequestMethod.GET)public void getFile(HttpServletResponse response, @PathVariable String folder,@PathVariable String fileName){// 设置编码response.setCharacterEncoding("UTF-8");try{String path = folder + "/" + fileName;boolean flag = ossClient.doesObjectExist(ossProperties.getBucket(), path);// 判断⽂件是否存在if (flag){// 清空responseresponse.reset();// 设置response的Header,注意这句,如果开启,默认浏览器会进⾏下载操作,如果注释掉,浏览器会默认预览。
Java⾃学第10期——File类与IO流(输⼊输出流、处理流、转换流、缓冲流、Prope。
1、IO简介IO(输⼊输出)通过java.io包下的类和接⼝来⽀持,包下包括输⼊、输出两种IO流,每种输⼊输出流⼜可分为字符流和字节流两⼤类。
2、File类File类是io包下与平台⽆关的⽂件和⽬录,File能新建、删除、重命名⽂件和⽬录,不能访问⽂件本⾝,后者需要使⽤输⼊输⼊流。
2.1 构造⽅法File类的构造⽅法:File(File parent, String child) 参数:⽗路径,⼦路径根据 parent 抽象路径名和 child 路径名字符串创建⼀个新 File 实例。
File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建⼀个新 File 实例。
File(String parent, String child)根据 parent 路径名字符串和 child 路径名字符串创建⼀个新 File 实例。
File(URI uri)通过将给定的 file: URI 转换为⼀个抽象路径名来创建⼀个新的 File 实例。
2.2 静态⽅法File类静态⽅法:static String pathSeparator()与系统有关的路径分隔符,为了⽅便,它被表⽰为⼀个字符串。
static char pathSeparatorChar()与系统有关的路径分隔符。
static String separator()与系统有关的默认名称分隔符,为了⽅便,它被表⽰为⼀个字符串。
static char separatorChar()与系统有关的默认名称分隔符。
2.3 常⽤⽅法:2.3.1 获取相关public String getAbsolutePath()返回此File的绝对路径名字符串。
public String getPath()将此File转换为路径名字符串。
public String getName()返回由此File表⽰的⽂件或⽬录的名称。
一、File类常用的方法File类是Java中的一个核心类,用来表示文件或目录的抽象路径名。
以下是File类常用的方法:1. 创建File对象可以通过以下构造方法创建File对象:- File(String pathname):使用给定的路径名字符串或URI创建一个File实例。
- File(String parent, String child):从父路径名字符串和子路径名字符串创建一个新的File实例。
- File(File parent, String child):从父抽象路径名和子路径名字符串创建一个新的File实例。
2. 文件操作- boolean createNewFile():创建一个新的空文件。
- boolean delete():删除文件或目录。
- boolean exists():测试文件或目录是否存在。
- boolean isFile():测试是否为文件。
- boolean isDirectory():测试是否为目录。
- boolean renameTo(File dest):重命名文件或目录。
3. 文件属性- String getName():返回文件或目录的名称。
- String getPath():将文件的路径名转换成字符串。
- long lastModified():返回最后一次修改时间的毫秒数。
- long length():返回文件的长度。
4. 目录操作- String[] list():返回目录中的文件和目录的名称数组。
- File[] listFiles():返回目录中的文件和目录的File对象数组。
- boolean mkdir():创建此抽象路径名指定的目录。
- boolean delete():删除目录。
二、文件流的分类文件流是Java中用来对文件进行读写操作的流。
根据操作模式不同,可以分为输入流和输出流。
1. 输入流(InputStream)输入流用于从文件中读取数据。
第七章:输入和输出流第一节:数据流的基本概念1.在java中,把不同类型的输入、输出源抽象为流,其中输入或输出的数据成为数据流,用统一的接口表示。
2.数据流是指一组有顺序的、有起点和终点的字节集合。
程序从键盘接收数据或向文件中写数据,都可以使用数据流来完成。
3.流分为输入数据流和输出数据流。
输入数据流只能读不能写;而输出数据流只能写不能读。
从数据流中读取数据是,必须有一个数据源与该数据流相连(FileInput Stream in = new FileInputStream(“javatest.txt”);)(实例化)4.Java.io包中提供了表示数据流的4个基本抽象类(不可以实例化),分别是InputStream、OutputStream、Reader和Writer。
因此涉及数据流操作的程序中,几乎都要使用引入语句:import java.io.*5.为了使对象的状态能够方便地永久保存下来,java.io包中又提供了以字节流为基础的用于对象的永久化保存状态的机制,通过实现ObjectInput和Object Output接口来完成。
6.输入数据流提供的主要操作方法有:(得到-1,标志数据流结束)int read():从输入流读取一个字节的二进制数据int read( byte [ ] b):将多个字节读到数组中,填满整个数组int read( byte [ ] b ,int off , int len): 从输入流中读取长度为len的数据,从数组b中下标为off的位置开始放置读入的数据,读毕返回读取的字节数。
7.void close(): 关闭数据流int available(): 返回目前可以从数据流中读取的字节数long skip(long l): 跳过数据流中指定数量的字节不读取,返回值表示实际跳过的字节数8.如需要反向读取数据流,则使用回推操作(Push Back)Boolean markSupported(): 用于测试数据流是否支持回推操作void mark(int): 用于标记数据流的当前位置,并划出一个缓冲区,其大小至少为指定参数的大小。
Java后端HttpClientPost提交⽂件流及服务端接收⽂件流客户端将⽂件转换为流发送:依赖的包:<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.4</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.4</version></dependency>import com.alibaba.fastjson.JSONObject;import java.io.*;import .HttpURLConnection;import .URL;public static void main(String[] args) throws IOException {DataInputStream in = null;OutputStream out = null;HttpURLConnection conn = null;JSONObject resposeTxt = null;InputStream ins = null;ByteArrayOutputStream outStream = null;try {// URL url = new URL("http://192.168.3.11:8081/mes-boot-doc/test/fileupload?fileName=shafei.xls");URL url = new URL("http://localhost:8081/mes-boot-doc/test/fileupload?fileName=shafei.xls");conn = (HttpURLConnection) url.openConnection();// 发送POST请求必须设置如下两⾏conn.setDoOutput(true);conn.setUseCaches(false);conn.setRequestMethod("POST");conn.setRequestProperty("Content-Type", "text/html");conn.setRequestProperty("Cache-Control", "no-cache");conn.setRequestProperty("Charsert", "UTF-8");conn.connect();conn.setConnectTimeout(10000);out = conn.getOutputStream();File file = new File("C:/Users/Dell/Desktop/print/shafei.xls");in = new DataInputStream(new FileInputStream(file));int bytes = 0;byte[] buffer = new byte[1024];while ((bytes = in.read(buffer)) != -1) {out.write(buffer, 0, bytes);}out.flush();// 返回流if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {ins = conn.getInputStream();outStream = new ByteArrayOutputStream();byte[] data = new byte[1024];int count = -1;while ((count = ins.read(data, 0, 1024)) != -1) {outStream.write(data, 0, count);}data = null;resposeTxt = JSONObject.parseObject(new String(outStream.toByteArray(), "UTF-8"));}} catch (Exception e) {e.printStackTrace();} finally {if (in != null) {in.close();}if (out != null) {out.close();}if (ins != null) {ins.close();}if (outStream != null) {outStream.close();}if (conn != null) {conn.disconnect();}}}服务端接收⽂件流⽣成⽂件:@PostMapping("/fileupload")public String uploadFile(HttpServletRequest request,HttpServletResponse response) throws Exception{ String fileName = request.getParameter("fileName");("filename:"+fileName);// String fileName ="shafei.xls";// String fileFullPath = "C:/Users/Dell/Desktop/print/test/" + fileName;String fileFullPath = "/root/uploadfile/apache-tomcat-8.5.42/" + fileName;InputStream input = null;FileOutputStream fos = null;try {input = request.getInputStream();File file = new File("/root/uploadfile/apache-tomcat-8.5.42/");if(!file.exists()){file.mkdirs();}fos = new FileOutputStream(fileFullPath);int size = 0;byte[] buffer = new byte[1024];while ((size = input.read(buffer,0,1024)) != -1) {fos.write(buffer, 0, size);}//响应信息 json字符串格式Map<String,Object> responseMap = new HashMap<String,Object>();responseMap.put("flag", true);//⽣成响应的json字符串String jsonResponse = JSONObject.toJSONString(responseMap);sendResponse(jsonResponse,response);} catch (IOException e) {//响应信息 json字符串格式Map<String,Object> responseMap = new HashMap<String,Object>();responseMap.put("flag", false);responseMap.put("errorMsg", e.getMessage());String jsonResponse = JSONObject.toJSONString(responseMap);sendResponse(jsonResponse,response);} finally{if(input != null){input.close();}if(fos != null){fos.close();}}return null;}/*** 返回响应** @throws Exception*/private void sendResponse(String responseString,HttpServletResponse response) throws Exception { response.setContentType("application/json;charset=UTF-8");PrintWriter pw = null;try {pw = response.getWriter();pw.write(responseString);pw.flush();} finally {IOUtils.closeQuietly(pw);}}。
java 标准输出流Java 标准输出流。
Java 标准输出流是 Java 编程语言中的一个重要概念,它提供了一种将数据输出到控制台或其他输出目的地的机制。
在 Java 中,标准输出流通常被称为System.out,它是一个 PrintStream 类的实例。
通过标准输出流,开发人员可以将程序的输出信息发送到控制台,方便调试和查看程序运行状态。
本文将介绍 Java 标准输出流的基本概念、使用方法以及一些常见的应用场景。
1. 基本概念。
Java 标准输出流是 Java I/O 包中的一部分,它是一个输出流,用于向目的地输出数据。
标准输出流通常与 System.out 对象关联,开发人员可以通过System.out.println() 方法将数据输出到标准输出流。
标准输出流是一个字节流,它可以输出字节数据或字符数据。
在 Java 中,标准输出流是一个已经预定义好的输出流,开发人员无需创建新的输出流对象,只需直接使用即可。
2. 使用方法。
使用 Java 标准输出流非常简单,开发人员可以直接通过 System.out 对象调用println() 方法将数据输出到控制台。
例如:```java。
System.out.println("Hello, world!");```。
上述代码将字符串 "Hello, world!" 输出到标准输出流,然后在控制台上显示出来。
除了 println() 方法之外,System.out 对象还提供了其他一些输出方法,如print()、printf() 等,开发人员可以根据需要选择合适的输出方法。
3. 应用场景。
Java 标准输出流在开发中有着广泛的应用场景,它可以用于调试程序、输出程序执行结果、记录程序运行日志等。
在调试程序时,开发人员可以通过标准输出流输出变量的值、方法的执行结果等信息,帮助定位程序中的问题。
在程序执行结果输出时,标准输出流可以将程序的运行结果输出到控制台,方便用户查看。
Input / Output:指跨越出JVM的边界,与外界数据的源头或者目标数据源进行数据交换.输出Output------------------------------->JVM 数据源<-------------------------------输入Input注意:输入/输出是针对JVM 而言。
File 类可表示一个文件,也有可能是一个目录(在JA V A中文件和目录都属于这个类中,而且区分不是非常的明显,可以调用isDirectory()和isFile()来判断)。
File file = new File("c:\\abc.txt");常用的方法:exists() 用来判断文件或目录是否在硬盘存在。
isDirectory() 判断是否是目录isFile() 判断是否是文件mkdir() 创建目录mkdirs() 创建目录包括它下面的子目录。
getAbsolutePath() 得到文件绝对路径list() 得到文件名的String数组(得到当前目录下的文件名,目录名)listFiles() 返回File类型数组,(目录,文件的File对象)可用getName()得到文件名。
delete() 删除文件getName() 得到文件名getPath() 得到文件相对路径separtor() 得到文件分隔符//这个方法有更好的通用性,平台不同结果不同deleteOnExit() 在进程退出的时候删除文件,常用在临时文件的删除。
1、流的概念:输出流程序----------->文件、网络程序<-----------数据来源输入流2、流的分类:按处理方式来分:字节流:按8位传输InputStream OutputStream字符流:按16位传输Reader Writer按功能来分:节点流:与文件、网络打交道的流,操作数据的来源处理流(包装流):操作节点流如何区分:输入流:以InputStream、Reader结尾的流FileInputStream BufferedReader输出流:以OutputStream、Writer结尾的流FileOutputStream PrintWriter字节流:以InputStream、OutputStream结尾的流字符流:以Reader、Writer结尾的流节点流:看构造器,参数为数据来源,参数是String或File之类的new FileInputStream("d:\\abc.txt");new FileOutputStream(new File("d:\\abc.txt"))处理流:构造器的参数为其它流new BufferedReader(new InputStreamReader(new FileInputStream("d:\\abc.txt")));PrintWriter选择流时:首先确定是输入还是输出。
其次确定是字节流还是字符流。
然后确定是节点流还是处理流。
根据数据类型选择输入/输出流:①byte、byte[] InputStream / OutputStream②int、byte、char、double、String DataInputStream / DataOutputStream③char、String Reader / Writer④Object ObjectInputStream / ObjectOutputStream若考虑性能会在前试着加Buffered3、常用流:DataInputStream&DataOutputStream 用于读写基本类型数据,如int、float、long、double 和boolean等。
此外,DataInputStream的readUTF()方法还能读取采用UTF-8字符编码的字符串。
BufferedInputStream&BufferedOutputStream因为利用了缓冲区,所以常用于提高读写数据的效率。
BufferedInputStream先把一批数据读入到缓冲区,接下来read方法只需要从缓冲区内获得数据,减少了物理性读取数据的次数。
可以使用BufferedInputStream(InputStream in, int size) 中的size来指定缓冲区的大小ObjectOutputStream&ObjectInputStream对象的序列化是指把对象写到一个输出流中,对象的反序列化是指从一个输入流中读取一个对象。
Java语言要求只有实现了java.io.Serializable接口的类的对象才能序列化和反序列化Reader/Writer当需要程序读写文本文件,而且文本文件采用特定的字符编码集时,应采用Reader/Writer。
InputStreamReader & OutputStreamWriter 桥梁流把字节流转换成字符流在桥转换的时候可以指定编解码方式new BufferedReader(new InputStreamReader(new FileInputStream("d:\\abc.txt"), "utf8"));BufferedReaderreadLine()方法可以一次读入一行字符,以字符串形式返回。
PrintWriter 输出格式化的数据,所有的写数据的方法以print开头。
print (int i)print (long l)print (float f)print (String s)每个print() 方法都有一个println()方法对应a.printWriter.println("Hello");b.printWriter.print("Hello");printWriter.println();c.printWriter.print("Hello\n");以上三段代码是等价的4、JA V A编码问题:UTF-8,GBK,GB2312是可以显示中文的。
ASCII 一个字符-----1B 任何一种编码均兼容A<-->65ISO8859-1 (西欧) 一个字符-----1BGB2312 / GBK 一个字符-----2BUnicode 一个字符-----2B 会增加网络负担Java中的char是UnicodeUTF-8 变长字节(变长的Unicode方式)英文-----1B中文-----3B提供编码帮助的类:java.nio.charset.CharsetGBK---中、日、韩,gb2312是GBK的子集会出现中文编码问题的情况:1、用流操作文件时2、网页(动态、静态)3、网络传递信息时String--->乱码(再次转码)String temp=p.getProperty("name");temp=new String(temp.getBytes("ISO8859-1"),"GBK");这两处的编码有时需要互换位置对象序列化1:定义:把对象作为一个整体,在I/O流中传播2:语法:(1)实现了Serializeble接口的对象才能可序列化。
这个接口里没有任何方法,没有方法的接口称为标记接口。
例如:class Student implements Serializeble{}(2)如果一个序列化后的对象里面有一个属性是个对象属性,那么这个对象属性也需要实现序列化。
例如:class Student implements Serializeble{Teacher t;//必须序列化}class Teacher implements Serializeble{}(3)包名、类名、属性可以被序列化方法、构造器不会序列化所有的静态属性都不会被序列化用transient关键字修饰的属性是临时属性,临时属性不参与序列化。
(4)当父类实现Serializeble接口,子类自动实现。
对象序列化会创建对象,不调用构造,但子类实现Serializeble接口,父类没有实现实现Serializeble接口,父类在反序列化时会调用构造。
3:使用注意:a.用readObject读文件的时候,当文件结束的时候会抛出EOFException,当我们捕获这个异常的时候,程序就结束了。
Object o = null;while((o =ois.readObject()) != null) {}b.如果需要向一个文件中追加对象,首先要把文件中原有的对象读出来,再把原有对象和新追加的对象一起写入到文件。
c. serialVersionUID是静态常量,表示当前对象的版本号,在接受传输的数据时会自动检查该值,保证版本的相同。
java.util.Properties属性类,针对属性文件操作,早期使用。
好处是可以在不修改代码的情况下改变相应的需求。
文件名以.properties结尾的文件称为属性文件文件的内容是:名字=值的形式常用方法:public void load(InputStream inStream)throws IOExceptionpublic void store(OutputStream out,String comments)throws IOException public String getProperty(String key)public String getProperty(String key,String defaultValue)public Object setProperty(String key,String value)。