Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解java中的二进制、ByTestStream和字符_Java_Stream_Binary_Char_Java Io - Fatal编程技术网

了解java中的二进制、ByTestStream和字符

了解java中的二进制、ByTestStream和字符,java,stream,binary,char,java-io,Java,Stream,Binary,Char,Java Io,我在理解Java IO类中的一些概念时遇到了一些困难。例如,有两种类型的流,byte和char。据我所知,字节流是逐字节读取的1。如果java中的字符存储为16位(两个字节)的数据类型,那么我如何能够使用面向字节的输入流(例如FileInputStream)从文件中准确读取字符,比如“a”2。我使用的字符(在ascii图表上主要在0和122之间)是否存储在分配的两个字节中的一个字节中?3。DataInputStream/DataOutputStream允许我读写二进制数据,其他输入流如FileI

我在理解Java IO类中的一些概念时遇到了一些困难。例如,有两种类型的流,byte和char。据我所知,字节流是逐字节读取的

1。如果java中的字符存储为16位(两个字节)的数据类型,那么我如何能够使用面向字节的输入流(例如FileInputStream)从文件中准确读取字符,比如“a”

2。我使用的字符(在ascii图表上主要在0和122之间)是否存储在分配的两个字节中的一个字节中?

3。DataInputStream/DataOutputStream允许我读写二进制数据,其他输入流如FileInputStream/FileOutputStream允许我读写什么?我基本上想知道当我希望将数据输出为我可以读取的文本(使用一个简单的文本编辑器,如记事本)时,与当我希望将其编码为原始二进制数据(在记事本中看起来像垃圾的文本)时,使用哪个流

正在努力理解java中流的概念,以及何时使用

如果java中的字符存储为16位(两个字节)的数据类型,它是如何存储的 我可以使用 面向字节的输入流,例如FileInputStream

试着做

System.out.println(Integer.toBinaryString('A'));
它打印出字符
'A'
的二进制表示形式。这张照片

1000001
由于
'A'
字符
,因此它实际上是以16位存储的

00000000 01000001
因此,您所要做的就是读取两个连续的字节,并适当地使用它们来形成一个
char
。看到了吗

ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0b00000000, 0b01000001});
System.out.println(buffer.getChar());
哪张照片

A
这样做的目的是将数组中的第一个
字节
用作
字符
中的前8位,第二个
字节
用作最后8位


DataInputStream/DataOutputStream允许我读写二进制文件 数据,其他输入流如FileInputStream/FileOutputStream允许 我要读和写的到底是什么?我基本上想知道 当我希望将数据输出为我可以读取的文本时要使用的流(使用 简单的文本编辑器(如记事本),而不是我希望它编码为原始 二进制数据(在记事本中看起来像垃圾的文本)

无论你是在写文本还是其他任何东西,都是位和字节。你可以做得很好

"someString".getBytes()

然后写这些。所以这并不重要。使用最能代表你正在做的事情。通常,您可以使用
PrintWriter
包装底层
OutputStream
,使用
扫描仪或
BufferedReader
包装底层
InputStream
,具体取决于您正在读取的文件的格式

如果文件是ASCII字节流,则执行以下操作:

InputStream is = new FileInputStream( filePath );
Reader reader = new InputStreamReader( is, "ISO-8859-1" );

char ch = reader.read();
您总是首先在面向字节的文件上打开输入流。然后,InputStreamReader将字节转换为字符。当然,在本例中,ISO-8859-1是从单字节值到完全相同的字符值的映射。显然,其他映射是可能的,但ISO-8859-1恰好与Unicode集合的前255个字符相同,而其中的前127个字符恰好与ASCII相同

写作时使用:

OutputStream os = new FileOutputStream( filePath ) ;
Writer w = new OutputStreamWriter( os, "ISO-8859-1" );

w.write( ch );
同样,是OutputStreamWriter,它根据ISO-8859-1字符集在字符和字节流之间进行适当转换。结果文件的每个字符将有一个字节

这里还有几个例子

如果使用上述方法,则执行以下操作:

w.write("AAAA");
w.flush();
w.close();
结果文件将包含4个字节,每个字节的值为65。使用顶部的代码读回该文件将在内存中产生四个“A”字符,但在内存中,每个字符占用16位

如果文件以不同的字符集编码,包括可能的多字节字符,则只需在InputStreamReader/OutputStreamWriter中使用正确的编码,即可在读取和写入时进行正确的转换

UTF-8不是字符集,而是将常规unicode字符编码为字节序列,结果证明UTF-8编码非常聪明,因为unicode字符的前127个字符映射为前127个字节值(作为单个字节)。然后字符>=128使用一行中的2个或更多字节值,其中每个字节值>=128。如果您知道ascii文件只使用“7位”ascii,那么UTF-8也适用于您。对于Java,通常UTF-8是用于文件的最佳编码,因为它可以正确地编码所有可能的Java字符值而不会丢失

了解这一点非常重要。我建议您不要尝试以任何其他方式将字节转换为字符。当然,这是可能的,但这是一种浪费,因为流中的转换非常可靠和正确


(更糟糕的是……实际上一个字符是32位的量,其中20位可以用一种称为UTF-16的编码编码成16位字符值的序列。建议您暂时忽略这一点,但请注意,即使在由16位字符值组成的Java字符串中,也有一些双字符序列。)在我回答你的问题之前,有一些非常基本的东西需要理解

  • 在最低级别
    InputStream/OutputStream
    ),所有内容都是位和字节。因此,最低级别的流处理的是位/字节的原始数据
  • 现在,要将原始字节转换为可读字符,您需要字符编码或。简言之,字符编码是一种指令(从字节到可视字符的映射),用于将原始字节从定义集(例如
    UTF-8
    )转换为可读字符 现在来回答你的问题:

    如果java中的字符存储为16位(两个字节)的数据类型,那么如何使用
    FileInputStream fis = new FileInputStream("test.txt");
    InputStreamReader isr = new InputStreamReader(fis, "UTF8");