输入输出(I/O)及网络编程相关题
1、要从文件\”file.dat\”文件中读出第10个字节到变量c中,下列哪个方法适合?( A )
(A)FileInputStream in=new FileInputStream(“file.dat”); in.skip(9); int c=in.read();
(B)FileInputStream in=new FileInputStream(“file.dat”); in.skip(10); int c=in.read();
©FileInputStream in=new FileInputStream(“file.dat”); int c=in.read();
(D)RandomAccessFile in=new RandomAccessFile(“file.dat”); in.skip(9); int c=in.readByte();
2、构造BufferedInputStream的合适参数是哪个?( A C )
(A) BufferedInputStream(B) BufferedOutputStream(C) FileInputStream(D) FileOuterStream
3、下面程序的运行结果是( D )
FileOutputStream fos = new FileOutputStream(“c:\\demo.txt”);
fos.write(“abc”);
fos.close();
(A) 在C盘创建文件demo.txt,但文件是空的
(B) 在C盘创建文件demo.txt,并写入数据abc
© 将C盘已有的文件demo.txt中追加写入abc
(D) 编译失败
4、下列关于Java中文件输入输出的说法正确的是( A C )
(A) 在Java中,文件的输入输出功能是通过流来实现的
(B) 如果要把数据写入到一个文件中,需要创建一个输入流对象
© 字符流在某些方面比如汉字的处理,比字节流更方便
(D) 可以通过Reader r = new Reader(“c:\\pet.txt”)创建一个输入流对象
5、请看如下代码:
BufferedReader br = new BufferedReader(new FileReader(“c:\\a.txt”));
BufferedWriter bw = new BufferedWriter(new FileWriter(“d:\\b.txt”));
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
它表达的意思是?( A )
(A) 把c盘目录下的a.txt文件内容复制到d盘目录下的b.txt
(B) 把d盘目录下的b.txt文件内容复制到c盘目录下的a.txt
© 读取c盘目录下a.txt文件,输出在控制台
(D) 把控制台的内容写入到d盘目录下的b.txt文件中
7、Character流与Byte流的区别是( C )
(A) 每次读入的字节数不同 (B) 前者带有缓冲,后者没有
© 前者是字符读写,后者是字节读写 (D) 二者没有区别,可以互换使用
8、阅读以下代码:
import java.io.;
import java.util.;
public class foo{
public static void main (String[] args){
String s;
System.out.println(“s=” + s);
}
}
输出结果应该是:( C )
(A) 代码得到编译,并输出“s=”
(B) 代码得到编译,并输出“s=null”
© 由于String s没有初始化,代码不能编译通过
(D) 代码得到编译,但捕获到 NullPointException异常
9、新建一个流对象,下面哪个选项的代码是错误的?( B )
(A) new BufferedWriter(new FileWriter(“a.txt”));
(B) new BufferedReader(new FileInputStream(“a.dat”));
© new GZIPOutputStream(new FileOutputStream(“a.zip”));
(D) new ObjectInputStream(new FileInputStream(“a.dat”));
10、File类是IO包中唯一表示磁盘文件信息的对象,它定义了一些与平台无关的方法来操纵文件。通过调用File类提供的各种方法,我们能够创建、删除文件、重命名文件、判断文件的读写权限及是否存在,设置和查询文件的最近修改时间等。下面的代码片段实现的是什么功能?( B )
File file = new File(“C:\\test.dat”);
if (file.exists()) {
file.delete();
}
(A) 创建C:\\test.dat
(B) 删除C:\\test.dat
© 打开C:\\test.dat文件输出流。
(D) 移动C:\\test.dat
11、使用文件流从一个.txt文件中,读取里面所有的电话号码信息并对将内容保存。【提示:正则表达式】
假设d盘有phone.txt文件,内容如下:
123423423
13801000001
23409092834
public class Test {
public static void main(String[] args) throws IOException {
File f = new File(“d:/phone.txt”);
Pattern pattern = Pattern.compile(\”((13[0-9])|(15[4,\\D])|(18[0,5-9]))\\d{8}$\”);
try(FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr)?{
String s = null;
while((s = br.readLine()) != null) {
if(pattern.matcher(s).find()) {
System.out.println(s);
}
}
}
}
}
12、把一个D盘某一目录下的.txt文件复制到E盘某一目录下。
比如把D:/test1目录下的.txt文件复制到E:/test2目录下。
说明:还可以使用NIO或者Files工具类实现文件拷贝。
public class TestFileCopy {
public static void main(String[] args) throws IOException {
copyDir(“D:/test1”, “E:/test2”);
}
//将srcDirName目录下的txt文件都拷贝到dstDirName目录下public static void copyDir(String srcDirName,String dstDirName) throws IOException {File file = new File(srcDirName);File[] files = file.listFiles(new java.io.FileFilter() {@Overridepublic boolean accept(File file) {//判断文件的后缀是否为txtif(file.getName().endsWith(\".txt\")) {return true;}return false;}});File dstDir = new File(dstDirName);if(!dstDir.isDirectory()) {dstDir.mkdirs();}for (File f : files) {copyFile(f, dstDir);}}//将文件拷贝到目标目录下public static void copyFile(File srcFile,File dstDir) throws IOException {String destFileName = dstDir.getAbsolutePath() + File.separator + srcFile.getName();try(FileInputStream fis = new FileInputStream(srcFile); FileOutputStream fos = new FileOutputStream(new File(destFileName));){byte[] buffer = new byte[1024];int c = 0;while ((c = fis.read(buffer)) != -1) {fos.write(buffer, 0, c);}}}
}
13、读取a.txt的最后5行。
public class TestFileLastNLine {
public static final long LAST_NLINE_NUM = 5L;
public static void main(String[] args) throws IOException {List<String> result = readLastNLine(new File(\"D:/a.txt\"), LAST_NLINE_NUM);for (String line : result) {System.out.println(line);}}public static List<String> readLastNLine(File file, long numRead) throws IOException, IOException{//临时存储结果List<String> temp = new ArrayList<String>();//定义结果集List<String> result = new ArrayList<String>();//行数统计long count = 0;// 排除不可读状态if (!file.exists() || file.isDirectory() || !file.canRead()){return null;}//采用随机读try(RandomAccessFile fileRead = new RandomAccessFile(file, \"r\")){//读取文件长度long length = fileRead.length();//如果是0,代表是空文件,直接返回空结果if (length == 0L){return result;}else{//初始化游标long pos = length - 1;while (pos > 0){pos--;//开始读取fileRead.seek(pos);//如果读取到\\n代表是读取到一行if (fileRead.readByte() == \'\\n\'){//使用readLine获取当前行String line = fileRead.readLine();//保存结果temp.add(line);//行数统计,如果到达了numRead指定的行数,就跳出循环count++;if (count == numRead){break;}}}if (pos == 0){fileRead.seek(0);temp.add(fileRead.readLine());}for (int i = temp.size() - 1; i >= 0; i--) {result.add(temp.get(i));}}}return result;}
}
14、D盘根目录下有文件夹A,A包含子文件夹B和文件夹C,B包含文件夹D和文件E,C包含文件F和文件G,请使用递归算法显示所有文件及文件夹名称。
public class TestWalkDir {
public static void main(String[] args) {
walkDir(“D:/A”);
}
private static void walkDir(String path) {File file = new File(path);File[] files = file.listFiles();if (files == null) {return;}for (File f : files) {if (f.isDirectory()) {System.out.println(\"文件夹名:\"+f.getName());walkDir(f.getAbsolutePath());}else{System.out.println(\"文件名:\"+f.getName());}}}
}
16、网络编程中的socket怎么创建的?socket的工作原理?
可以利用java.net包中的两个类Socket和ServerSocket来分别建立到客户端和服务端的套接字连接。客户端程序使用Socket类建立到服务器的套接字连接,其构造方法如下:
public Socket():通过系统默认类型的SocketImpl创建未连接套接字。
public Socket(String host, int prot);连接到指定的主机和端口号。
Socket(InetAddress address, int port, boolean stream);连接到指定IP地址,主机端口和数据报方式的流。
服务器端程序任务主要是监听,等待客户机连接,建立一个等待客户端连接的ServerSocket套接字,构造方法如下:
public ServerSocket(int port); 连接到的特定端口。
public ServerSocket(int port, int backlog); 在声明构造方法时候,必须对创建的 Socket或ServerSocket捕获异常或抛出例外。
Socket是基于C/S模式通信的,即面向客户/服务器模型设计。在客户端,使用套接字对特定网络位置的某一服务器端口发出请求连接,当连接成功后就会开始进行会话,然后才关闭端口。客户端的端口通常情况下是动态和随机分配的。在服务器端,我们首先需要监听端口,使用ServerSocket来指定需要进行通讯的端口,在客户请求道端口后成功后,服务器端进行连接,完成会话,在双方通讯完毕后,关闭连接。
17、一对一聊天怎么实现?多对多怎么实现?
(1)一对一
A. 把服务器得到的每一个socket(和客户端建立的)保存在HashMap里面去,并且用一个客户ID去标识该socket(即同用户Id绑定)。
B. 当服务器和某个客户端形成一个连接时(Socket),服务器端就单开一个线程,让这个线程与客户端通信。
(2)多对多
服务器端有多个Socket,各socket对间不是独立的,从一个Socket接受的信息,需要转发到其他的Socket上去。将构建的所有的socket放到一个数组中,当需要将一个客户机发送的消息显示给其它的客户机时就遍历该数组,创建输出流,将消息发送出去。
18、一对一聊天如何知道对方的socket?socket是存在服务端还是客户端?
Socket和用户Id进行绑定,Socket存在服务端。
19、Socket怎么发送数据的?通过什么发送?
通过对象流的方式进行包装数据(实体类)发送数据。
20、TCP和UDP协议有什么区别?
(1)TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接;
(2)TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付;
(3)TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);
(4)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;
(5)TCP首部开销20字节;UDP的首部开销小,只有8个字节。
(6)TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。