`

java io基础知识

阅读更多
一、char[]、String、byte[]转换

首先需要清楚JAVA中这3种类型的区别

byte是字节,byte[]是字节数组,是字符在计算机中的实际存储。字节如何转换成字符,要看用什么编码。如果用UTF-8编码的话,一个字节是不能转成一个中文字符的

char是字符,char[]是字符数组,其实也就是字符串。String本质上就是char[]。char[]和String之间的转换,不需要指定编码

从char[]转换成String
char[] c = new char[] { 0x5c71,0x4456,0x1234 };
String s = new String(c);

从String转换成char[]
String s = "这是一个字符串";
char[] c = s.toCharArray();

可以看到,上面2种转换,都不涉及编码的问题

从byte[]转换成String
byte[] b = getBytes();// 某个方法返回了byte[]
String s = new String(b, "UTF-8");

这是从byte[]得到String,用UTF-8进行解码

从String转换成byte[]
String s = "这个一个字符串";
byte[] b = s.getBytes(Charset.forName("UTF-8"));

这是从String得到byte[],用UTF-8编码

byte[]和char[]之间,不知道用什么方法可以直接转,一般用String作为过渡

可以用一句话总结:“字符编码就变成字节;字节解码就变成字符”

二、BIO常用API简介

本文不涉及NIO,只总结BIO的常用API

JAVA IO主要有2套基本的API,一套用于读写字节;另一套用于读写字符,可以认为是前者的快捷方式

读写字节的基本接口是InputStream和OutputStream,InputStream从输入流中读出字节,读出后需要选择编码方式进行decode;OutputStream往输出流中写入字节,写入前需要选择编码方式进行encode

读写字符的基本接口是InputStreamReader和OutputStreamWriter,InputStreamReader从输入流中读出字符;OutputStreamWriter往输出流中写入字符。编码方式在创建实例的时候已经指定了

三、写数据的例子

OutputStream的例子:
String file = "/home/xxx/fortest.txt";
String charset = "UTF-8";

FileOutputStream fos = new FileOutputStream(file);
fos.write("這是要保存的中文字符串".getBytes(charset));
fos.close();

这里调用了基本的write(byte[])方法,将一个字符串编码后,写到文件里

用针对字符的OutputStreamWriter的话,可以省去自行编码的步骤:
String file = "/home/xxx/fortest.txt";
String charset = "UTF-8";

FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(fos,charset);
writer.write("这是要保存的中文字符串");
writer.close();

可以看到,调用write()方法时,不需要再调用getBytes()方法,因为在创建OutputStreamWriter的时候,已经指定了编码

四、读数据的例子

前面2个是写的例子,比较简单;读要稍微麻烦一点

下面是InputStream的例子:
FileInputStream fis = new FileInputStream(file);

StringBuilder sb = new StringBuilder();
byte[] buffer = new byte[68];// 这行代码有BUG

int count = 0;

while ((count = fis.read(buffer)) != -1) {
    sb.append(new String(buffer, 0, count, charset));
}
fis.close();

System.out.println(sb.toString());

这里的read方法是read(byte[] b),会将读取到的内容写到字节数组b里,并返回此次读取的字节数。如果已经读完,则返回-1;此外还有一个重载方法read(),一次只读一个字节,返回的是读取到的字节内容。前者是比较常用的。(所以我觉得JDK这里的设计不太好,重载的方法,返回值的含义却完全不同,很容易造成误导)

这个例子主要就是从InputStream中循环读取字节,然后decode为String。这里定义了一个count变量,String的构造方法也比较特殊。是因为最后一次读取时,往往不会读到字节数组的容量上限的内容,只有从0到count-1的内容才是最后一次读取的实际字节。所以需要用这个不常用的构造方法,把从count到size-1的部分排除掉

但是这个方法有一个bug,就是定义byte[]那一行。如果定义的byte[]容量够大的话,一次性把输入流里的字节全部读出来了,那就没有问题;但是只要输入流一大,一般都会分若干次读取,那么就非常容易截断,造成decode失败。比如aa bb cc dd ee ff,前3个字节aa bb cc可以decode成一个字符,后3个字节dd ee ff可以decode成另一个字符。但是有可能aa bb cc dd先读出来,ee ff在下一个循环才读出来,那decode后就会形成乱码

所以读字符的话,一般用InputStreamWriter会好一点,可以避免这个问题
FileInputStream fis = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fis, charset);
		
StringBuffer sb = new StringBuffer();
char[] buf = new char[64];
		
int count = 0;
		
while ((count = reader.read(buf)) != -1) {
    sb.append(buf,0,count);// 截取掉buf中,最后一次循环的冗余部分
    // sb.append(buf);
}
		
reader.close();
System.out.println(sb.toString());

和上面的例子很相像,区别在于定义的是char[]数组,而不是byte[]数组。在调用InputStreamReader类的read()方法时,已经将字节decode为字符了,所以不会出现InputStream中字节错误截断的问题

调用StringBuffer的append()方法时,同样要注意截取掉最后一次循环中的冗余数据,这个和上一个例子是一样的
分享到:
评论

相关推荐

    Java IO知识点

    了解这些基础知识后,可以更有效地处理Java程序中的输入输出操作,无论是文件操作、网络通信还是系统间的数据交互。在开发过程中,正确选择和使用Java IO流能够提高程序的效率和灵活性,是每个Java开发者必备的技能...

    第一行代码Java源代码第11章课程代码JavaIO编

    总的来说,《第一行代码Java源代码第11章》的课程内容会涵盖以上所述的Java IO基础知识,并通过实例代码帮助读者实践这些概念。通过学习这一章,开发者能够熟练掌握Java中的文件操作、流处理和网络通信,为后续的...

    Java IO应届生培训讲义

    Java IO应届生培训讲义是一份面向刚毕业的大学生进行Java IO相关知识的培训资料,它涵盖了Java IO的基础知识、不同的IO模型以及Java中的BIO、NIO和AIO高级IO类库。下面详细解释这些知识点: 1. 用户空间和内核空间 ...

    JavaIO系统基础知识.pdf

    JavaIO系统基础知识.pdf

    java基础之IO流

    ### Java IO流基础知识点 #### 一、IO流概述 - **定义**:在Java中,IO流(Input/Output Streams)是用来处理输入输出的基本工具。流是一种有序的数据集合,通常涉及从源到目的地的数据传输过程。源可以是文件、...

    javaIo操作的基础代码

    在提供的压缩包文件"Io基础文档"中,可能包含了关于这些概念的详细说明、示例代码和实战指导,对于深入理解和掌握Java IO操作非常有帮助。学习和理解这些内容,将有助于开发者在处理数据输入输出时编写出高效、稳定...

    java零基础自学 之 JavaIO流处理

    Java IO流处理是Java编程中一个非常重要的概念,主要用于数据的输入和输出操作。对于Java初学者来说,理解和掌握IO流的基本使用至关重要。...理解并熟练掌握这些基础知识,对于提升Java开发能力至关重要。

    javaIO练习题

    适合初学者练手.在了解 javaIO理论知识的基础上进一步巩固和深入了解

    Java IO相关基础知识简介

    Java IO 相关基础知识主要涉及网络通信、协议、套接字以及不同的IO模型。首先,IP协议负责在网络中传输数据,它将数据分割成小块并通过IP包发送,但不保证数据的可靠传输或顺序。TCP(传输控制协议)则是一个面向...

    java中的IO的基础教学(1)

    本教程将深入讲解Java IO流的基础知识,包括其概念、分类、常用类以及如何在实际编程中应用。 一、IO流的概念 IO流是Java提供的一组接口和类,用于在不同数据源之间传输数据。数据源可以是文件、内存、网络连接等。...

    java基础知识 io

    Java基础知识是学习Java编程语言的基石,其中包括对输入/输出(IO)的理解和应用。Java IO是Java平台中处理数据输入和输出的核心组件,对于任何Java开发者来说,掌握这一部分的知识至关重要。以下将详细阐述Java基础...

    JavaIO流详解归纳.pdf

    JavaIO流详解归纳 Java 的核心库 java.io 提供了全面的 IO 接口,包括文件读写、标准设备输出等。Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常...

    Java IO 基础操作(文件读写和移动)

    除了基础流,Java NIO(New IO)提供了一种更高效、非阻塞的IO模型。`java.nio`包下的`FileChannel`和`Files`类提供了更高级的文件操作,如映射内存到文件(MMap),以及异步文件操作。 例如,使用`Files`类移动...

    Java IO 使用例

    在“JavaIODemo”这个示例中,可能会包含以上提到的一些或全部Java IO操作的代码实例,通过这些实例,我们可以学习如何在实际项目中应用Java IO API。实践是掌握Java IO的最佳方式,通过对这些示例的分析和运行,...

    Java基础知识点总结.docx

    Java是一种广泛使用的面向对象的编程语言,其基础知识涵盖了多个方面,包括语法、面向对象特性、异常处理、多线程、I/O流、网络编程、反射技术、设计模式以及JVM等核心概念。以下是对这些知识点的详细说明: 一、...

    Java io的基本操作很全面的代码呀

    首先,我们来看看Java IO的基础知识。Java IO主要包括以下几大核心类: 1. **InputStream 和 OutputStream**:这是所有输入和输出流的基类,分别用于读取和写入原始字节数据。例如FileInputStream和...

Global site tag (gtag.js) - Google Analytics