Java字符流与字节流区别
- 格式:doc
- 大小:47.00 KB
- 文档页数:12
javase练习题一、基础知识篇1. Java基本数据类型有哪些?分别写出它们的默认值。
2. 什么是封装?简述封装的优点。
3. 请写出Java中的四种访问修饰符,并说明它们的访问权限。
4. 什么是构造方法?它与普通方法的区别是什么?5. 在Java中,如何实现方法的重载和重写?二、面向对象篇2. 如何实现一个简单的Java类,包含两个属性和一个方法?3. 简述Java中的继承机制及其作用。
4. 什么是接口?与抽象类有什么区别?5. 请举例说明Java中的多态性。
三、集合框架篇1. Java集合框架中常用的集合类有哪些?2. 请简述ArrayList和LinkedList的区别。
3. 什么是HashMap?它的工作原理是什么?4. 请解释HashSet和TreeSet的区别。
5. 如何遍历一个List集合?四、异常处理篇1. 什么是异常?Java中的异常分为哪几类?2. 请举例说明trycatchfinally语句的使用方法。
3. 什么是自定义异常?如何创建和使用自定义异常?4. 请简述Java异常处理机制的作用。
int a = 10;int b = 0;int result = a / b;五、IO流篇1. 请简述Java IO流的分类。
2. 如何实现文件复制功能?3. 请解释字节流和字符流的区别。
4. 什么是序列化和反序列化?如何实现?5. 请举例说明Java中的文件操作。
六、多线程篇1. 什么是线程?线程和进程有什么区别?2. 请简述线程的生命周期。
3. 如何创建一个线程?有哪几种方式?4. 什么是线程同步?为什么需要线程同步?5. 请解释线程池的概念及其作用。
七、网络编程篇1. 请简述TCP和UDP协议的区别。
2. 如何实现一个简单的Socket通信?3. 什么是URL?如何解析一个URL?4. 请简述HTTP协议的工作原理。
5. 如何实现一个简单的HTTP服务器?八、Java新特性篇1. 请列举Java 8中的几个新特性。
字节流和字符流进行读写操作的一般步骤
字节流和字符流是 Java 中用于数据读写的两种基本流,它们有着不同的特点和应用场景。
在字节流中进行读写操作一般包括以下步骤:
1. 打开文件或输入输出流:使用相应的打开方法,如打开FileInputStream 或 FileOutputStream 对象,打开文件或输出流。
2. 读取数据:使用输入流的 read() 方法或 RandomAccessFile 类的 read() 方法读取数据,将其存储在字节数组或字符数组中。
3. 处理数据:对读取到的数据进行处理,如将其转换为字符串、打印到控制台等。
4. 关闭流:使用相应的关闭方法,如 FileInputStream.close() 或 FileOutputStream.close() 方法,关闭文件或输入输出流。
在字符流中进行读写操作一般也包括以下步骤:
1. 打开文件或输入输出流:与字节流相似,使用相应的打开方法打开文件或输入输出流。
2. 读取字符:使用输入流的 read() 方法或 RandomAccessFile 类的 read() 方法读取字符,将其存储在字符数组中。
3. 处理字符:对读取到的字符进行处理,如将其转换为字符串、打印到控制台等。
4. 关闭流:与字节流相似,使用相应的关闭方法,如FileInputStream.close() 或 FileOutputStream.close() 方法,关闭文件或输入输出流。
不过,在字符流中,读取的字符需要进行编码转换,以适应不同的字符编码方案。
例如,在读取文本文件时,需要将读取到的字符进行 UTF-8 编码转换,以确保读取的字符符合文本文件的格式。
java io面试题Java IO(Input/Output)是Java程序中进行输入输出的基础类库,它提供了一套丰富的类和方法,用于处理文件、网络连接、输入流和输出流等操作。
在Java开发中,掌握和理解Java IO的相关知识是非常重要的。
本文将介绍一些常见的Java IO面试题,帮助读者更好地应对面试。
1. 请解释一下Java IO的工作原理。
Java IO主要通过流(Stream)的方式来操纵数据。
流是输入/输出操作的顶级抽象类,它可以理解为是一个数据在源和目标之间的一个通道。
Java中的流按照输入和输出分成了两个体系:输入流(InputStream)和输出流(OutputStream),分别用于读取和写入数据。
其中,输入流从源读取数据,输出流向目标写入数据。
2. 请解释一下字节流和字符流的区别。
Java IO中的字节流(Byte Stream)操作的是8位字节,它适用于二进制文件和字节流形式的输入输出。
而字符流(Character Stream)操作的是16位Unicode字符,它适用于文本文件和字符流形式的输入输出。
字节流和字符流在处理文本文件时有很大的不同,字节流需要自己处理字符编码转换的问题,而字符流则提供了字符编码转换的功能。
3. 请解释一下Java IO中的四种基本的File类(File、FileReader、FileWriter、FileInputStream、FileOutputStream)的作用,并给出它们的示例使用方式。
- File类:用于表示文件或目录的路径,可以操作文件或目录的属性、创建和删除文件或目录等。
```javaFile file = new File("path/to/file.txt");boolean exists = file.exists();boolean isDirectory = file.isDirectory();```- FileReader和FileWriter类:用于从文件中读取字符流和向文件中写入字符流的操作。
《JA V A语言程序设计》期末考试试题及答案6一、填空题1.定义类的保留字是(class ),定义接口的保留字是( interface )。
2.Socket通常也称为(套接字),用于描述( IP 地址) 和( 端口)。
3.线程的优先级在( 1 )至( 10)之间,数值越大( 任务越紧急)。
4.构造方法是一种特殊的成员方法,构造方法名与( 类名) 相同。
5.Java语言只允许单继承,指每个类只能有一个( 父类)。
6.Java源程序的扩展名是( .java ),经过编译后的程序的扩展名是(.class )。
7. 在一个时间只能由一个线程访问的资源称为( 临界资源) 。
访问临界资源的代码(临界代码)。
8. 在多线程系统中,多个线程之间有( 同步) 和( 互斥) 两种关系。
二、选择题1.关于选择结构下列哪个说法正确?()A.if语句和else语句必须成对出现B.if语句可以没有else语句对应C.switch结构中每个case语句中必须用break语句D.switch结构中必须有default语句2.while循环和do…while循环的区别是:()A.没有区别,这两个结构任何情况下效果一样B.while循环比do…while循环执行效率高C.while循环是先循环后判断,所以循环体至少被执行一次D.do…while循环是先循环后判断,所以循环体至少被执行一次3.关于for循环和while循环的说法哪个正确?()A.while循环先判断后执行,for循环先执行后判断。
B.while循环判断条件一般是程序结果,for循环的判断条件一般是非程序结果C.两种循环任何时候都不可以替换D.两种循环结构中都必须有循环体,循环体不能为空4.下列修饰符中与访问控制无关的是()A.private B.publicC.protected D.final5.void的含义:()A.方法没有返回值B.方法体为空C.没有意义 D.定义方法时必须使用6.return语句:()A.只能让方法返回数值B.方法都必须含有C.方法中可以有多句return D.不能用来返回对象7.关于对象成员占用内存的说法哪个正确?()A.同一个类的对象共用同一段内存B、同一个类的对象使用不同的内存段,但静态成员共享相同的内存空间C.对象的方法不占用内存D.以上都不对8.下列说法哪个正确?A.不需要定义类,就能创建对象B.对象中必须有属性和方法C.属性可以是简单变量,也可以是一个对象D、属性必须是简单变量9.下列说法哪个正确?()A、一个程序可以包含多个源文件B、一个源文件中只能有一个类C、一个源文件中可以有多个公共类D、一个源文件只能供一个程序使用10.关于方法main()的说法哪个正确?()A.方法main()只能放在公共类中B main()的头定义可以根据情况任意更改C.一个类中可以没有main()方法D.所有对象的创建都必须放在main()方法中11.构造函数何时被调用?()A、创建对象时B、类定义时C、使用对象的方法时D、使用对象的属性时12.抽象方法:()A、可以有方法体B、可以出现在非抽象类中C、是没有方法体的方法D、抽象类中的方法都是抽象方法13.关于继承的说法正确的是:()A、子类将继承父类所有的属性和方法。
JAVA程序设计课程考试试卷专升本考研期末考试真题参考题⽬(⼀)参考答案最近很多⼈私信问我,答案没有,现在我将这个贴在这⾥:1.使⽤Java语⾔编写的源程序保存时的⽂件扩展名是( B )。
(A).class (B).java (C).cpp (D).txt2.设int a=-2,则表达式a>>>3的值为( C )。
(A)0 (B)3 (C)8 (D)-13.设有数组的定义int[] a = new int[3],则下⾯对数组元素的引⽤错误的是( C )。
(A)a[0]; (B)a[a.length-1]; (C)a[3]; (D)int i=1; a[i];4.在类的定义中可以有两个同名函数,这种现象称为函数( D )。
(A)封装 (B)继承 (C)覆盖 (D)重载5.在类的定义中构造函数的作⽤是( D )。
(A)保护成员变量 (B)读取类的成员变量 (C)描述类的特征 (D)初始化成员变量6.下⾯关键字中,哪⼀个不是⽤于异常处理语句( B )。
(A)try (B)break (C)catch (D)finally7.类与对象的关系是( A )。
(A)类是对象的抽象 (B)对象是类的抽象 (C)对象是类的⼦类 (D)类是对象的具体实例8.下⾯哪⼀个是Java中不合法的标识符( D )。
(A)$persons (B)twoNum (C)_myVar (D)point9.为AB类的⼀个⽆形式参数⽆返回值的⽅法method书写⽅法头,使得使⽤类名AB作为前缀就可以调⽤它,该⽅法头的形式为( A )。
(A)static void method( ) (B)public void method( )(C)final void method( ) (D)abstract void method( )10.欲构造ArrayList类的⼀个实例,此类继承了List接⼝,下列哪个⽅法是正确的( B )。
Java中的字节,字符与编码,解码ASCII编码ASCII码主要是为了表⽰英⽂字符⽽设计的,ASCII码⼀共规定了128个字符的编码(0x00-0x7F),只占⽤了⼀个字节的后⾯7位,最前⾯的1位统⼀规定为0。
ISO-8859-1编码为了扩展覆盖其他语⾔字符,ISO组织在ASCII码基础上⼜制定了⼀系列标准⽤来扩展ASCII编码,它们是ISO-8859-1~ISO-8859-15,其中ISO-8859-1应⽤得最⼴泛。
ISO-8859-1仍然是单字节编码,它总共能表⽰256个字符。
ISO-8859-1向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII⼀致。
因为ISO-8859-1编码范围使⽤了单字节内的所有空间,在⽀持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。
换⾔之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。
Unicode,UCS2和UCS4Unicode是为整合全世界的所有语⾔⽂字⽽诞⽣的。
任何⽂字在Unicode中都对应⼀个值,这个值称为代码点(Code Point),常写成 U+XXXX的格式。
⽽⽂字和代码点之间的对应关系就有UCS-2和UCS-4。
UCS-2:⽤两个字节来表⽰代码点,其取值范围为 U+0000~U+FFFF。
UCS-4:为了能表⽰更多的⽂字,⼈们⼜提出了UCS-4,即⽤四个字节表⽰代码点。
它的范围为 U+00000000~U+7FFFFFFF,其中U+00000000~U+0000FFFF和UCS-2是⼀样的。
要注意,UCS-2和UCS-4只规定了代码点和⽂字之间的对应关系,并没有规定代码点在计算机中如何存储。
规定存储⽅式的称为UTF(Unicode Transformation Format),其中应⽤较多的就是UTF-8和UTF-16了。
UTF-8,UTF-16,UTF-32UTF-32是对应于UCS-4,不常⽤。
java字符流与字节流的区别是什么java中字符流与字节流的区别:1、字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
2、字节流默认不使⽤缓冲区;字符流使⽤缓冲区。
3、字节流通常⽤于处理⼆进制数据,实际上它可以处理任意类型的数据,但它不⽀持直接写⼊或读取Unicode码元;字符流通常处理⽂本数据,它⽀持写⼊及读取Unicode码元。
字节流Java中的字节流处理的最基本单位为单个字节,它通常⽤来处理⼆进制数据。
Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输⼊字节流和输出字节流。
InputStream类与OutputStream类均为抽象类,我们在实际使⽤中通常使⽤Java类库中提供的它们的⼀系列⼦类。
下⾯我们以InputStream类为例,来介绍下Java中的字节流。
InputStream类中定义了⼀个基本的⽤于从字节流中读取字节的⽅法read,这个⽅法的定义如下:public abstract int read() throws IOException;这是⼀个抽象⽅法,也就是说任何派⽣⾃InputStream的输⼊字节流类都需要实现这⼀⽅法,这⼀⽅法的功能是从字节流中读取⼀个字节,若到了末尾则返回-1,否则返回读⼊的字节。
关于这个⽅法我们需要注意的是,它会⼀直阻塞知道返回⼀个读取到的字节或是-1。
另外,字节流在默认情况下是不⽀持缓存的,这意味着每调⽤⼀次read⽅法都会请求操作系统来读取⼀个字节,这往往会伴随着⼀次磁盘IO,因此效率会⽐较低。
有的⼩伙伴可能认为InputStream类中read的以字节数组为参数的重载⽅法,能够⼀次读⼊多个字节⽽不⽤频繁的进⾏磁盘IO。
那么究竟是不是这样呢?我们来看⼀下这个⽅法的源码:public int read(byte b[]) throws IOException {return read(b, 0, b.length);}它调⽤了另⼀个版本的read重载⽅法,那我们就接着往下追:public int read(byte b[], int off, int len) throws IOException {if (b == null) {throw new NullPointerException();} else if (off < 0 || len < 0 || len > b.length - off) {throw new IndexOutOfBoundsException();} else if (len == 0) {return 0;}int c = read();if (c == -1) {return -1;}b[off] = (byte)c;int i = 1;try {for (; i < len ; i++) {c = read();if (c == -1) {break;}b[off + i] = (byte)c;}} catch (IOException ee) {}return i;}从以上的代码我们可以看到,实际上read(byte[])⽅法内部也是通过循环调⽤read()⽅法来实现“⼀次”读⼊⼀个字节数组的,因此本质来说这个⽅法也未使⽤内存缓冲区。
java中8种基本数据类型Java是一种面向对象的编程语言,它支持8种基本数据类型。
这些数据类型是在Java中最基础的数据类型,用于存储各种不同类型的数据。
本文将详细介绍这8种基本数据类型。
一、整型(int)整型是Java中最常用的数据类型之一,它可以存储整数值。
整型变量可以被声明为以下几种:- byte:该变量可以存储-128到127之间的整数。
- short:该变量可以存储-32768到32767之间的整数。
- int:该变量可以存储-2147483648到2147483647之间的整数。
- long:该变量可以存储非常大或非常小的整数,范围为-9223372036854775808到9223372036854775807。
二、浮点型(float和double)浮点型用于表示小数,包括单精度浮点型和双精度浮点型两种。
float:该变量可以存储6到7位小数,并且范围约为1.4e-45到3.4e+38。
double:该变量可以存储15位小数,并且范围约为4.9e-324到1.8e+308。
三、字符型(char)字符型用于表示单个字符,例如字母、数字和标点符号等。
它只能存储一个字符,使用单引号来声明。
四、布尔型(boolean)布尔型用于表示真或假的值。
它只有两个值:true和false。
五、字节型(byte)字节型是Java中最小的数据类型,它可以存储-128到127之间的整数。
它通常用于处理二进制数据,例如图像和声音等。
六、短整型(short)短整型可以存储-32768到32767之间的整数。
它通常用于节省内存空间,例如在数组中存储大量数据时。
七、长整型(long)长整型可以存储非常大或非常小的整数,范围为-9223372036854775808到9223372036854775807。
它通常用于处理时间戳或其他需要精确计算的数据。
八、无符号整型(unsigned int)无符号整型只能存储正数,范围为0到4294967295。
字节流与字符流的区别详解先来看⼀下流的概念:在程序中所有的数据都是以流的⽅式进⾏传输或保存的,程序需要数据的时候要使⽤输⼊流读取数据,⽽当程序需要将⼀些数据保存起来的时候,就要使⽤输出流完成。
程序中的输⼊输出都是以流的形式保存的,流中保存的实际上全都是字节⽂件。
字节流与字符流在java.io包中操作⽂件内容的主要有两⼤类:字节流、字符流,两类都分为输⼊和输出操作。
在字节流中输出数据主要是使⽤OutputStream完成,输⼊使的是InputStream,在字符流中输出主要是使⽤Writer类完成,输⼊流主要使⽤Reader类完成。
(这四个都是抽象类)java中提供了专⽤于输⼊输出功能的包Java.io,其中包括:InputStream,OutputStream,Reader,WriterInputStream 和OutputStream,两个是为字节流设计的,主要⽤来处理字节或⼆进制对象,Reader和 Writer.两个是为字符流(⼀个字符占两个字节)设计的,主要⽤来处理字符或字符串.字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,⽽字节流处理单元为1个字节,操作字节和字节数组。
所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符⽽成的,所以它对多国语⾔⽀持性⽐较好!如果是⾳频⽂件、图⽚、歌曲,就⽤字节流好点,如果是关系到中⽂(⽂本)的,⽤字符流好点所有⽂件的储存是都是字节(byte)的储存,在磁盘上保留的并不是⽂件的字符⽽是先把字符编码成字节,再储存这些字节到磁盘。
在读取⽂件(特别是⽂本⽂件)时,也是⼀个字节⼀个字节地读取以形成字节序列字节流可⽤于任何类型的对象,包括⼆进制对象,⽽字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,⽽字符流就可以字节流是最基本的,所有的InputStrem和OutputStream的⼦类都是,主要⽤在处理⼆进制数据,它是按字节来处理的但实际中很多的数据是⽂本,⼜提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进⾏字符集的转化这两个之间通过InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统⼀⽽造成的==================我们还可以看到:============Reader类的read()⽅法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1inputStream的read()虽然也返回int,但由于此类是⾯向字节流的,⼀个字节占8个位,所以返回 0 到 255范围内的 int 字节值。
JavaIO流常见⾯试题JavaIO流常见⾯试题1. Java中有⼏种类型的流?1. 字符流和字节流。
2. 字节流继承inputStream和OutputStream3. 字符流继承⾃InputSteamReader和OutputStreamWriter4. 总体结构图2.字节流和字符流哪个好?怎么选择?1. ⼤多数情况下使⽤字节流会更好,因为⼤多数时候 IO 操作都是直接操作磁盘⽂件,所以这些流在传输时都是以字节的⽅式进⾏的(图⽚等都是按字节存储的)2. 如果对于操作需要通过 IO 在内存中频繁处理字符串的情况使⽤字符流会好些,因为字符流具备缓冲区,提⾼了性能3. 什么是缓冲区?有什么作⽤?1. 缓冲区就是⼀段特殊的内存区域,很多情况下当程序需要频繁地操作⼀个资源(如⽂件或数据库)则性能会很低,所以为了提升性能就可以将⼀部分数据暂时读写到缓存区,以后直接从此区域中读写数据即可,这样就显著提升了性。
2. 对于 Java 字符流的操作都是在缓冲区操作的,所以如果我们想在字符流操作中主动将缓冲区刷新到⽂件则可以使⽤ flush() ⽅法操作。
4. 字符流和字节流有什么区别?字符流和字节流的使⽤⾮常相似,但是实际上字节流的操作不会经过缓冲区(内存)⽽是直接操作⽂本本⾝的,⽽字符流的操作会先经过缓冲区(内存)然后通过缓冲区再操作⽂件5. 什么是Java序列化,如何实现Java序列化?1. 序列化就是⼀种⽤来处理对象流的机制,将对象的内容进⾏流化。
可以对流化后的对象进⾏读写操作,可以将流化后的对象传输于⽹络之间。
序列化是为了解决在对象流读写操作时所引发的问题2. 序列化的实现:将需要被序列化的类实现Serialize接⼝,没有需要实现的⽅法,此接⼝只是为了标注对象可被序列化的,然后使⽤⼀个输出流(如:FileOutputStream)来构造⼀个ObjectOutputStream(对象流)对象,再使⽤ObjectOutputStream对象的write(Object obj)⽅法就可以将参数obj的对象写出6. PrintStream、BufferedWriter、PrintWriter的⽐较?1. PrintStream类的输出功能⾮常强⼤,通常如果需要输出⽂本内容,都应该将输出流包装成PrintStream后进⾏输出。
Java进阶知识常见异常:空指针异常NullPointerException,调⽤了未经初始化的对象或不存在的对象,或访问或修改了null对象的属性或⽅法;找不到类名异常ClassNotFoundException,的确不存在,开发环境进⾏了调整或,如类的根⽬录结构、编译运⾏时发⽣变化的等;类名不合法异常IllegalAgreementException,向⽅法传递了不合法或不正确的参数;输⼊不匹配异常InputMismatchException,由scanner抛出表获取内容与期望类型的模式不⼀致或内容超出预期;IllegalAccessException,应⽤程序试图创建⼀个实例、设置或获取⼀个属性,或调⽤⼀个⽅法,但当前正在执⾏的⽅法⽆法访问指定类、属性、⽅法或构造⽅法的定义时;ClassCastExceptiom,当试图将对象转换为不是实例的⼦类时抛出;SQLException,数据库访问或其他错误信息的异常;IOException,发⽣某种I/O异常。
运⾏时异常和检查时异常的区别:运⾏时异常,不要求程序在编译时对异常进⾏处理,也能编译通过;检查时异常⼜称⾮运⾏异常,要求程序员必须在编译时进⾏处理,否则编译不通过。
【企业⾯试常考】ArrayList和LinkList的区别:前者采⽤数组进⾏顺序存储,在插⼊或删除数据时,需要批量移动数据元素,故性能较差;在查询数据元素时,因为数组是是连续存储的,可以通过下标进⾏访问,故在遍历元素或随机访问元素时效率⾼。
LinkList则相反。
顺序存储结构和链式存储结构的优缺点:前者优点:节省存储空间(分配的存储单元全⽤来存放节点的数据,节点间逻辑关系没有占⽤额外的存储空间);增加访问速度(存储单元存放可实现节点的随机存取);查找速度快。
缺点:插删慢后者优点:插删快。
缺点:占⽤空间⼤(每个节点都由数据域和指针域组成);查找速度慢(通过指针逐个查找)。
栈和队列两种数据结构特点:栈Stack:先进后出或后进先出;只能在⼀端进⾏插⼊和删除操作的特殊的线性表。
Java输⼊输出流(⼀)——常⽤的输⼊输出流1.流的概念:在Java中,流是从源到⽬的地的字节的有序序列。
Java中有两种基本的流——输⼊流(InputStream)和输出流(OutputStream)。
根据流相对于程序的另⼀个端点的不同,分为节点流和过滤流。
(1)节点流:以特定源如磁盘⽂件、内存某区域或者线程之间的管道为端点的构造输⼊输出流,是⼀种基本的流。
(2)过滤流:以其他已经存在的流为端点构造的输⼊输出流。
根据流中的数据单位分为字节流和字符流。
(1)字节流:流中的数据是以8位字节为单位进⾏读写,以InputStream和OutputStream为基础类。
(2)字符流:流中的数据是以16为字符为单位进⾏读写,以Reader和Writer为基础类。
2.字节流InputStream和OutputStream是字节流的两个顶层⽗类,提供了输⼊流类和输出流类的通⽤API。
2.1 输⼊字节流InputStream基本⽅法:(1)基本读⽅法;: int read() int read(byte[] b) int read(byte[] b,int off,int len)(2) 关闭流:void close()(3) 返回输⼊流中还有多少可读字节 int available()(4) 跳过指定字节 long skip(long n)(5) 回读数据 boolean markSupported() void Mark(int readlimt) void reset()2.2 输出字符流OutputStream基本⽅法:(1)基本写⽅法:void write(int c) void write(byte[] b) void write(byte[] b,int off,int len)(2) 关闭流:void close()(3)q强制输出:void flush()3.字符流:Reader和Writer是字符流的顶层⽗类,字符流能够处理Unicode字符集中的所有字符。
字符和字节的区别字节(Byte):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。
字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制。
一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.符号:英文标点占一个字节,中文标点占两个字节.如电子表格中,一个汉字是占二个字节的换算为1KB=1024B字符字符>=字节1.2字符,字节,字符串理解编码的关键,是要把字符的概念和字节的概念理解准确。
这两个概念容易混淆,我们在此做一下区分:概念描述举例字符人们使用的记号,抽象意义上的一个符号。
'1', '中', 'a', '$', '¥', ……字节计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。
0x01,0x45, 0xFA, ……ANSI字符串在内存中,如果“字符”是以ANSI编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为ANSI字符串或者多字节字符串。
"中文123"(占7字节)UNICODE字符串在内存中,如果“字符”是以在UNICODE中的序号存在的,那么我们称这种字符串为UNICODE字符串或者宽字节字符串。
L"中文123"(占10字节)由于不同ANSI编码所规定的标准是不相同的,因此,对于一个给定的多字节字符串,我们必须知道它采用的是哪一种编码规则,才能够知道它包含了哪些“字符”。
而对于UNICODE字符串来说,不管在什么环境下,它所代表的“字符”内容总是不变的.。
1、Java 中IO 流?Java 中IO 流分为几种?1.按照流的流向分,可以分为输入流和输出流;2.按照操作单元划分,可以划分为字节流和字符流;3.按照流的角色划分为节点流和处理流。
Java Io 流共涉及40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系,Java I0 流的40 多个类都是从如下4 个抽象类基类中派生出来的。
1.InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
2.OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
2、Java IO与NIO的区别NIO即New IO,这个库是在JDK1.4中才引入的。
NIO和IO有相同的作用和目的,但实现方式不同,NIO 主要用到的是块,所以NIO的效率要比IO高很多。
在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
3、常用io类有那些4、字节流与字符流的区别以字节为单位输入输出数据,字节流按照8位传输以字符为单位输入输出数据,字符流按照16位传输5、阻塞IO 模型最传统的一种IO 模型,即在读写数据过程中会发生阻塞现象。
当用户线程发出IO 请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。
当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block 状态。
典型的阻塞IO 模型的例子为:data = socket.read();如果数据没有就绪,就会一直阻塞在read 方法6、非阻塞IO 模型当用户线程发起一个read 操作后,并不需要等待,而是马上就得到了一个结果。
如果结果是一个error 时,它就知道数据还没有准备好,于是它可以再次发送read 操作。
一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。
关于Java的File.separator⼀、File类在Windows下的路径分隔符(\)和在Linux下的路径分隔符(/)是不⼀样的,当直接使⽤绝对路径时,跨平台会报No Such file or diretory异常。
File中还有⼏个与separator类似的静态常量,与系统有关,在编程中应尽量使⽤。
ps:File file = new File("G:"+ File.separator +"demo.txt");File类是java.io包中唯⼀⼀个与⽂件本⾝操作有关的类,⽂件本⾝操作是指⽂件的创建、删除、重命名等 .构造⽅法:public File(String pathName),传⼊完整的路径,WEB开发此⽅式⽐较好⽤。
.构造⽅法:public File(File parent,String child),传⼊⽗路径和⼦路经。
基本的⽂件操作: .创建新⽂件:public boolean createNewFile() throws IOException; .删除⽂件:public boolean delete(); .判断⽂件是否存在:public boolean exists();import java.io.File;import java.io.IOException;public class TestFile {public static void main(String [] args) throws IOException{File file = new File("G:\\demo.txt");System.out.println("file:"+file);if(file.exists()){file.delete();System.out.println("执⾏了删除⽂件!");}else{file.createNewFile();System.out.println("执⾏了创建⽂件");}}}如果进⾏⽂件创建时有⽬录,则需要先创建⽬录之后才可以创建⽂件。
1. ==和equals的区别是什么?1)==对于基本类型和引用类型==的作用效果是不同的,如下所示:基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;代码示例:String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); // trueSystem.out.println(x==z); // falseSystem.out.println(x.equals(y)); // trueSystem.out.println(x.equals(z)); // true代码解读:因为x和y指向的是同一个引用,所以==也是true,而new String()方法则重写开辟了内存空间,所以==结果为false,而equals比较的一直是值,所以结果都为true2)equalsObject的equals本质上就是==,只不过String和Integer等重写Object的equals方法,把引用比较改成了值比较。
总结:==对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而equals默认情况下是引用比较,只是很多类重写了equals 方法,比如String、Integer等把它变成了值比较,所以一般情况下equals比较的是值是否相等。
3.重载(overload)和重写(override)的区别。
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型、参数列表,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。
《Java程序设计精典教程》习题答案编著:胡伏湘,雷军环清华大学出版社第9章习题解答一、简答题1.什么叫流?对流的分类通常有几种方式?答:流是指一组有顺序的、有起点和终点的字节结合。
流的分类方式有多种:⏹根据数据流动的方向,可分为输入流和输出流。
输入流:只能从中读取数据,而不能向其写出数据输出流:只能向其写出数据,而不能从中读取数据⏹根据处理数据的单位划分,可分为字符流和字节流字节流:以字节为单位进行数据传输,每次传送一个或多个字节字符流:以Unicode字符为单位进行数据传输,每次传送一个或多个字符⏹根据数据流所关联的是数据源还是其他数据流,可分为节点流和处理流节点流:直接从指定的位置(如磁盘文件或内存区域)读或写处理流:对一个巳存在的流的连接和封装,通过对所封装的流的功能调用实现数据的读/写功能,处理流并不直接连接到数据流。
2.Java的所有I/O流都是四个抽象类的子类,这四个抽象类是什么?答:⏹InputStream:是所有字节输入流的父类⏹OutputStream:是所有字节输出流的父类⏹Reader:是所有输入字符流的父类⏹Writer:是所有输出字符流的父类⏹3.写出下面这些输入输出流类的输入输出操作的特点。
(1)InputStream和OutputStream(2)DataInputStream 和DataOutputStream(3)FileInputStream和FileOutputStream(4)PrintStream(5)RandomAccessFile答:(1)一个字节一个字节地输入输出数据(2)按照不同的数据类型输入输出数据(3)一个字节一个字节地输入输出数据(4)把数据转化成字符串输出(5)能够随机访问普通文件4.File类的作用是什么?答:File类是I/O包中唯一能够代表磁盘文件本身的对象,使用File类,我们可以方便地建立与某磁盘文件的连接。
一个对应着某磁盘文件或目录的File对象一经创建,我们就可以通过调用它的方法来获得该文件或目录的属性,File类中还定义了一些对文件或目录进行管理、操作的方法,利用这些方法可以完成对文件和目录的建立、删除、查询、重命名等操作。
1.1Java字符流与字节流的区别修改浏览权限| 删除Java 流在处理上分为字符流和字节流。
字符流处理的单元为2 个字节的Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为1 个字节,操作字节和字节数组。
Java 内用Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和java 内Unicode 字符流之间的转换。
而类InputStreamReader 和OutputStreamWriter 处理字符流和字节流的转换。
字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
( 一)以字节为导向的stream------InputStream/OutputStreamInputStream 和OutputStream 是两个abstact 类,对于字节为导向的stream 都扩展这两个基类;1、InputStream1.1ByteArrayInputStream -- 把内存中的一个缓冲区作为InputStream 使用.construct---(A)ByteArrayInputStream(byte[]) 创建一个新字节数组输入流(ByteArrayInputStream ),它从指定字节数组中读取数据(使用byte 作为其缓冲区数组)(B)---ByteArrayInputStream(byte[], int, int) 创建一个新字节数组输入流,它从指定字节数组中读取数据。
---mark:: 该字节数组未被复制。
1.2StringBufferInputStream -- 把一个String 对象作为InputStream .construct---StringBufferInputStream(String) 据指定串创建一个读取数据的输入流串。
注释:不推荐使用StringBufferInputStream 方法。
此类不能将字符正确的转换为字节。
同JDK 1.1 版中的类似,从一个串创建一个流的最佳方法是采用StringReader 类。
1.3FileInputStream -- 把一个文件作为InputStream ,实现对文件的读取操作construct---(A)FileInputStream(File name) 创建一个输入文件流,从指定的File 对象读取数据。
(B)FileInputStream(FileDescriptor) 创建一个输入文件流,从指定的文件描述器读取数据。
(C)-FileInputStream(String name) 创建一个输入文件流,从指定名称的文件读取数据。
method ---- read() 从当前输入流中读取一字节数据。
read(byte[]) 将当前输入流中b.length 个字节数据读到一个字节数组中。
read(byte[], int, int) 将输入流中len 个字节数据读入一个字节数组中。
1.4PipedInputStream :实现了pipe 的概念,主要在线程中使用. 管道输入流是指一个通讯管道的接收端。
一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
construct---PipedInputStream() 创建一个管道输入流,它还未与一个管道输出流连接。
PipedInputStream(PipedOutputStream) 创建一个管道输入流, 它已连接到一个管道输出流。
1.5SequenceInputStream :把多个InputStream 合并为一个InputStream . “序列输入流”类允许应用程序把几个输入流连续地合并起来,并且使它们像单个输入流一样出现。
每个输入流依次被读取,直到到达该流的末尾。
然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。
construct---SequenceInputStream(Enumeration) 创建一个新的序列输入流,并用指定的输入流的枚举值初始化它。
SequenceInputStream(InputStream, InputStream) 创建一个新的序列输入流,初始化为首先读输入流s1, 然后读输入流s2 。
2、OutputSteam2.1ByteArrayOutputStream :把信息存入内存中的一个缓冲区中. 该类实现一个以字节数组形式写入数据的输出流。
当数据写入缓冲区时,它自动扩大。
用toByteArray() 和toString() 能检索数据。
constructor(A)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。
(B)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。
(C)--- ByteArrayOutputStream(int) 创建一个新的字节数组输出流,并带有指定大小字节的缓冲区容量。
toString(String) 根据指定字符编码将缓冲区内容转换为字符串,并将字节转换为字符。
write(byte[], int, int) 将指定字节数组中从偏移量off 开始的len 个字节写入该字节数组输出流。
write(int) 将指定字节写入该字节数组输出流。
writeTo(OutputStream) 用out.write(buf, 0, count) 调用输出流的写方法将该字节数组输出流的全部内容写入指定的输出流参数。
2.2FileOutputStream: 文件输出流是向File 或FileDescriptor 输出数据的一个输出流。
constructor(A)FileOutputStream(File name) 创建一个文件输出流,向指定的File 对象输出数据。
(B)FileOutputStream(FileDescriptor) 创建一个文件输出流,向指定的文件描述器输出数据。
(C)FileOutputStream(String name) 创建一个文件输出流,向指定名称的文件输出数据。
(D)FileOutputStream(String, boolean) 用指定系统的文件名,创建一个输出文件。
2.3PipedOutputStream: 管道输出流是指一个通讯管道的发送端。
一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
constructor(A)PipedOutputStream() 创建一个管道输出流,它还未与一个管道输入流连接。
(B)PipedOutputStream(PipedInputStream) 创建一个管道输出流,它已连接到一个管道输入流。
( 二)以字符为导向的stream Reader/Writer以Unicode 字符为导向的stream ,表示以Unicode 字符为单位从stream 中读取或往stream 中写入信息。
Reader/Writer 为abstact 类以Unicode 字符为导向的stream 包括下面几种类型:1. Reader1.1CharArrayReader :与ByteArrayInputStream 对应此类实现一个可用作字符输入流的字符缓冲区constructorCharArrayReader(char[]) 用指定字符数组创建一个CharArrayReader 。
CharArrayReader(char[], int, int) 用指定字符数组创建一个CharArrayReader1.2StringReader :与StringBufferInputStream 对应其源为一个字符串的字符流。
StringReader(String) 创建一新的串读取者。
1.3FileReader :与FileInputStream 对应1.4PipedReader :与PipedInputStream 对应2. Writer2.1 CharArrayWrite :与ByteArrayOutputStream 对应2.2 StringWrite :无与之对应的以字节为导向的stream2.3 FileWrite :与FileOutputStream 对应2.4 PipedWrite :与PipedOutputStream 对应3、两种不同导向的stream 之间的转换3.1InputStreamReader 和OutputStreamReader :把一个以字节为导向的stream 转换成一个以字符为导向的stream 。
InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。
使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。
InputStreamReader 的read() 方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。
为了达到更高效率,考虑用BufferedReader 封装InputStreamReader ,BufferedReader in = new BufferedReader(new InputStreamReader(System.in));例如:// 实现从键盘输入一个整数view plaincopy to clipboardprint?String s = null;InputStreamReader re = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(re);try {s = br.readLine();System.out.println("s= " + Integer.parseInt(s));br.close();}catch (IOException e){e.printStackTrace();}catch (NumberFormatException e)// 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
{System.out.println(" 输入的不是数字");}String s = null; InputStreamReader re = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(re); try { s = br.readLine(); System.out.println("s= " + Integer.parseInt(s)); br.close(); } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e)// 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。