开发者社区> 问答> 正文

java中字节读取区分多字节读取还是单字节读取:报错

在Java 语言中, 有一个字节流,读取的时候怎么判断是应该单字节读取,还是双字节读取,或者是3字节读取以及4字节读取

展开
收起
kun坤 2020-06-07 20:03:36 486 0
1 条回答
写回答
取消 提交回答
  • 使用inputsteamreader bufferreader之类,指定字符集,就能读取出字符了,一般不会自行判断要读多少个字节才是一个字符######确实如此,不需要事先判断。 一个一个地读到文档结尾(EOF), 就终止读取操作。再将已得到的字节数据,通过给定的字符编码(字符集),就能转换成所要的字符。######

    在 Java 语言中,用字节流读取数据,不需要事先判断 "是应该单字节读取,还是双字节读取,或者是3字节读取以及4字节读取...."。事实上,字节流是依次逐个读取字节的。
    如下案例说明以上事实。

    1. 已知两个文档 hello.txt 和 hello1.txt 的内容分别是:"hello world!" 和 "世界, 你好!"。  
    2. 调用 FileInputStream 的 int read() 方法,依次读取两个文档。
    3. 从头读取每个文档的时候,按字节依次读取,一旦读取到文档结尾(EOF), 被调用的方法 read() 便返回 整形数 -1,显示读取数据的任务完成。
    4. Java 使用 UNICODE (汉字占2个字节,ASCII 码所包括的字符,如英文字母,标点符号,空格,占1个字节) 进行"翻译"。
    5. 结果显示, 从文档 hello.txt 中, 读取到12个字节。从文档 hello1.txt 中, 读取到11个字节。
    import java.io.*;
    public class Test_Input {
        static void test(String f) throws IOException{
                FileInputStream fin = new FileInputStream(f);
                byte[] buffer = new byte[1024];
                
                int len=0;
              	byte b =(byte) fin.read();
                
                while (b!= -1){
                buffer[len++]=b;
                b =(byte) fin.read();
                }
    
                String str = new String(buffer,0,len);
                System.out.println(str);
                System.out.println("从文档\" " + f + " \" 中读取到: " + len + "个字节。");
                fin.close();
        }
        public static void main(String[] args) throws IOException{
        	test("hello.txt");
        	test("hello1.txt");
        }
    }

    cmd:

    D:\java\test\OS_China\InputStream>javac Test_Input.java
    
    D:\java\test\OS_China\InputStream>java Test_Input
    hello world!
    从文档" hello.txt " 中读取到: 12个字节。
    世界, 你好!
    从文档" hello1.txt " 中读取到: 11个字节。

     

    ######

    如果已知字节流是纯文本,搞清楚字符集,按byte[]读取,再传给new String(bytes, charset)转换成文本就可以,如:

    String s = new String(byteBuffer.array(), StandardCharsets.UTF_8);

     

    如果不知道不是纯文本,要搞清楚内容是由什么组成的,按类型逐段读取(如byteBuffer.getInt()),需要注意的是C语言表达数值通常是大端序的,而java通常是小端序,可以通过"Integer.reserveBytes(value)"来转换(Integer替换成对应的Long、Double等类型)

    2020-06-07 20:03:40
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载