java中流的详解

2023-10-25 13:38
文章标签 java 详解 中流

本文主要是介绍java中流的详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别

参考资料:

? 《core java》12章

? 使用Java操作文本文件的方法详解http://java.ccidnet.com/art/3737/20041108/523627_1.html

? FileReader 是什么类?和 FileInputStream 有什么不同???

http://book.hackbase.com/ask2/ask107572.htm

自己的整理和领会:

引言:

C语言只需要一个File*就可以了,与C不同,java有一系列流类型,其数量超过60种。类库的设计者声称:“有足够的理由为用户提供丰富的流类型的选择:这样做可以减少程序的错误。”例如,在C语言种,许多人认为“将输出流写入一个只读模式的文件”是很常见的错误。(事实上,这并不常见。)

我们认为在C++语言中,流接口设计者避免程序出错的主要“工具”是小心谨慎的态度,在java语言中更是如此。流库的高度复杂性迫使程序设计人员谨小慎微。

1. File类

1)File类介绍(《core java》638页)

File类封装了对用户机器的文件系统进行操作的功能。例如,可以用File类获得文件上次修改的时间移动,或者对文件进行删除、重命名。换句话说,流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。

File类的主要方法有:getName(),getCanonicalFile(),lastModified(),isDerector(),isFile(),getPath()等;

2)File类与FileInputStream类的区别:

流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。

File不属于文件流,只能代表一个文件或是目录的路径名而已。

提示:(《core java》639页)

如果处理文件或者目录名,就应该使用File对象,而不是字符串。例如,File类的equals方法知道一些文件系统对大小写是敏感的,目录尾的“/”字符无关紧要。

自己的领会:

FileInputStream类或者FileReader类的构造函数有多个,其中典型的两个分别为:一个使用File对象为参数;而另一个使用表示路径的String对象作为参数;自己以前一直觉得直接用了String指定路径就可以了,一直不明白为什么很多人都先构造一个File对象,现在终于明白了,“如果处理文件或者目录名,就应该使用File对象,而不是字符串。”!

2. FileInputStream类

1)FileInputStream类介绍:

以字节为单位(非unicode)的流处理。字节序列即:二进制数据。与编码无关,不存在乱码问题。

FileInputStream类的主要方法有:

Read(),read(byte[] b),read(byte[],int off,int len),available();

2)FileInputStream类与FileReader类的区别:

两个类的构造函数的形式和参数都是相同的,参数为File对象或者表示路径的String,它们到底有何区别呢?

? Readers and Writers work only on line based character data, so plain text files.

For anything else, you MUST use Streams.

? JDK5 API:

FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader.

FileReader is meant for reading streams of characters. For reading streams of raw bytes, consider using a FileInputStream.

? FileInputStream:以字节流方式读取;FileReader:把文件转换为字符流读入;

? InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。

? Reader类及其子类提供的字符流的读取char(16位,unicode编码),inputStream及其子类提供字节流的读取byte(8位),所以FileReader类是将文件按字符流的方式读取,FileInputStream则按字节流的方式读取文件;InputStreamReader可以将读如stream转换成字符流方式,是reader和stream之间的桥梁

? 最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类。

? FileInputStream类以二进制输入/输出,I/O速度快且效率搞,但是它的read()方法读到的是一个字节(二进制数据),很不利于人们阅读。

? 而FileReader类弥补了这个缺陷,可以以文本格式输入/输出,非常方便;比如可以使用while((ch = filereader.read())!=-1 )循环来读取文件;可以使用BufferedReader的readLine()方法一行一行的读取文本。

? 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader, InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader,它是字节转换为字符的桥梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。

? FileReader与InputStreamReader涉及编码转换(指定编码方式或者采用os默认编码),可能在不同的平台上出现乱码现象!而FileInputStream以二进制方式处理,不会出现乱码现象.

3)自己的领会:

? 如果处理纯文本文件,建议使用FileReader,因为更方便,也更适合阅读;但是要注意编码问题!

? 其他情况(处理非纯文本文件),FileInputStream是唯一的选择;FileInputStream是进Socket通讯时会用到很多,如将文件流是Stream的方式传向服务器!

3. FileReader类

1) FileReader类介绍:

InputStreamReader类的子类,所有方法(read()等)都从父类InputStreamReader中继承而来;

2) 与InputStreamReader类的区别:

? 自己的领会:

该类与它的父类InputStreamReader的主要不同在于构造函数,主要区别也就在于构造函数!从InputStreamReader的构造函数中看到,参数为InputStream和编码方式,可以看出,当要指定编码方式时,必须使用InputStreamReader类;而FileReader构造函数的参数与FileInputStream同,为File对象或表示path的String,可以看出,当要根据File对象或者String读取一个文件时,用FileReader;我想FileReader子类的作用也就在于这个小分工吧。

3) 一般用法:

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

  char[] buffer = new char[1024];

  int ch = 0;

  while((ch = fr.read())!=-1 )

  {

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

  }

4. InputStreamReader类

? 以文本格式输入/输出,可以指定编码格式;

? 主要方法:

getEncoding(),read();

? 一般用法:

InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));

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

  {

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

  }

5. BufferedReader类

? Jdk5 api:

Read text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.

? BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取分行文本很适合,BufferedReader是针对Reader的,不直接针对文件,也不是只针对文件读取。

? 一般用法:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));

  String data = null;

  while((data = br.readLine())!=null)

  {

   System.out.println(data);

  }

6. 总结以上内容,得出比较好的规范用法:

1) File file = new File ("hello.txt");

FileInputStream in=new FileInputStream(file);

2) File file = new File ("hello.txt");

FileInputStream in=new FileInputStream(file);

InputStreamReader inReader=new InputStreamReader(in);

BufferedReader bufReader=new BufferedReader(inReader);

3) File file = new File ("hello.txt");

FileReader fileReader=new FileReader(file);

BufferedReader bufReader=new BufferedReader(fileReader);

java文件操作example:

 1File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白import java.io.*;

 2File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白import java.util.*;

 3File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白public class Filestream File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白{

 4File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白    public static void main(String[] args)File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白{

 5File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白        tryFile,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白{

 6File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白            File path=new File("D:/text.txt");

 7File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白            BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(path)));

 8File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白            char[] cbuf=new char[10000];

 9File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白            br.read(cbuf);

10File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白            for(int i=0;i<cbuf.length;++i)File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白{

11File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白                System.out.print(cbuf[i]);

12File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白            }

13File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白        }catch(Exception e)File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白{

14File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白            e.printStackTrace();

15File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白        }

16File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白    }

17File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白}

18File,FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别(转)  - 木比白 - 木比白

这篇关于java中流的详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/282924

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听