nio逐行读取文件内容,使用 java 7.
首先,获取文件编码;
其次,读取文件内容。
1. 获取文件编码
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class CommonsMethods { /** * @Title: getFileCharset * @Description: 判断文件的编码格式 * @param filePath * 文件绝对路径 * @return String * @author * @date 2015年12月26日 */ public static String getFileCharset(String filePath) { File file = new File(filePath); if (!file.exists()) { System.out.println("File not found."); } // 默认编码格式为GBK String charset = "GBK"; FileInputStream is = null; BufferedInputStream bis = null; try { byte[] first3Bytes = new byte[3]; boolean checked = false; is = new FileInputStream(file); bis = new BufferedInputStream(is); bis.mark(0); int read = bis.read(first3Bytes, 0, 3); if (-1 == read) { charset = "GBK"; } else if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) { charset = "UTF-16LE"; checked = true; } else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) { charset = "UTF-16BE"; checked = true; } else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB && first3Bytes[2] == (byte) 0xBF) { charset = "UTF-8"; checked = true; } bis.reset(); if (!checked) { int loc = 0; while ((read = bis.read()) != -1) { loc++; if (read >= 0xF0) { break; } if (0x80 <= read && read <= 0xBF) { // 单独出现BF以下的,也算GBK break; } if (0x80 <= read && read <= 0xDF) { read = bis.read(); if (0x80 <= read && read <= 0xBF) { // GBK continue; } else { break; } } else if (0xE0 <= read && read <= 0xEF) { read = bis.read(); if (0x80 <= read && read <= 0xBF) { read = bis.read(); if (0x80 <= read && read <= 0xBF) { charset = "UTF-8"; break; } else { break; } } else { break; } } } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeStream(bis, null); IOUtils.closeStream(is, null); } return charset; } }
2. 逐行读取文件内容
import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class NioReadFile { public static void main(String[] args) { String fileName = "D:\\CIME\\measure.CIME"; String charset = CommonsMethods.getFileCharset(fileName); System.out.println("charset=" + charset); try { List<String> lines = Files.readAllLines(Paths.get(fileName), Charset.forName(charset)); for (String line : lines) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
3. IOUtils
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; import java.nio.channels.Channel; public class IOUtils { public static void closeStream(InputStream is, OutputStream out) { if (null != out) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } out = null; } if (null != is) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } is = null; } } public static void closeReader(Reader reader) { if (null != reader) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } reader = null; } } public static void closeWriter(Writer writer) { if (null != writer) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } writer = null; } } public static void closeChannel(Channel c) { if (null != c) { try { c.close(); } catch (IOException e) { e.printStackTrace(); } c = null; } } }
相关推荐
### Java NIO 处理超大数据文件的知识点详解 ...综上所述,使用Java NIO处理超大数据文件时,关键是利用好内存映射文件技术和合理的数据读取策略,通过适当的分块和数据解析方法,可以有效地提升读取速度和处理能力。
在Java编程中,处理大容量文本文件是一项挑战,因为传统的逐行读取方式可能会消耗大量内存,导致程序崩溃。为了高效地处理这类问题,我们可以利用Java的`java.nio`包中的BufferedReader和FileChannel等类,实现按行...
3. **读取文件内容**:对每个文件使用`BufferedReader`逐行读取文件内容,并存储在一个`StringBuilder`对象中。 4. **替换字符**:使用`replaceAll`方法替换文件内容中的双引号字符。 5. **输出结果**:打印处理后的...
- 通过`BufferedReader`的`readLine()`方法逐行读取内容,处理每一行的数据。 3. **Java写入CSV文件**: - 使用`PrintWriter`或者`BufferedWriter`可以指定字符编码写入文件。例如: ```java FileOutputStream ...
2. **解析文件**:逐行读取文件,跳过头信息,直到找到一个表示面片开始的"facet normal"行。然后,读取接下来的三个浮点数,这是面片法线向量。接着,读取三组各三个浮点数,代表面片的三个顶点坐标。 3. **处理...
Java提供了丰富的类库支持文件的创建、读写、删除等操作,如`java.io.File`,`java.nio.file.Files`,以及用于处理流的`java.io`包中的类。 总结起来,获取大文件的行数,关键在于使用高效的流式处理方式,并合理...
- 使用`BufferedReader`的`readLine()`方法逐行读取文件内容。 - 将读取到的每一行转换为目标编码,可以使用`String`的`getBytes()`和`new String()`方法。 - 使用`BufferedWriter`的`write()`方法将转换后的字符...
我们可以使用`BufferedReader`进一步提高读取效率,通过`readLine()`方法逐行读取文件内容。 ```java FileReader fr = new FileReader("filename.txt"); BufferedReader br = new BufferedReader(fr); String ...
NIO_RandomAccessFile_多线程读本地CSV文件(java==> google guava包ListenableFuture) reader里有个main函数,更改文件路径后,直接运行即可
`readLine()`方法被用来逐行读取文件内容,直到文件结束。如果在读取过程中发生错误,异常会被捕获并打印错误信息。 如果你的文件是二进制格式(如图片文件“Java.jpg”),则不能使用上述方法,因为它们专用于处理...
Java 读取文件的方法在Java编程中至关重要,无论是处理文本文件、二进制文件还是其他类型的数据,都需要灵活运用各种读取方式。以下是对Java读取文件的五种方法的详细说明,每种方法都有相应的代码示例: 1. **按...
这段代码创建了一个`File`对象,然后使用`FileReader`和`BufferedReader`来逐行读取文件内容。`readLine()`方法会返回文件中的一行,直到文件结束。 接下来,我们讨论文件移动。Java标准库并没有直接提供文件移动的...
- **NIO(非阻塞I/O)**:Java NIO提供了`java.nio.file.Files`类,提供了大量静态方法用于读写文件,例如`Files.readAllLines()`。 - **文件流的关闭**:始终记得在完成文件操作后关闭流,防止资源泄露。可以使用...
这是因为单线程读取需要逐行读取文件,导致读取速度慢。为解决这个问题,可以使用多线程技术来读取超大文件。 多线程读取超大文件的基本思路 多线程读取超大文件的基本思路是将文件分割成多个小块,每个小块由一个...
在代码中,没有直接使用`BufferedReader`的例子,但通常会用`FileReader`创建一个`BufferedReader`实例,然后调用`BufferedReader`的`readLine()`方法来逐行读取文件内容。 4. **随机读取文件内容**: 对于需要在...
这段代码会逐行读取文件,然后使用`split()`方法分割键和值。 4. **处理异常** 在进行文件操作时,应该始终处理可能出现的异常,如`FileNotFoundException`、`IOException`等。通常使用try-catch语句来捕获并处理...
1. **BufferedReader**:这是最常用的读取文本文件的方法,它以缓冲的方式逐行读取文件内容。BufferedReader通常与InputStreamReader结合使用,后者允许我们指定字符编码。下面是一个基本的示例: ```java try ...
在Java编程语言中,实现根据关键字查找文件夹内包含该关键字的文件是一项常见...对于大文件,可能需要逐行读取,以避免消耗大量内存。此外,这个例子没有处理文件编码问题,实际应用中可能需要考虑不同文件的编码格式。
- 提供了方便的文本扫描功能,可以逐行或逐词读取文件,适合简单文本输入。 6. **RandomAccessFile** - 支持随机访问文件,适用于大数据文件的分块读写。 7. **NIO(非阻塞I/O)** - Java 1.4引入的NIO库,提供...