java获取本地文件的多种方式实现与比较

 更新时间:2023年11月17日 11:24:27   作者:deelless  
这篇文章主要为大家详细介绍了java获取本地文件的多种方式实现与结果比较,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

示例代码

废话少说,上测试代码

package com.example.demo.utils;

import java.io.*;
import java.util.Scanner;

public class TestCode {

	public static void main(String[] args) throws Exception,IOException{
//		testCode();
//		getFileContent();
//		getFileContentTwo();
		getFileContentThree();
	}

	//方法一
	public static void getFileContent() throws IOException{
		FileReader fr = new FileReader("E:\\testfile\\test_utf8.txt");
		BufferedReader br = new BufferedReader(fr);
		while(br.ready()){
			System.out.println(br.readLine());
		}
	}

	//方法二
	public static void getFileContentTwo() throws IOException{
		String encoding="GBK";
		File file=new File("E:\\testfile\\test.txt");
		//判断文件是否存在
		if(file.isFile() && file.exists()) {
			//考虑到编码格式
			InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
			BufferedReader bufferedReader = new BufferedReader(read);
			String lineTxt = null;
			while ((lineTxt = bufferedReader.readLine()) != null) {
				System.out.println(lineTxt);
			}
			read.close();
		}else {
			System.out.println("该文件不存在");
		}
	}

	//方法三
	public static void getFileContentThree() throws IOException{
		Scanner in = new Scanner(new File("E:\\testfile\\test_utf8.txt"));
		while (in.hasNextLine()) {
			System.out.println(in.nextLine());
		}
	}

	/**
	 *
	 *@param:
	 *@return:获得txt文件编码格式
	 *@Date:2019/8/26
	 */
	public static void testCode() throws Exception{
		BufferedInputStream bin=new BufferedInputStream(new FileInputStream("E:\\testfile\\test.txt"));
		int p=(bin.read()<<8)+bin.read();
		String code=null;
		switch (p){
			case 0xefbb:
				code="UTF-8";
				break;
			case 0xfffe:
				code="Unicode";
				break;
			case 0xfeff:
				code="UTF-16BE";
				break;
			default:
				code="GBK";
		}
		System.out.println(String.format("测试文件的编码格式是:"+code));
	}

}

相同点:

三种方法都可以读取到本地磁盘下的tex文件内容

三种方法读取编码格式为utf-8的文件,都可以正常输出

区别:

方法一、方法三输出编码格式为GBK的文件,会有问题 ———— 方法一控制台输出的文件内容会乱码、方法三则什么也不输出

方法二读取编码格式为GBK的文件,可以正常输出

测试结果

方法一、方法二、方法三

文件编码:utf_8

方法一

文件编码:GBK

方法二

文件编码:GBK

方法三

文件编码:GBK

概念

计算机中文件都用一堆二进制的数字 0 、1保存的。文件的编码格式指的是这个文件的内容和0、 1的一个对应关系。因此,可以得到两个结论:

1.一个文件的编码格式有且仅有一种。(要么是utf-8,要么是gbk,要么是其他编码,不能几种同时存在)

2.文件的编码格式可以改变。

分析:读取文件乱码的原因是什么?

文件的编码格式指的是一个对应关系。对应关系错了,肯定拿不到文件中的内容。所以乱码的根源就是保存文件的编码格式和读取文件的编码格式不同。

知道了文件乱码的原因就好解决问题了

java中只有在转换流中才能设置读取流文件中编码格式。(代码示例详见上述方法二)

其他字节流,字符流读取的文件格式都是默认的utf-8,无法设置编码格式。这种方法读取utf-8的文件不会有问题,一旦非utf-8就会出错。

所以,上面方法二虽然代码量最多,但优势也显而易见——健壮性、稳定性、扩展性都优于方法一、三。

补充:

字符流:txt文件。该流只能处理字符,但处理字符速度很快

字节流:txt文件,Excel文件,word文件、图片、视频等文件。可以处理所有以bit为单位储存的文件,也就是说可以处理所有的文件,但是在处理字符上的速度不如字符流

除了字符流和字节流之外,还有转换流:

  • InputStreamReader:
  • OutputStreamWriter:

转换流可以把字节流转化为字符流,可以解决编码格式和解码格式不一致的问题。

字符流文件和字节流文件的区别在于计算机用来保存文件的二进制编码0 、1的位数。

字符流就是一个字符由一个8位数的二进制数表示;

字节流表示一个基本存储单元的二进制数可能是8位,也可能是16位,32位等。

因此字符流可以理解为特殊的字节流。

以上就是java获取本地文件的多种方式实现与比较的详细内容,更多关于java获取本地文件的资料请关注脚本之家其它相关文章!

相关文章

  • Java 输入多行字符串或者多个int数值的方法

    Java 输入多行字符串或者多个int数值的方法

    今天小编就为大家分享一篇Java 输入多行字符串或者多个int数值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java之String字符串在JVM中的存储及其内存地址的问题

    Java之String字符串在JVM中的存储及其内存地址的问题

    这篇文章主要介绍了Java之String字符串在JVM中的存储及其内存地址的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • spring  mybatis多数据源实例详解

    spring mybatis多数据源实例详解

    本文主要介绍sping mybatis多数据源处理,在开发过程中经常会遇到多个数据库,这里给大家举例说明如何处理,希望能帮助有需要的小伙伴
    2016-07-07
  • Spark Streaming算子开发实例

    Spark Streaming算子开发实例

    这篇文章主要介绍了Spark Streaming算子开发实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • spring boot中的properties参数配置详解

    spring boot中的properties参数配置详解

    这篇文章主要介绍了spring boot中的properties参数配置,需要的朋友可以参考下
    2017-09-09
  • springMVC如何防止表单重复提交详解

    springMVC如何防止表单重复提交详解

    平时开发的项目中经常会遇到表单重复提交,造成数据重复,增加服务器负载,严重甚至会造成服务器宕机,因此有效防止表单重复提交有一定的必要性,这篇文章主要给大家介绍了关于springMVC如何防止表单重复提交的相关资料,需要的朋友可以参考下
    2021-11-11
  • JAVA中实现链式操作(方法链)的简单例子

    JAVA中实现链式操作(方法链)的简单例子

    这篇文章主要介绍了JAVA中实现链式操作的例子,模仿jQuery的方法链实现,需要的朋友可以参考下
    2014-04-04
  • Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路

    Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路

    这篇文章主要介绍了Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Maven依赖junit @Test报错的解决方案

    Maven依赖junit @Test报错的解决方案

    这篇文章主要介绍了Maven依赖junit @Test报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 一文了解Seata的实现原理

    一文了解Seata的实现原理

    随着业务发展,单体系统逐渐无法满足业务的需求,分布式架构逐渐成为大型互联网平台首选。伴随而来的问题是,本地事务方案已经无法满足,分布式事务相关规范和框架应运而生。本文主要介绍Seata的实现原理
    2021-06-06

最新评论