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用单向环形链表来解决约瑟夫环Josepfu问题

    Java用单向环形链表来解决约瑟夫环Josepfu问题

    如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是把尾节点的下一跳指向头结点
    2021-10-10
  • Spring中的事务操作、注解及XML配置详解

    Spring中的事务操作、注解及XML配置详解

    这篇文章主要给大家介绍了关于Spring中事务操作、注解及XML配置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • 探究springboot中的TomcatMetricsBinder

    探究springboot中的TomcatMetricsBinder

    springboot的TomcatMetricsBinder主要是接收ApplicationStartedEvent然后创建TomcatMetrics执行bindTo进行注册,TomcatMetrics主要注册了globalRequest、servlet、cache、threadPool、session相关的指标,本文给大家介绍的非常详细,需要的朋友参考下吧
    2023-11-11
  • Spring-AOP @AspectJ切点函数之@annotation()用法

    Spring-AOP @AspectJ切点函数之@annotation()用法

    这篇文章主要介绍了Spring-AOP @AspectJ切点函数之@annotation()用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 关于Mybatis-Plus Wrapper是否应该出现在Servcie类中

    关于Mybatis-Plus Wrapper是否应该出现在Servcie类中

    最近在做代码重构,代码工程采用了Controller/Service/Dao分层架构,Dao层使用了Mybatis-Plus框架,本文带领大家学习Mybatis-Plus Wrapper应该出现在Servcie类中吗,需要的朋友可以参考下
    2023-05-05
  • Java数据结构之链表的增删查改详解

    Java数据结构之链表的增删查改详解

    今天带大家来学习Java链表的增删改查的相关知识,文中有非常详细的代码示例,对正在学习Java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • Mybatis实现SQL存储流程详解

    Mybatis实现SQL存储流程详解

    MyBatis作为一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。它免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作
    2023-03-03
  • springboot2.5.0和redis整合配置详解

    springboot2.5.0和redis整合配置详解

    本篇文章向大家介绍springboot2.5.0 整合 redis 配置方法,教大家在pom添加依赖的方法如何调用redis,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • SpringBoot之Banner的使用示例

    SpringBoot之Banner的使用示例

    本篇文章主要介绍了SpringBoot之Banner的使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Spring Boot静态资源路径的配置与修改详解

    Spring Boot静态资源路径的配置与修改详解

    最近在做SpringBoot项目的时候遇到了“白页”问题,通过查资料对SpringBoot访问静态资源做了总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09

最新评论