首页编程java编程java读取汉字用什么流 java中读取字符和读取字符串的差别

java读取汉字用什么流 java中读取字符和读取字符串的差别

编程之家2023-10-11108次浏览

各位老铁们,大家好,今天由我来为大家分享java读取汉字用什么流,以及java中读取字符和读取字符串的差别的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

java读取汉字用什么流 java中读取字符和读取字符串的差别

java读取含有unicode编码的文件内容,并转换成汉字

可以通过BufferedReader流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。

BufferedReader bre= null;

try{

java读取汉字用什么流 java中读取字符和读取字符串的差别

String file="D:/test/test.txt";

bre= new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流

while((str= bre.readLine())!= null)//判断最后一行不存在,为空结束循环

java读取汉字用什么流 java中读取字符和读取字符串的差别

{

System.out.println(str);//原样输出读到的内容(unicode会自动转换为中文的)

};

备注:unicode不需要转换的,直接输出即可,会自动变成中文,如:

System.out.println("\u0061\u0062\u6c49\u5b57");

结果就是:ab汉字。

java中读取字符和读取字符串的差别

具体的区别不是很大。先给你看看那API上的介绍。

public class FileInputStream extends InputStream

FileInputStream从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。

FileInputStream用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑FileReader。

public class FileReader extends InputStreamReader

用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream上构造一个 InputStreamReader。

FileReader用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream。

public int read()

throws IOException从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。

指定者:

类 InputStream中的 read

返回:

下一个数据字节;如果已到达文件末尾,则返回-1。

抛出:

IOException-如果发生 I/O错误。

public int read(byte[] b)

throws IOException从此输入流中将最多 b.length个字节的数据读入一个 byte数组中。在某些输入可用之前,此方法将阻塞。

覆盖:

类 InputStream中的 read

参数:

b-存储读取数据的缓冲区。

返回:

读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回-1。

抛出:

IOException-如果发生 I/O错误。

另请参见:

InputStream.read(byte[], int, int)

public int read(byte[] b,

int off,

int len)

throws IOException从此输入流中将最多 len个字节的数据读入一个 byte数组中。如果 len不为 0,则在输入可用之前,该方法将阻塞;否则,不读取任何字节并返回 0。

覆盖:

类 InputStream中的 read

参数:

b-存储读取数据的缓冲区。

off-目标数组 b中的起始偏移量。

len-读取的最大字节数。

返回:

读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回-1。

抛出:

NullPointerException-如果 b为 null。

IndexOutOfBoundsException-如果 off为负、len为负,或者 len大于 b.length- off

IOException-如果发生 I/O错误。

另请参见:

InputStream.read()

一下3个方法都是在InputStream中定义的

public abstract int read()

throws IOException从输入流中读取数据的下一个字节。返回 0到 255范围内的 int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

子类必须提供此方法的一个实现。

public int read(byte[] b)

throws IOException从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。

如果 b的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值-1;否则,至少读取一个字节并将其存储在 b中。

将读取的第一个字节存储在元素 b[0]中,下一个存储在 b[1]中,依次类推。读取的字节数最多等于 b的长度。设 k为实际读取的字节数;这些字节将存储在 b[0]到 b[k-1]的元素中,不影响 b[k]到 b[b.length-1]的元素。

类 InputStream的 read(b)方法的效果等同于:

read(b, 0, b.length)

参数:

b-存储读入数据的缓冲区。

返回:

读入缓冲区的总字节数;如果因为已经到达流末尾而不再有数据可用,则返回-1。

public int read(byte[] b,

int off,

int len)

throws IOException将输入流中最多 len个数据字节读入 byte数组。尝试读取 len个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。

在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

如果 len为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值-1;否则,至少读取一个字节并将其存储在 b中。

将读取的第一个字节存储在元素 b[off]中,下一个存储在 b[off+1]中,依次类推。读取的字节数最多等于 len。设 k为实际读取的字节数;这些字节将存储在 b[off]到 b[off+k-1]的元素中,不影响 b[off+k]到 b[off+len-1]的元素。

在任何情况下,b[0]到 b[off]的元素以及 b[off+len]到 b[b.length-1]的元素都不会受到影响。

类 InputStream的 read(b, off, len)方法重复调用方法 read()。如果第一次这样的调用导致 IOException,则从对 read(b, off, len)方法的调用中返回该异常。如果对 read()的任何后续调用导致 IOException,则捕获该异常并将其视为到达文件末尾;到达该点时读取的字节存储在 b中,并返回发生异常之前读取的字节数。在已读取输入数据 len的请求数量、检测到文件结束标记、抛出异常前,此方法的默认实现将一直阻塞。建议子类提供此方法更为有效的实现。

参数:

b-读入数据的缓冲区。

off-数组 b中将写入数据的初始偏移量。

len-要读取的最大字节数。

返回:

读入缓冲区的总字节数;如果因为已到达流末尾而不再有数据可用,则返回-1。

总结一下:

FileInputstream.read()读取的是单个字符,是ASCII码表所能表示的字符,要是要读取像有汉字等其他ASCII不能表示的,就要用FileReader,它读取的是java支持的字符集。

另外,像要是读取图片,pdf,psd等这些东西的话,就要用FileInputStream,即文件字节流。应为存在计算机中的就是二进制,是ASCII表示的。要是读取有汉字的.txt,.就用FileReader。其实用的较多的是BuffereReader,进行逐行读取。

java 中的输入输出流问题

其实问题很简单,

首先,你要弄清楚”字符“和”字节“的关系。在java中一个字符是用两个字节表示的。

再看你的ch=fr.read();这是从你的文件中读出的一个字节。

System.out.printf(...);方法是向标准输出流打印一个格式后的字符串,就像C语言的printf函数一样吧ch格式化为一个字符,但是问题出现了java中一个字符是两个字节组成的,而ch只有一个字节有效(int是4个字节的,但是只用了1个字节),这里就存在一个转换的问题了,如过ch是一个英文的话很好说,原样输出(如果你要了解为什么是原样输出的话,你可以在网上去查查ascii编码和unicode编码在字节上的区别,其实很简单)。但是如果是中文的话就不行了,因为中文要用到两个字节才能表示完整的一个字。你现在只有一个字节了,这样%c就不知道格式化为什么字符了(但是肯定这个字符变成了2个字节的。)这样1个汉字就被分解成两个乱码了。方法可以把这个乱码输出到输出流上。

System.out.print((char)ch);和上面是一个意思,只是方法不一样。

System.out.write(ch);是向标准输出流输出一个字节。这又有一个难以理解的地方,标准输出流是什么?怎样理解这个标准输出流?(我也不知道怎么很好的解释),标准输出流可以认为是一个字节输出的通道,java中一般这个通道默认是连接在电脑的显示设备上的。(我不专业)你可以把System.out看成是一个容器,他可以存储字节。你向它里面可以输入字节。如果你的标准输出流终端是控制台(DOS)。你就可以想象成控制台有一个字节存储的容器。控制台可以把容器中的字节表达出来,比如java的unicode编码的字节,他会把每连个字节组合成的一个字符打印出来我们就可以看到这个字符了。这样要显示什么就直接向这个容器中输入什么字节。

真实由于这种原因System.out.write(ch);这个方法可以像你那样输出汉字。一个汉字两个字节,这个方法一次可以向控制台输入一个字节,但是这两个字节最终都会输出到控制台的。因此汉字还是组成了。

上面那两个方法显示乱码的最终原因是:编码被强制改变了。一个汉字被分成了4个字节。

如果你对“把System.out看成是一个容器”有疑惑的话,你可以做一个实验,就用write方法向控制台输出一个汉字,这个汉字两个字节的输入中暂停一下,看看输出第一个字节后和两个字节都输出了控制台打印的是什么。(呵呵我没试过,如果有什么不一样的地方希望告诉我。。。)

关于java读取汉字用什么流的内容到此结束,希望对大家有所帮助。

javaweb 用什么书好,想买点关于java web 方面的书籍非常周末陈怡(非常周末陈怡的瓜)