1. PrintStream、BufferedWriter、PrintWriter的比较?
PrintStream和PrintWrite
1. PrintStream主要操作byte流,而PrintWriter用来操作字符流。读取文本文件时一般用后者。
2. PrintStream 在OutputStream 基础之上提供了增强的功能 , 即可以方便的输出各种类型的数据 ( 而不仅限于 byte 类型).PrintStrem 的方法从不抛出 IOException.Printwriter 提供了 PrintStream 的所有打印方法 , 其方法也从不抛出IOException。与 PrintStream 的区别 : 作为处理流使用时 ,PrintStream 只能封装 OutputStream 类型的字节流 ,而 PrintWriter 既可以封装 OutputStream, 也能封装Writer 类型的字符输出流并增强其功能
BufferedWriter和PrintWriter
3. PrintWriter的print、println方法可以接受任意类型的参数,而BufferedWriter的write方法只能接受字符、字符数组和字符串;
4. PrintWriter的println方法自动添加换行,BufferedWriter需要显示调用newLine方法;
5. PrintWriter的方法不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生;
6. PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush);
7. PrintWriter的构造方法更广。
2. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的.
3. 什么是java序列化,如何实现java序列化?
Java 串行化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的串行化机制是RMI、EJB等技术的技术基础。用途:利用对象的串行化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态。
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
4. 解释一下java.io.Serializable接口(面试常考)
实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。序列化类的所有子类本身都是可序列化的。这个序列化接口没有任何方法和域,仅用于标识序列化的语意。
通俗点说,所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得所有问题。
允许非序列化类的子类型序列化,子类型可以假定负责保存和恢复父类型的公有的、保护的和(如果可访问)包的域的状态。只要该类(扩展)有一个无参构造子,可初始化它的状态,那么子类型就可承担上述职责。在这种情况下申明一个可序列化的类是一个错误。此错误将在运行时被检测。
在逆序列化期间,将使用非序列化类的公用的或保护的无参构造子对它的域进行初始化。可序列化子类必须能访问父类的无参构造子。它的所有域将从相应流中被恢复。
当遍历一个图象时,很可能遇到一个不支持序列化接口的对象。此时将抛出NotSerializableException 异常,且标识该非序列化对象类。
在序列化处理过程中需要特定句柄的类,必须使用如下这些恰当的标记实现特定的方法:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
writeObject 方法负责写特定类的对象的状态,以至相应的readObject 方法能恢复它。通过调用 out.defaultWriteObject 可激活保存对象域的缺省机制。此方法不必关心状态是属于它的父类还是子类。使用 writeObject 方法或基本类型支持的 DataOutput 方法将每个域的状态保存到 ObjectOutputStream 中。
readObject 方法负责从此流中读取并恢复类的域。它可能调用in.defaultReadObject 方法来调用该对象的非静态和非暂时的域的缺省恢复机制。defaultReadObject 方法使用该流中的信息,用当前对象中的已命名域分配保存在流中该对象的相应域。当类已改进增加了新域时,这个接口也做相应处理。此方法不必关心状态是属于它的父类还是子类。使用 writeObject 方法或基本类型支持的 DataOutput 方法将每个域的状态保存到 ObjectOutputStream 中。
选择题
1. 读写原始数据,一般采用什么流?(B)
A InputStream
B DataInputStream
C OutputStream
D BufferedInputStream
2. 为了提高读写性能,可以采用什么流?(BF)
A InputStream
B DataInputStream
C BufferedReader
D BufferedInputStream
E OutputStream
F BufferedOutputStream
3. 对各种基本数据类型和String类型的读写,采用什么流?(EF)
A DataInputStream
B BufferedReader
C PrintWriter
D DataOutputStream
E ObjectInputStream
F ObjectOutputStream
4. 能指定字符编码的I/O流类型是:(BFGH)
A Reader
B InputStreamReader
C BufferedReader
D Writer
E PrintWriter
F ObjectInputStream
G ObjectOutputStream
H OutputStreamWriter
5. File类型中定义了什么方法来判断一个文件是否存在?(D)
A createNewFile
B renameTo
C delete
D exists
6. File类型中定义了什么方法来创建一级目录?(A)
A createNewFile
B exists
C mkdirs
D mkdir
7. 对文本文件操作用什么I/O流?(ABCD)
A FileReader
B FileInputStream
C RandomAccessFile
D FileWriter
8. 在unix服务器www.openlab.com.cn上提供了基于TCP的时间服务应用,该应用使用port为13。创建连接到此服务器的语句是:()
A Socket s = new Socket(“www.openlab.com.cn”, 13);
B Socket s = new Socket(“www.openlab.com.cn:13”);
C Socket s = accept(“www.openlab.com.cn”, 13);
9. 创建一个TCP客户程序的顺序是:(C)
A 获得I/O流
B 关闭I/O流
C 对I/O流进行读写操作
D 建立socket
E 关闭socket
10. 创建一个TCP服务程序的顺序是:(E)
A 创建一个服务线程处理新的连接
B 创建一个服务器socket
C 从服务器socket接受客户连接请求
D 在服务线程中,从socket中获得I/O流
E 对I/O流进行读写操作,完成与客户的交互
F 关闭socket
G 关闭I/O流
11. Java UDP编程主要用到的两个类型是:()
A UDPSocket
B DatagramSocket
C UDPPacket
D DatagramPacket
12. TCP/IP是一种:(B)
A 标准
B 协议
C 语言
D 算法
编程题
将一个GBK编码的文本文件转存为一个UTF-8编码的文本文件。
package com.jiale.demo01;
import java.io.*;
public class ChangeEncoding {
public static void changeEncoding(String inEncoding, String outEncoding, String inFileName, String outFileName) throws IOException {
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(inFileName), inEncoding));
BufferedWriter writer = new BufferedWriter(
newOutputStreamWriter(
new FileOutputStream(outFileName), outEncoding));
String s = null;
while ((s = reader.readLine()) != null) {
writer.write(s, 0, s.length());
writer.newLine();
}
writer.flush();
writer.close();
reader.close();
}
public static void main(String[] args) {
// TODO自动生成的方法存根
try {
changeEncoding("GBK", "UTF-8", "gbk.txt", "utf8.txt");
} catch (IOException e) {
System.out.println("转换失败,原因:" + e.getMessage());
}
}
}
编写一个程序,把a.txt中的单词与b.txt中的单词交替合并到c.txt中,a.txt中的单词用空格分隔b.txt中的单词用回车或空格分隔。
package com.jiale.demo01;
import java.io.*;
public class Myio {
public static void main(String[] args)throws IOException {
// TODO自动生成的方法存根
File a = null;
File b = null;
FileWriter fw = null;
try {
a = new File("d:\\a.txt");
b = new File("d:\\b.txt");
fw = new FileWriter("d:\\c.txt");
Youio ra = new Youio(a);
Youio rb = new Youio(b);
String aword = null;
String bword = null;
while (ra.hasNext() && rb.hasNext()) {
aword = ra.next();
fw.write(aword);
bword = rb.next();
fw.write(bword);
}
} catch (IOException e) {
e.printStackTrace();
}
finally{
fw.close();
}
}
}
class Youio {
int id = 0;
String[] arr;
File form = null;
FileReader reader = null;
public Youio(File f) throws IOException {
this.form = f;
reader = new FileReader(form);
char[] c = new char[(int) form.length()];
int index = reader.read(c);
String str = new String(c, 0, index);
arr = str.split("\n");
for (String s : arr) {
System.out.println(s);
}
} public boolean hasNext() {
if (id < arr.length) {
return true;
}
return false;
} public String next() {
return arr[id++];
}
}
假如现在给你一个txt文件,该文件中存在学生基本信息,如:学生名称、性别和年龄。每行存放一个学生信息,每个元信息之间是有空格分割。然后将这些学生信息通过IO解析出来并且按照年龄从大到小进行排序,最后输出学生信息。
txt文件的内容(studentData.txt):
12345 | # 姓名 性别 年龄(使用空格分割)张三 男 23李四 男 25王怡 女 27赵燕 女 21 |
package com.jiale.demo02;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class StudentInfo {
private List<Student> studentList;
public static void main(String[] args) {
StudentInfo studentInfo = new StudentInfo();
studentInfo.readStudentInfo("E:/Users/jiale/Desktop/studentData.txt");
studentInfo.comparator();
studentInfo.print();
}
public void print() {
for (Student stu : studentList) {
System.out.println(stu);
}
}
public void comparator() {
Collections.sort(this.studentList, newComparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge().compareTo(o2.getAge());
}
});
// 翻转List
Collections.reverse( this.studentList );
}
public void readStudentInfo(String filePath) {
studentList = new ArrayList<Student>();
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(new FileInputStream(filePath)) );
String line = "";
while ( (line = reader.readLine()) != null ) {
// #表示注释行
if ( !line.startsWith("#") ) {
String[] strs = line.split("\\s+");
if ( strs.length == 3 ) {
Student stu = new Student();
stu.setName( strs[0] );
stu.setSex( strs[1] );
try {
stu.setAge( new Integer(strs[2]) );
} catch(NumberFormatExceptionnumber) {
stu.setAge( new Integer("0") );
}
studentList.add(stu);
} else {
throw new RuntimeException("存在不正确的数据行");
}
}
}
} catch( Exception e ) {
e.printStackTrace();
} finally {
if ( null != reader) {
try {
reader.close();
reader = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
class Student {
private String name;
private String sex;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
运行结果:
Student [name=王怡, sex=女, age=27]
Student [name=李四, sex=男, age=25]
Student [name=张三, sex=男, age=23]
Student [name=赵燕, sex=女, age=21]
Java中通过递归调用删除文件夹下所有文件(删除文件,删除整个文件夹之类的题目常考)
package com.jiale.demo01;
import java.io.File;
public class FileTest {
public static void deleteAll(File file){
if(file.isFile() ||file.list().length == 0){
file.delete();
}
else{
File[] files = file.listFiles();
for(File f : files){
deleteAll(f);
f.delete();
}
}
}
public static void main(String[] args) {
// TODO自动生成的方法存根
File file = new File("d:/abc/xyz");
deleteAll(file);
}
}