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跨域问题分析与解决方法详解

    Java跨域问题分析与解决方法详解

    这篇文章主要介绍了Java跨域问题分析与解决方法,跨域问题是在Web应用程序中,由于同源策略的限制,导致浏览器无法发送跨域请求,也无法获取跨域响应的问题,感兴趣想要详细了解可以参考下文
    2023-05-05
  • java中如何把实体类转成json格式的字符串

    java中如何把实体类转成json格式的字符串

    这篇文章主要介绍了java中如何把实体类转成json格式的字符串问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • spring mvc配置bootstrap教程

    spring mvc配置bootstrap教程

    这篇文章主要为大家详细介绍了spring mvc配置bootstrap,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 如何通过一个注解实现MyBatis字段加解密

    如何通过一个注解实现MyBatis字段加解密

    用户隐私很重要,因此很多公司开始做数据加减密改造,下面这篇文章主要给大家介绍了关于如何通过一个注解实现MyBatis字段加解密的相关资料,需要的朋友可以参考下
    2022-02-02
  • redis发布订阅Java代码实现过程解析

    redis发布订阅Java代码实现过程解析

    这篇文章主要介绍了redis发布订阅Java代码实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java如何消除太多的if else判断示例代码

    java如何消除太多的if else判断示例代码

    这篇文章主要介绍了java如何消除太多的if else判断,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 详解Springboot Oauth2 Server搭建Oauth2认证服务

    详解Springboot Oauth2 Server搭建Oauth2认证服务

    这篇文章主要介绍了Springboot Oauth2 Server 搭建Oauth2认证服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • MyBatis-Plus框架整合详细方法

    MyBatis-Plus框架整合详细方法

    MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生这篇文章主要介绍了MyBatis-Plus框架整合,需要的朋友可以参考下
    2022-04-04
  • 详解Java中的流程控制

    详解Java中的流程控制

    今天带大家复习Java基础知识,文中对Java流程控制作了非常详细的介绍及代码示例,对正在学习Java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • SpringBoot绿叶显示yml和端口问题及解决方法

    SpringBoot绿叶显示yml和端口问题及解决方法

    今天是解决报错的一天,首先在操作Springboot中的时候,有些朋友的yml显示的不是绿叶的图标,或者是配置了之后不生效的问题,今天就给大家分享SpringBoot绿叶显示yml和端口问题,感兴趣的朋友一起看看吧
    2023-01-01

最新评论