0 0

Java IO 字节流计数问题10

				long count = 0;
				String line = br.readLine();
				while (line != null) {
					if (count > length) {
						break;
					}
					
					count += line.getBytes("UTF-8").length;
					count += 1;	// Add \r's length
					System.out.println(Thread.currentThread() + "  " + line);
					System.out.println(" count:" + count);
					line = br.readLine();
				}


用这样的方法来统计已读的字节数为什么输出的结果不对呢?具体的说count统计的数目比实际的要少,这是什么原因造成的?
IO 
2012年8月21日 14:55

7个答案 按时间排序 按投票排序

0 0

采纳的答案

File file = new File("D:\\todo.txt");
		BufferedReader br = new BufferedReader(new FileReader(file));
		long length = 1261192704;
		long count = 0;
		String line = br.readLine();
		while (line != null) {
			if (count > length) {
				break;
			}
			count += 2;
			count += line.getBytes("utf-8").length;
			System.out.println(line);
			line = br.readLine();
		}
		
		System.out.println(count);
		FileInputStream fis = new FileInputStream(file);
		System.out.println(fis.available());


测试结果:
1、如果windows上边读windows文件 返回结果是正确的;
2、如果windows上边读linux文件结果是有偏差的(count += 1)。


引用
getBytes
public byte[] getBytes(Charset charset)使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
此方法总是使用此字符集的默认替代 byte 数组替代错误输入和不可映射字符序列。如果需要对编码过程进行更多控制,则应该使用 CharsetEncoder 类。


难道有些linux字符在windows上无法映射? 你试下 在linux上读取linux文件 结果对吗

2012年8月21日 16:45
0 0

按照byte流读取..不要按照read流读取

2012年8月22日 09:17
0 0

第二行的 String line = br.readLine(); 经读了一些字符了,但是此时count = 0。。。所以你的程序应该少了第二行程序读到的字符数。

2012年8月22日 00:47
0 0

问题找到了,
Reader 在读取字符时,在linux上你是把换行符当作一个字节看待,但是如果我忘文件里写了\r\n 你也是看作一个的(就是说linux上也可能写\r\n 可是你只记录了1个字节),所以出问题了。

		FileInputStream fis = new FileInputStream(file);
		System.out.println(fis.available());
		
		long r = 0;
		long n = 0;
		long c = 0;
		int i = fis.read(); 
		while(i != -1) {
			if(i == '\r') {
				r++;
			}
			if(i == '\n') {
				n++;
			}
			
			c++;
			i = fis.read();
		}
		System.out.println(c);
		System.out.println(r);
		System.out.println(n);

2012年8月21日 18:12
0 0

if (count > length) { 
        break; 
    } 

这个判断感觉也好别扭。不知道是什么 可能也会影响结果 都非空判断了 不用break了吧 count>length是判断什么的?

2012年8月21日 15:46
0 0

count += 1; // Add \r's length  这个不用要了吧,已经作了line != null的判断了 应该会排除掉空的回车。每次读一行就用count += 1;好像是错误的。

2012年8月21日 15:43
0 0

要考虑 换行符 在window上边 是\r\n(两个字节)  在linux上是\r(一个);

2012年8月21日 15:09

相关推荐

    Java字节流与字符流的介绍.pdf

    Java中的字节流分为输入流和输出流,它们都继承自两个基础抽象类:`java.io.InputStream`和`java.io.OutputStream`。InputStream类提供了读取字节数据的方法,OutputStream类提供了写入字节数据的方法。在...

    Java 字节流、字符流题目.pdf

    在Java中,流分为字节流和字符流两大类,它们都是抽象的概念,用于表示数据流动的方向。字节流处理的数据单位是字节,而字符流处理的是Unicode编码的字符。 一、字节流 字节流分为输入流和输出流,Java中最基础的...

    Java IO流体系继承结构图_动力节点Java学院整理

    InputStream 负责从字节流中读取数据,而 OutputStream 负责将数据写入字节流中。InputStream 和 OutputStream 的子类包括: * ByteArrayInputStream 和 ByteArrayOutputStream:使用字节数组作为流的源 * ...

    java.io的基础应用

    在Java中,IO操作主要分为字节流和字符流两大类,分别由`java.io.InputStream`和`java.io.OutputStream`以及`java.io.Reader`和`java.io.Writer`作为基类。字节流处理的是8位的字节,而字符流处理的是16位的Unicode...

    JAVA-IO详解.txt

    Java IO系统主要由两大类构成:字节流(Byte Stream)和字符流(Character Stream)。这两种流的主要区别在于数据传输单位的不同:字节流是以8位字节为单位进行读写,而字符流则是以16位字符为单位进行读写。Java IO...

    IO流练习题1

    - 字节流(Byte Stream):处理二进制数据。 - 字符流(Character Stream):处理文本数据。 #### 3. 常见IO流类 - `InputStream`与`OutputStream`:基础输入输出流。 - `FileInputStream`与`FileOutputStream`:...

    io流各种组合使用与总结

    ### Java IO流的各种组合使用与总结 在Java中,输入/输出(IO)流是进行数据读取和写入操作的基础。本文将详细介绍Java中IO流的多种组合使用方法,并结合示例代码来阐述每种配置的具体应用。 #### 1. 带缓冲的文件...

    java IO实现电脑搜索、删除功能的实例

    3. 流的分类:Java的IO流按数据类型分为字节流和字符流,按方向分为输入流和输出流。此外,还有缓冲流、过滤流等,用于提高效率和提供额外功能。 三、代码实现搜索功能 1. 文件搜索:如上述代码所示,可以创建一个...

    commons-io-2.6.jar下载

    - `CountingInputStream` 和 `CountingOutputStream` 为输入流和输出流增加了计数功能,同时保持线程安全。 8. **文件观察**: - `FileAlterationObserver` 和 `FileAlterationListener` 用于监听文件系统的改变...

    Commons-io-2.11.0.jar

    IO过滤器:一系列的装饰器类,可以轻松地在现有流上添加缓冲、计数、关闭监听、线路结束符转换等功能。 目录遍历和文件查找工具。 字节顺序标记(BOM)处理。 大文件支持:部分方法设计用于处理大型文件,避免一次性...

    Java核心面试知识整理.pdf

    接下来是Java IO/NIO的内容,Java IO是指传统的输入输出流模型,基于阻塞IO模型,而NIO(New IO)则是引入了缓冲区、通道(Channel)和选择器(Selector)等概念,支持非阻塞IO模型,它允许单线程处理多个网络连接。...

    java八股文免费下载.zip

    Java八股文是一系列针对Java程序员的经典面试题和知识点总结,常常被用来考察候选人的基础知识、编程技巧以及问题解决能力。这些题目涵盖了Java语言的核心特性、集合框架、多线程、异常处理、IO流、网络编程、设计...

    java rt包源代码

    5. **I/O流**:`java.io`包提供了输入/输出流的接口和类,如`InputStream`、`OutputStream`、`Reader`、`Writer`等,支持处理字节流和字符流。此外,还有缓冲流、转换流、对象流等高级流,方便进行文件读写、网络...

    蓝桥杯java历年真题及答案整理(共129道题目及答案)

    5. **输入输出流**:I/O流是Java处理数据输入和输出的关键,包括文件操作、字符流、字节流、缓冲流等。了解不同类型的流及其组合使用方式。 6. **多线程**:Java提供并发编程的支持,包括线程的创建、同步、互斥、...

    JAVA核心知识点整理.pdf

    4. Java IO/NIO:Java IO和NIO(New IO)是Java编程中用于处理输入/输出流的不同方式。文档中提到了阻塞和非阻塞IO模型、多路复用IO模型以及异步IO模型。在NIO中,还介绍了缓冲区(Buffer)、通道(Channel)和选择...

    java 统计指定文件中的字符个数

    在Java编程语言中,统计指定文件中的字符个数是一项常见的任务,这主要涉及到文件I/O操作和字符流处理。下面将详细讲解如何实现这个功能,以及相关的重要知识点。 首先,要进行文件I/O操作,Java提供了`java.io`包...

    JAVA基础各章节代码

    文件中的代码可能涵盖了字节流(如FileInputStream和FileOutputStream)、字符流(如BufferedReader和PrintWriter)、以及更高级的抽象,如InputStreamReader和OutputStreamWriter。此外,NIO(New IO)提供了一种非...

    JAVA面试题大全 经常考的

    IO流用于读写数据,分为字节流和字符流两大类,每类又分为输入流和输出流,以及节点流和处理流。 八、反射 10. 反射在Java中的作用是什么? 反射允许程序在运行时动态地获取类的信息(如类名、方法名等)并调用这些...

    Java学习教案(生手必备)

    理解流的概念、流的分类(如字节流和字符流)以及如何使用缓冲区进行高效传输,将对你的编程实践大有帮助。 Java的并发编程是另一个深入的话题。Java提供了线程和锁机制,使得程序可以在多核处理器上并行执行,从而...

Global site tag (gtag.js) - Google Analytics