`
songylwq
  • 浏览: 126524 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

java file inputstream string 相互转换

 
阅读更多

利用IOUTILS和FILEUTILS很方便的在FILE STRING 和 INPUTSTREAM之间进行转换

InputStreamReader是字节流转成字符流的桥梁用来处理文本文件
利用BufferedReader包装InputStreamReader达到较好的性能
BufferedReader的readLine为读行

1 ) File 类介绍

File 类封装了对用户机器的文件系统进行操作的功能。例如,可以用 File 类获得文件上次修改的时间移动,

或者对文件进行删除、重命名。换句话说,流类关注的是文件内容,而 File 类关注的是文件在磁盘上的存储

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


2 ) File 类与 FileInputStream 类的区别:

流类关注的是文件内容,而 File 类关注的是文件在磁盘上的存储。
File 不属于文件流 , 只能代表一个文件或是目录的路径名而已。
提示:

如果处理文件或者目录名,就应该使用 File 对象,而不是字符串。例如, File 类的 equals 方法知道一些

文件系统对大小写是敏感的,目录尾的“ / ”字符无关紧要。

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

FileInputStream 类

1 ) FileInputStream 类介绍:

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

FileInputStream 类的主要方法有:

Read (), read ( byte[] b ), read ( byte[],int off,int len ) ,available();
2 ) FileInputStream 类与 FileReader 类的区别:

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

呢?

FileInputStream :以字节流方式读取;

FileReader :把文件转换为字符流读入;
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出

来的是char数组或者String ,使用InputStream读取出来的是byte数组。


Reader类及其子类提供的字符流的读取char,inputStream及其子类提供字节流的读取byte,所以 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 以二进制方式处理,不会出现乱码现象 .

如果处理纯文本文件,建议使用 FileReader ,因为更方便,也更适合阅读;但是要注意编码问题!其他情况(处理非纯文本文件),FileInputStream是唯一的选择;FileInputStream是进Socket通讯时会用到很多,如将文件流是Stream的方式传向服务器!

FileReader 类

FileReader 类介绍:

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

与 InputStreamReader 类的区别:

该类与它的父类 InputStreamReader 的主要不同在于构造函数,主要区别也就在于构造函数!从

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

一般用法:

FileReader fr = new FileReader("ming.txt");
   char[] buffer = new char[1024];
   int ch = 0;
   while((ch = fr.read())!=-1 )
   {
    System.out.print((char)ch);
   }

InputStreamReader 类

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

主要方法:

getEncoding (),read();

一般用法:

InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
   while((ch = isr.read())!=-1)
   {
    System.out.print((char)ch);
   }

BufferedReader 类

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);
  }


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

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);


1)
File file = new File ("hello.txt");
FileInputStream in=new FileInputStream(file);
InputStreamReader inReader=new InputStreamReader(in);
BufferedReader bufReader=new BufferedReader(inReader);

2)
FileInputStream in=null;
File file = new File ("hello.txt");
in=new FileInputStream(file);
BufferedReader bufReader=new BufferedReader(new InputStreamReader(in));

3)
File file = new File ("hello.txt");
BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));

上述两种写法的微小区别:
a)第二种方式中把“FileInputStream in=null;”定义单独放在开始处,说明下面应该还有要用到in对象变量的地方;(BufferedReader处用了)

b)第二种方式没有定义InputStreamReader的对象变量,直接在BufferedReader的构造函数中new一个,
这种方式与第一种方式的主要区别:InputStreamReader对象只使用一次!

这对于在这里只需要使用一次这个InputStreamReader对象的应用来说更好;无需定义InputStreamReader的对象变量,接收由new返回的该对象的引用,因为下面的程序中不需要这个 InputStreamReader的对象变量,所以无需定义;所以这种情况下,第二种方式比第一种更好一些。

c)第三种方式中,典型的三层嵌套委派关系,清晰看出Reader的委派模式(《corejava》12章有图描述该委派关系),FileInputStream和InputStreamReader都没有定义变量,new生成的对象都只是使用一次。

d)三种方式的区别也就在于FileInputStream和InputStreamReader对象是否都只使用一次,是否需要定义它们的对象变量,以及个人的编码习惯。

e)但是要注意异常处理,FileInputStream(file)会抛出NotFileFoundException,如果采用surround方式
(try&catch)处理,应该用第二种方式,这样可以用System.out.println提示文件未找到;
当然在函数名后使用throws Exception,然后用第三种方式也行,但似乎这适合有用户界面的情况,把异常抛出在客户端在处理。

分享到:
评论

相关推荐

    java 中InputStream,String,File之间的相互转化对比

    主要介绍了java 中InputStream,String,File之间的相互转化对比的相关资料,需要的朋友可以参考下

    Java文件处理工具类--FileUtil

    public static String readFileAsString(InputStream in) throws Exception { String content = new String(readFileBinary(in)); return content; } /** * Read content from local file to binary byte...

    java excel导入导出工具

    一个在 Java 对象和 Excel 文档之间进行转换的迅速而灵活的工具 1、Excel导出:支持Java对象装换为Excel,...2、Excel导入:支持Excel转换为Java对象,并且支持File、InputStream、文件路径、Workbook等多种导入方式;

    java7源码-java-convert-example:本项目记录一些常见对象转换的方法,例如:文件转换、日期时间转换、stream流转换、

    平时的java项目中会存在各种对象的互相转换的情况,本项目记录一些常见对象转换的方法,例如:文件转换、日期时间转换、stream流转换、集合对象转换等 文件 Java 为文件操作设计了很多的类,有数据相关的 IO Stream ...

    JAVA基础课程讲义

    字符串(java.lang.String类)的使用 90 字符串相等的判断 92 思考作业 93 上机作业 94 第四章 异常机制 95 导引问题 95 异常(Exception)的概念 96 异常分类 96 Error 97 Error和Exception的区别 97 Exception 97 ...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    计算机网络实验报告 获取MAC socket通信

    java.io.InputStream is = new java.io.DataInputStream( sk.getInputStream()); // 接受网络输入流 写入文件 int len = 0; byte[] buff = new byte[1024]; while((len=is.read(buff))!=-1){ fos....

    java基础案例与开发详解案例源码全

    13.1 java.io.File类328 13.1.1 文件和目录是什么?328 13.1.2 Java对文件和目录的操作328 13.2 JavaIO原理332 13.3 流类结构333 13.3.1 InputStream和OutputStream333 13.3.2 Reader和Writer334 13.4 文件流336 ...

    java 编程入门思考

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    Java初学者入门教学

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    java联想(中文)

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    java编程基础,应用与实例

    12.1 java.lang.String 164 12.2 java.lang.StringBuffer 167 12.3 wrapper class 169 12.4 java.lang.Math类 172 12.5 java.Math.BigInteger类 174 12.6 java.Math.BigDecimal类 176 12.7 巩固练习 ...

    java 编写文件上传类简单易用

    int bytesLen(String s) 返回字符串转化为字节数组后,字节数组的长度 这样,从一个字节数组中,根据标记提取出另一个字节数组可以表示如下: 假设我们已经将数据存入字节数组 buffer 中,分界符存入 ...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...

    JAVA_Thinking in Java

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    Thinking in Java 中文第四版+习题答案

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    Thinking in Java简体中文(全)

    12.4.4 String和StringBuffer类 12.4.5 字串的特殊性 12.5 总结 12.6 练习 第13章 创建窗口和程序片 13.1 为何要用AWT? 13.2 基本程序片 13.2.1 程序片的测试 13.2.2 一个更图形化的例子 13.2.3 框架方法的演示 ...

    java 面试题 总结

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    office在线查看

    <%@ page language="java" import="java.lang.String" pageEncoding="UTF-8"%> String path = request.getContextPath(); String getFilePath = request.getParameter("recFileName"); String basePath = request....

    Java之IO流学习总结

    StringBufferInputStream 已经被Deprecated,本身就不应该出现在InputStream 部分,主要因为String 应该属于字符流的范围。已经被废弃了,当然输出部分也没有必要需要它了!还允许它存在只是为了保持版本的向下兼容...

Global site tag (gtag.js) - Google Analytics