【Java技术指南】「Java8技术盲区」让我们来看看新一代IO流的开发指引(流升级功能体系)

简介: 【Java技术指南】「Java8技术盲区」让我们来看看新一代IO流的开发指引(流升级功能体系)

IO流


在使用流时,让我们看看使用IO流是什么,一个流实例利用另一个流实例。


IO流具有的传输性

这将创建更高级别的功能,我们可以有一个流访问数据,然后有另一个流获取数据的结果并处理更复杂的功能。



IO流之间的透明化

这简化了可重用性,因为您可以以允许每个流执行特定工作的方式来组织流。这样,他们不需要知道彼此的内部运作方式。



IO流之间的传递性

  • 使用构造函数执行链接,构造流的更高级别的实例,然后传递一个较低级别的流的实例。
  • InputStreamReader类是IO流的一个很好的例子,此类通过在上提供读取行为来利用接收 InputStream,它将二进制响应转换为字符数组行为。


让我们看看它是如何工作的。


void doChain(InputStream in) throws IOException{
  int length;
  char[] buffer = new char[128];
  try(InputStreamReader rdr = new InputStreamReader(in)) {  
    while((length = rdr.read(buffer)) >= 0) {
    //do something
    }
   }
}
复制代码


IO流的工作本质


不需要关心其 InputStream工作原理。它是由文件支持还是由网络支持都没有关系。我们唯一知道的是它将给我们二进制数据,将其传递给我们InputStreamReader 并将其转换为二进制数据并可以将其作为字符数据使用。


注意,我们try-with-resources 也在这里使用。如果我们关闭InputStreamReader,它InputStream也会自动关闭,应该知道这是一个非常强大的概念。



文件操作IO流


经常使用流来访问文件。


java.io包中有几个要使用的类,例如:


  • FileReader
  • FileWriter
  • FileInputStream
  • FileOutputStream

真正的事实是这些文件流现在已被弃用,尽管如此,仍被广泛用于代码中,因此值得一提。



缓冲类型IO流


引入了缓冲流来替换java.io包中的File操作IO流类,这些新的Stream放在java.nio包下。这是必要的,因为直接文件访问可能效率低下,并且缓冲的流可以通过以下方式显着提高效率:


  • 缓冲内存中的内容
  • 大批量执行读/写
  • 减少底层流交互


缓冲可用于所有四种流类型:


  • BufferReader
  • BufferWriter
  • BufferedInputStream
  • BufferedOutputStream
try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))){
     int value; 
     while((value = br.read()) >= 0) {
        char charValue = (char)value;
       //do something
     }
}
复制代码



Buffered IO流的好处:


各种平台(如Windows或Unix)处理换行符,为当前平台使用正确的值


  • BufferedWriter有一种方法:newLine() ,它将创建一个具有适当字符的新行。
  • BufferedReader有一种基于行的读取方法:readLine()


让我们看看它们是如何工作的。


BufferedWriter:


void writeData(String[] data) throws IOException {
    try(BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"))){
    int value;
    for(String str : data) {
      bw.write(str);
      bw.newLine();
   }
}
复制代码


BufferedReader:
void readData(String[] data) throws IOException {
     try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))){
     String inValue;
     while((inValue = br.readLine()) != null) {
        System.out.println(inValue);
     }
}
复制代码



Java8专属程序包


Java 8中,不赞成使用java.io.FileXXX流。 有个用于处理文件流的新程序包,称为java.nio.file程序包。与java.io相比,该软件包有几个好处:


  • 更好的异常报告
  • 更大的可扩展性,它们在处理大文件时效果更好
  • 更多文件系统功能支持
  • 简化常见任务


Path和Paths类型


  • Path
  • 用于查找文件系统项
  • 它可以是文件或目录
  • Paths
  • 通过静态Path工厂方法获取Path对象
  • 基于字符串的分层路径或URI转换为Path。
  • 示例:Path p = Paths.get(“\documents\foo.txt”)



文件类型


  • 与文件交互的静态方法
  • 创建,复制,删除等


打开文件流


  1. newBufferedReader
  2. newBufferedWriter
  3. newInputStream
  4. newOutputStream


读取/写入文件内容


  1. readAllLines
  2. write

Reading Lines With BufferedReader(读取数据到数据缓冲流)

void readData(String[] data) throws IOException {
    try(BufferedReader br = Files.newBufferedReader(Paths.get("data.txt")){
        String inValue;
        while((inValue = br.readLine()) != null) {
           System.out.println(inValue);
        }
    }
}
复制代码

Read All lines(读取所有行数据)

void readAllLines(String[] data) throws IOException {
   List<String> lines = Files.readAllLines(Paths.get("data.txt"));
   for(String line:lines) {
        System.out.println();
   }
}
复制代码



文件系统


默认文件系统


当我们使用Java程序中的文件时,这些文件包含在文件系统中。最常见的是,我们使用计算机的默认文件系统。


Zip文件系统


Java还支持专用文件系统,例如Zip文件系统,路径实例绑定到文件系统,Path该类仅适用于默认实例。因此,我们需要另一个解决方案。幸运的是,在Java.nio包中,我们有机会对这一问题进行了处理。


文件系统类型


  • FileSystem:代表一个单独的文件系统,Path实例工厂
  • FileSystems:用于FileSystem 通过静态FileSystem 工厂方法获取对象,打开或创建文件系统newFileSystem


访问文件系统


URI标识的文件系统:zip文件系统使用“ jar:file ”

###文件系统支持自定义属性

每种文件系统类型不同

示例:字符串编码,如果不存在则是否创建

创建一个Zip文件系统

public static void main(String[] args) throws FileNotFoundException, IOException {
     try (FileSystem zipFileSystem = openZip(Paths.get("data.zip"))){ 
           //pass the Path
           where we would like to create our FileSystem
     }catch (Exception e) {
          System.out.println(e.getClass().getSimpleName() + " - " + e.getLocalizedMessage());;
     }
}
private static FileSystem openZip(Path path) throws URISyntaxException, IOException {
      Map<String, String> properties = new HashMap<>();
      properties.put("create", "true"); //set the property to allow creating
      //make a new URI from the path
      URI zipUri = new URI("jar:file", path.toUri().getPath(), null);
      FileSystem zipFileSystem = FileSystems.newFileSystem(zipUri, properties); 
      //create the filesystem
      return zipFileSystem;
}
复制代码


在上面的代码之后,您应该在目录中看到data.zip文件。


将文件复制到Zip文件系统


让我们通过文件复制操作来扩展上述示例。


在项目库中创建了一个名为file.txt的文件。会将这个文件复制到我们的data.zip文件系统中。

try (FileSystem zipFileSystem = openZip(Paths.get("data.zip"))){
      copyFileToZip(zipFileSystem); //Here we call the file copy
   }catch (Exception e) {
     System.out.println(e.getClass().getSimpleName() + " - " + e.getLocalizedMessage());;
   }
}
private static FileSystem openZip(Path path) throws URISyntaxException, IOException {
      Map<String, String> properties = new HashMap<>();
      properties.put("create", "true");
      URI zipUri = new URI("jar:file", path.toUri().getPath(), null);
      FileSystem zipFileSystem = FileSystems.newFileSystem(zipUri, properties);
      return zipFileSystem;
}
static void copyFileToZip(FileSystem zipFileSystem) throws IOException{
       Path sourceFile = FileSystems.getDefault().getPath("file.txt"); //Read the file to copy
       Path destFile = zipFileSystem.getPath("/fileCopied.txt"); //get the path of the new file
       Files.copy(sourceFile, destFile);//Copy the file to our zip FileSystem
}




相关文章
|
14天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
44 11
|
23天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
59 7
|
5天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
20天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
81 34
|
28天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
50 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
16天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
87 13
|
20天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
55 10
|
14天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
52 2
|
23天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
52 9