java 无损读取文本文件

简介:

Java 如何无损读取文本文件呢?

以下是有损

Java代码   收藏代码
  1. @Deprecated  
  2.     public static String getFullContent(File file, String charset) {  
  3.         BufferedReader reader = null;  
  4.         if (!file.exists()) {  
  5.             System.out.println("getFullContent: file(" + file.getAbsolutePath()  
  6.                     + ") does not exist.");  
  7.             return null;  
  8.         }  
  9.         if (charset == null) {  
  10.             charset = SystemHWUtil.CHARSET_ISO88591;  
  11.         }  
  12.         try {  
  13.             reader = getBufferReaderFromFile(file, charset);  
  14.             return getFullContent(reader);  
  15.         } catch (FileNotFoundException e1) {  
  16.             e1.printStackTrace();  
  17.         } finally {  
  18.             if (null != reader) {  
  19.                 try {  
  20.                     reader.close();  
  21.                 } catch (IOException e) {  
  22.                     e.printStackTrace();  
  23.                 }  
  24.             }  
  25.         }  
  26.         return null;  
  27.     }  
  28.   
  29. public static BufferedReader getBufferReaderFromFile(File file,  
  30.             String charset) throws FileNotFoundException {  
  31.         InputStream ss = new FileInputStream(file);  
  32.         InputStreamReader ireader;  
  33.         BufferedReader reader = null;  
  34.         try {  
  35.             if (charset == null) {  
  36.                 ireader = new InputStreamReader(ss,  
  37.                         SystemHWUtil.CHARSET_ISO88591);  
  38.             } else {  
  39.                 ireader = new InputStreamReader(ss, charset);  
  40.             }  
  41.             reader = new BufferedReader(ireader);  
  42.         } catch (UnsupportedEncodingException e) {  
  43.             e.printStackTrace();  
  44.         }  
  45.   
  46.         return reader;  
  47.     }  
  48.   
  49. /** 
  50.      * have closed reader 
  51.      *  
  52.      * @param reader 
  53.      * @return 
  54.      */  
  55.     @Deprecated  
  56.     public static String getFullContent(BufferedReader reader) {  
  57.         StringBuilder sb = new StringBuilder();  
  58.         String readedLine = null;  
  59.         try {  
  60.             while ((readedLine = reader.readLine()) != null) {  
  61.                 sb.append(readedLine);  
  62.                 sb.append(SystemHWUtil.CRLF);  
  63.             }  
  64.         } catch (IOException e) {  
  65.             e.printStackTrace();  
  66.         } finally {  
  67.             try {  
  68.                 reader.close();  
  69.             } catch (IOException e) {  
  70.                 e.printStackTrace();  
  71.             }  
  72.         }  
  73.         String content = sb.toString();  
  74.         int length_CRLF = SystemHWUtil.CRLF.length();  
  75.         if (content.length() <= length_CRLF) {  
  76.             return content;  
  77.         }  
  78.         return content.substring(0, content.length() - length_CRLF);//  
  79.     }  

 测试:

Java代码   收藏代码
  1. @Test  
  2.     public void test_getFullContent(){  
  3.         String filepath="D:\\bin\\config\\conf_passwd.properties";  
  4.         try {  
  5.             InputStream in =new FileInputStream(filepath);  
  6.             System.out.print(FileUtils.getFullContent(filepath, "UTF-8"));  
  7.         } catch (FileNotFoundException e) {  
  8.             e.printStackTrace();  
  9.         } catch (IOException e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.     }  

 

介绍三种无损读取的方式

方式一:使用InputStreamReader,指定编码

Java代码   收藏代码
  1. /*** 
  2.      * 指定字符编码,无损地读取文本文件. 
  3.      *  
  4.      * @param in 
  5.      *            : 输入流,会关闭 
  6.      * @param charset 
  7.      *            : 字符编码 
  8.      * @return 
  9.      * @throws IOException 
  10.      */  
  11.     public static String getFullContent3(InputStream in, String charset)  
  12.             throws IOException {  
  13.         StringBuffer sbuffer = new StringBuffer();  
  14.         InputStreamReader inReader;  
  15.         //设置字符编码  
  16.         inReader = new InputStreamReader(in, charset);  
  17.         char[] ch = new char[SystemHWUtil.BUFF_SIZE_1024];  
  18.         int readCount = 0;  
  19.         while ((readCount = inReader.read(ch)) != -1) {  
  20.             sbuffer.append(ch, 0, readCount);  
  21.         }  
  22.         inReader.close();  
  23.         in.close();  
  24.         return sbuffer.toString();  
  25.     }  

 测试:

Java代码   收藏代码
  1. @Test  
  2.     public void test_getFullContent3(){  
  3.         String filepath="D:\\bin\\config\\conf_passwd.properties";  
  4.         try {  
  5.             InputStream in =new FileInputStream(filepath);  
  6.             System.out.print(FileUtils.getFullContent3(in, "UTF-8"));  
  7.         } catch (FileNotFoundException e) {  
  8.             e.printStackTrace();  
  9.         } catch (IOException e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.     }  

 

 

方式二:先读取出字节数组,再使用String的构造方法

Java代码   收藏代码
  1. public static String getFullContent4(InputStream in, String charset) throws IOException{  
  2.         byte[]bytes=FileUtils.readBytes3(in);  
  3.         return new String(bytes,charset);  
  4.     }  
  5.   
  6. /*** 
  7.      * Has been tested 
  8.      *  
  9.      * @param in 
  10.      * @return 
  11.      * @throws IOException 
  12.      */  
  13.     public static byte[] readBytes3(InputStream in) throws IOException {  
  14.         BufferedInputStream bufin = new BufferedInputStream(in);  
  15.         int buffSize = BUFFSIZE_1024;  
  16.         ByteArrayOutputStream out = new ByteArrayOutputStream(buffSize);  
  17.   
  18.         // System.out.println("Available bytes:" + in.available());  
  19.   
  20.         byte[] temp = new byte[buffSize];  
  21.         int size = 0;  
  22.         while ((size = bufin.read(temp)) != -1) {  
  23.             out.write(temp, 0, size);  
  24.         }  
  25.         bufin.close();  
  26.         in.close();  
  27.         byte[] content = out.toByteArray();  
  28.         out.flush();  
  29.         out.close();  
  30.         return content;  
  31.     }  

 

 

方式三:使用System.arraycopy,所以效率不高,因为有拷贝操作(不推荐

Java代码   收藏代码
  1. public static String getFullContent2(InputStream in, String charset)  
  2.             throws IOException {  
  3.         int step = BUFFSIZE_1024;  
  4.         BufferedInputStream bis = new BufferedInputStream(in);  
  5.   
  6.         // Data's byte array  
  7.         byte[] receData = new byte[step];  
  8.   
  9.         // data length read from the stream  
  10.         int readLength = 0;  
  11.   
  12.         // data Array offset  
  13.         int offset = 0;  
  14.   
  15.         // Data array length  
  16.         int byteLength = step;  
  17.   
  18.         while ((readLength = bis.read(receData, offset, byteLength - offset)) != -1) {  
  19.             // Calculate the current length of the data  
  20.             offset += readLength;  
  21.             // Determine whether you need to copy data , when the remaining  
  22.             // space is less than step / 2, copy the data  
  23.             if (byteLength - offset <= step / 2) {  
  24.                 byte[] tempData = new byte[receData.length + step];  
  25.                 System.arraycopy(receData, 0, tempData, 0, offset);  
  26.                 receData = tempData;  
  27.                 byteLength = receData.length;  
  28.             }  
  29.         }  
  30.   
  31.         return new String(receData, 0, offset, charset);  
  32.     }  
相关文章
|
27天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
65 9
|
28天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
65 2
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
123 5
|
2月前
|
Java
Java“解析时到达文件末尾”解决
在Java编程中,“解析时到达文件末尾”通常指在读取或处理文件时提前遇到了文件结尾,导致程序无法继续读取所需数据。解决方法包括:确保文件路径正确,检查文件是否完整,使用正确的文件读取模式(如文本或二进制),以及确保读取位置正确。合理设置缓冲区大小和循环条件也能避免此类问题。
448 2
|
7天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
63 34
|
24天前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
38 3
|
27天前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
53 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
44 4
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
43 4