Java 读取文件系列知识1

Java 读取文件

读取文件内容是我们经常使用的一种操作,但是在使用的过程中我们往往会出现这样、那样的问题。接下来,主要介绍一下使用Java 语言实现文件的读取。

可以将读取的过程分为一下步骤:

(1)获取需要被读取的文件

(2)构造一个字节输入流,用来读取文件。

(3)为了提高读写的速度,需要把字节流转化成字符流。

(4)写文件

因此我们需要了解File、FileInputStream和InputStreamReader 各自的作用。

File 类

文件和目录路径名的抽象表示,用户界面和操作系统使用依赖于系统的路径名字符串命名文件和目录。这个类提示了一个抽象的,独立于系统层次化路径名试图。

File 常见的构造方法:

构造方法的描述

File(File parent, String child)
从抽象路径名中和子路径名字符串创建新的File实例。
​
File(String pathname)
通过将给定的路径名字字符串转换为抽象路径名来创建新的File 实例
​
File(URL url)
通过将给定的file: URL 转换为抽象路径名来创建新的File 实例
​

FileInputStream 类 继承了java io 类操作的父类: InputStream。 FileInputStream 从文件系统中文件获取输入字节FileInputStream 用于读取如图像数据的原始字节流。要使用字符串,需要使用FileReader。

构造方法包括:

public class FileInputStream extends InputStream
​
FileInputStream(File file)
通过打开与实际文件的连接创建一个FileInputStream, 该文件由文件系统中的File 对象 file 命名。
​
FileInputStream(FileDescriptor fdObj)
创建FileInputStream 通过使用文件描述符fdObj,其表示在文件系统中的现有连接到一个实际的文件。
​
FileInputStream(String name)
通过打开与实际文件的连接来创建一个FileInputStream, 该文件由文件系统中的路径名name 命名。

InputStreamReader 类

从字节流到字符流的桥,它读取字节,并使用指定的charset 将其解码为字符。

构造方法如下:

InputStreamReader(InputStream in)
创建一个使用默认字符集的InputStreamReader。
​
InputStreamReader(InputStream in, Charset cs)
创建一个使用给的字符集的InputStreamReader。
​
InputStreamReader(InputStream in, CharsetDecoder dec)
创建一个使用给定字符集解码器的InputStreamReader
​
InputStreamReader(InputStream in, String charseName)
创建一个使用命名字符集的InputStreamReader
​

如何理解字节流到字符流的桥梁?

(1)计算机存储的单位是字节

(2)字节流读取是单字节读取

(3)一个流把字节流读取的字节进行缓存而而后再通过字符集上解码成字符返回,因而形式上看是字符流

(4)InputStreadReader 流就是起到这个作用,实现从字节流到字符流的转换。

使用指定的字符集读取字节并将它们解码为字符?

字节本质是8个二进制位,且不同的字符集对同一个字节解码后的字符结果不同,因此在读取字符时,务必需要指定合适的字符集,否则读取的内容会产生乱码。

读取文件

public static void main(String [] args){
  // 第一步 指定需要被指定的文件
  File file = new File("文件路径");
  
  // 第二步构造一个字节输入流 FileInputStream
  // method 1 通过文件创建FileInputStream
  FileInputStream fileInputStream = new FileInputStream(file);
  
  // method 2 通过文件名创建FileInputStream
  FileInputStream fileInputStream1 = new FileInputStream(file.getAbsolutePath());
  
  // 第三步 构造字符输入流,指定字符编码
  InputStreamReader inputStreamReader = new FileInputStream(fileInputStream, "utf-8");
  
  // 第四步,读取文件
  char [] ch = new char[2014];
  int len = inputStream.read(ch);
  
  System.err.println(new String(ch, 0, len));
  
  // 关闭流并释放与之相关联的任何系统资源
  inputStream.close();
  
  try{
  }catch (Exception e){
    log.info("读取文件异常结束,错误信息:{}", e.getMessage());
  }
  
  
  
}

读取二进制文件,并存入byte数组:

public byte[] readFromByteFile(String pathname)  throws IOEception{
  File filename = new File(pathname);
  BufferedInputStream in = new BufferedInputStream(new FileInputStream(filename));
  ByteArrayOutputStream out =  new ByteArrayOutputStream(1024);
  byte[] temp = new byte[1024];
  int size = 0;
  while((size = in.read(temp)) != -1){
    our.write(temp, 0, size);
  }
  in.close();
  byte[] content = out.toByteArray();
  
  return content;
}

读取文本文件,每次读取文件的一行内容,并把结果存入字符串数组中

public ArrayList<String> readFromTextFile(String pathname) throws IOEception{
  ArrayList<String> strArray = new ArrayList<String>();
  File filename = new File(pathname);
  InputStreamReader reader = new InputStreamReader(new FileInputStream(filename));
  BufferedReader br = new BufferedReader(reader);
  String line = "";
  line = br.readLine();
  while(line != null){
    strArray.add(line);
    line = br.readLine();
  }
  return strArray;
}

BufferReader

BufferedReader 类从字符输入流中流入读取文本并缓冲字符,以便有效地读取字符,数组和行。

readLine() 方法

BuffereredInputStream

FileReader

FileReader 类是从InputStreamReader 继承而来,该类按照字符读取流中数据。

Stream

Java 8 的新特性,新的抽象处理流的方式,。

Java IO 子节流

Java 的 IO 流就是用于读取文件内容的一种设计,它能完成将磁盘文件内容输出到磁盘文件的数据传输。

Java 流主要包括两部分: 一类是针对二进制文件的字节流,一类是针对文本文件的字符流。

文件字节流

FileInputStream
FileOutputStream

字节数据流

ByteArrayInputStream
ByteArrayOutputStream

装饰者流

缓冲数据流:
   BufferedInputStream
   BufferedOutputStream
基本类型数据流:
    DataInputStream
    DataOutputStream

对象序列化流

ObjectInputStream
ObjectOutputStream

序列流

SequenceInputStream
SequenceOutputStream

基类字节流Input/OutputStream

分别作为读字节流和写字节流的基类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值