`
xurichusheng
  • 浏览: 345007 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 7 nio逐行读取文件内容

nio 
阅读更多

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 NIO处理超大数据文件时,关键是利用好内存映射文件技术和合理的数据读取策略,通过适当的分块和数据解析方法,可以有效地提升读取速度和处理能力。

    java按行读取大文件并解析入库

    在Java编程中,处理大容量文本文件是一项挑战,因为传统的逐行读取方式可能会消耗大量内存,导致程序崩溃。为了高效地处理这类问题,我们可以利用Java的`java.nio`包中的BufferedReader和FileChannel等类,实现按行...

    读取文件夹中所有文件中的内容

    3. **读取文件内容**:对每个文件使用`BufferedReader`逐行读取文件内容,并存储在一个`StringBuilder`对象中。 4. **替换字符**:使用`replaceAll`方法替换文件内容中的双引号字符。 5. **输出结果**:打印处理后的...

    java读写csv文件,中文乱码问题

    - 通过`BufferedReader`的`readLine()`方法逐行读取内容,处理每一行的数据。 3. **Java写入CSV文件**: - 使用`PrintWriter`或者`BufferedWriter`可以指定字符编码写入文件。例如: ```java FileOutputStream ...

    STL.zip_java读取stl_stl读取 java

    2. **解析文件**:逐行读取文件,跳过头信息,直到找到一个表示面片开始的"facet normal"行。然后,读取接下来的三个浮点数,这是面片法线向量。接着,读取三组各三个浮点数,代表面片的三个顶点坐标。 3. **处理...

    获取上传的文件行数的最快速的java代码

    Java提供了丰富的类库支持文件的创建、读写、删除等操作,如`java.io.File`,`java.nio.file.Files`,以及用于处理流的`java.io`包中的类。 总结起来,获取大文件的行数,关键在于使用高效的流式处理方式,并合理...

    用java修改文件的编码

    - 使用`BufferedReader`的`readLine()`方法逐行读取文件内容。 - 将读取到的每一行转换为目标编码,可以使用`String`的`getBytes()`和`new String()`方法。 - 使用`BufferedWriter`的`write()`方法将转换后的字符...

    java简单的读写文件小程序

    我们可以使用`BufferedReader`进一步提高读取效率,通过`readLine()`方法逐行读取文件内容。 ```java FileReader fr = new FileReader("filename.txt"); BufferedReader br = new BufferedReader(fr); String ...

    NIO_RandomAccessFile_多线程_按行读本地CSV文件(java==> google guava包ListenableFuture)

    NIO_RandomAccessFile_多线程读本地CSV文件(java==&gt; google guava包ListenableFuture) reader里有个main函数,更改文件路径后,直接运行即可

    java 显示文件中的内容

    `readLine()`方法被用来逐行读取文件内容,直到文件结束。如果在读取过程中发生错误,异常会被捕获并打印错误信息。 如果你的文件是二进制格式(如图片文件“Java.jpg”),则不能使用上述方法,因为它们专用于处理...

    java 读取文件方法的总结

    Java 读取文件的方法在Java编程中至关重要,无论是处理文本文件、二进制文件还是其他类型的数据,都需要灵活运用各种读取方式。以下是对Java读取文件的五种方法的详细说明,每种方法都有相应的代码示例: 1. **按...

    java_io.rar_java 文件操作_java 读取 本地文件_java.io转动_文件操作

    这段代码创建了一个`File`对象,然后使用`FileReader`和`BufferedReader`来逐行读取文件内容。`readLine()`方法会返回文件中的一行,直到文件结束。 接下来,我们讨论文件移动。Java标准库并没有直接提供文件移动的...

    JAVA 文件读取示例

    - **NIO(非阻塞I/O)**:Java NIO提供了`java.nio.file.Files`类,提供了大量静态方法用于读写文件,例如`Files.readAllLines()`。 - **文件流的关闭**:始终记得在完成文件操作后关闭流,防止资源泄露。可以使用...

    java使用多线程读取超大文件

    这是因为单线程读取需要逐行读取文件,导致读取速度慢。为解决这个问题,可以使用多线程技术来读取超大文件。 多线程读取超大文件的基本思路 多线程读取超大文件的基本思路是将文件分割成多个小块,每个小块由一个...

    java文件读取方法.doc

    在代码中,没有直接使用`BufferedReader`的例子,但通常会用`FileReader`创建一个`BufferedReader`实例,然后调用`BufferedReader`的`readLine()`方法来逐行读取文件内容。 4. **随机读取文件内容**: 对于需要在...

    Java读写.txt文件

    这段代码会逐行读取文件,然后使用`split()`方法分割键和值。 4. **处理异常** 在进行文件操作时,应该始终处理可能出现的异常,如`FileNotFoundException`、`IOException`等。通常使用try-catch语句来捕获并处理...

    Java自学视频教程-java读取txt文件方法3.rar

    1. **BufferedReader**:这是最常用的读取文本文件的方法,它以缓冲的方式逐行读取文件内容。BufferedReader通常与InputStreamReader结合使用,后者允许我们指定字符编码。下面是一个基本的示例: ```java try ...

    java实现根据关键字查找所在文件夹的文件

    在Java编程语言中,实现根据关键字查找文件夹内包含该关键字的文件是一项常见...对于大文件,可能需要逐行读取,以避免消耗大量内存。此外,这个例子没有处理文件编码问题,实际应用中可能需要考虑不同文件的编码格式。

    java io读取文件

    - 提供了方便的文本扫描功能,可以逐行或逐词读取文件,适合简单文本输入。 6. **RandomAccessFile** - 支持随机访问文件,适用于大数据文件的分块读写。 7. **NIO(非阻塞I/O)** - Java 1.4引入的NIO库,提供...

Global site tag (gtag.js) - Google Analytics