IO流练习及面试题——博客园:师妹开讲啦
Java语言使用的字符码集是(C)
A.ASCII
B.UTF-8
C.Unicode
D.GBK
要从文件" 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();
C.FileInputStream in=new FileInputStream("file.dat"); int c=in.read();
D.RandomAccessFile in=new RandomAccessFile("file.dat"); in.skip(9); int c=in.readByte();
有如下代码,正确答案是( C )
public class TestFile{
public static void main(String args[]){
File file = new File(“chp13/corejava.txt”);
}
}
A. corejava.txt 文件在系统中被创建
B. 在windows 系统上运行出错,因为路径分隔符不正确
C. corejava.txt 文件在系统中没有被创建
D. 如果corejava.txt 文件已存在,则抛出一个异常
若要把变量声名为暂时性变量,应使用如下哪种修饰符?(C )
A.protected
B.provate
C.transient
D.volatile
(File 类)以下关于File 类说法正确的是:(B C)
A. 一个File 对象代表了操作系统中的一个文件或者文件夹
B. 可以使用File 对象创建和删除一个文件
C. 可以使用File 对象创建和删除一个空文件夹
D. 当一个File 对象被垃圾回收器回收时,系统上对应的文件或文件夹也被删除
下面哪些流是节点流?(AC)
A. FileReader
B. OutputStreamWriter
C. FileInputStream
D. DataOuputStream
▁D▁文件流类的 close 方法不可用于关闭文件。
A FileOutputStream
B FileInputStream
C RandomAccessFile
D FileWrite
下面哪个行为不属于序列化或反序列化行为:(D)
A JavaWeb服务器将html输出至浏览器。
B 将字符串打印的控制台。
C 从文件中读取Java对象。
D 变量引用了一个新创建的对象
下面关于字符流说法正确的是:(D)
A 字符流采用unicode编码,因此使用字符流的读写的文件必须使用unicode编码。
B 字符流可以读写非unicode编码的文件,这时字符流将采用非unicode编码
C 字符流不能实现unicode编码与其它编码之间的转换。
D 通过字符流可以将一种字符编码的文件复制为另一种字符编码的文件
在FilterOutputStream类的构造方法中,下面哪个类是合法: C
A File
B InputStream
C OutputStream
D FileOutputStream
凡是从中央处理器或者是内存流向外部设备的数据流称为(C)
A: 文件流
B: 字符流
C: 输入流
D: 输出流
File类表示的路径是一定存在的。(×)
使用File类可以修改文件或文件夹的名称。(√)
序列化接口不包含任何方法,仅仅起到一个标志性的作用。(√)
Java实现将九九乘法表输入到文本文件
package com.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class Test1 {
public static void main(String[] args) {
PrintStream ps = null;
try {
ps=new PrintStream(new File("D:/九九乘法表.txt")); //("D:/九九乘法表.txt")
System.setOut(ps);
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+i*j+"\t");
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
if(ps. !=null) {
ps.close();
}
}
}
}
删除一个目录(注意:要删除目录必须删除目录下的文件和子目录)
import java.io.File;
public class Test5 {
public static void main(String[] args) {
delete(new File("D:/a"));
}
public static void delete(File f) {
if(f.isDirectory()){
File[] files=f.listFiles();
for (File file : files) {
delete(file);
file.delete();
}
}
f.delete();
}
}
编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,
并将原来文件的扩展名从.java改为.jad。
public class Test3 {
private static FileFilter fileFilter = new FileFilter() {
@Override
public boolean accept(File arg0) {
String tmp = arg0.getName().toLowerCase();
if(tmp.endsWith(".java")){
return true;
}
return false;
}
};
public static void main(String[] args) throws Exception {
File file = new File("D:/java");
File[] files = file.listFiles(fileFilter);
InputStream in = null;
OutputStream out = null;
String fileName = null;
String destName = null;
File f = new File("D:/jad");
for (File file2 : files) {
in = new FileInputStream(file2);
if(!f.exists()){
f.mkdir();
}
fileName = file2.getName();
destName = (String) fileName.subSequence(0, fileName.lastIndexOf("."));
out = new FileOutputStream(new File("D:/jad/"+destName+".jad"));
int len = 0;
byte[] b = new byte[1024];
while((len = in.read(b))!= -1){
out.write(b, 0, len);
//System.out.println(new String(b,0,len));
}
}
}
}
java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。
字节流继承于InputStream OutputStream,字符流继承于Reader Writer。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
什么是缓冲区
答:计算机访问外部设备或文件,要比直接访问内存慢得多,如果每次调用read()方法或write()方法访问外部的设备或文件,CPU就要花费最多的时间是在等外部设备响应,而不是处理数据。为此,开辟一个内存缓冲区的内存区域,程序每次调用read()方法或write()方法都是读写在这个缓冲区中。当这个缓冲区被装满后,系统才将这个缓冲区的内容一次集中写到外部设备或读取进来给CPU。使用内存缓冲区可以有效地提高CPU的使用率,能提高整个计算机系统的效率。
PrintStream、BufferedWriter、PrintWriter的比较?
PrintStream类的输出功能非常强大,通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream
BufferedWriter:将文本写入字符输出流,缓冲各个字符从而提供单个字符,数组和字符串的高效写入。通过write()方法可以将获取到的字符输出,然后通过newLine()进行换行操作。BufferedWriter中的字符流必须通过调用flush方法才能将其刷出去。并且BufferedWriter只能对字符流进行操作。如果要对字节流操作,则使用BufferedInputStream。
PrintWriter的println方法自动添加换行,不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生,PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush);
程序题
1.文件复制,实现如下效果
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.swing.*;
public class UserMonitorFrame extends JFrame {
private JTextField fSource = new JTextField(20);
private JTextField fTarget = new JTextField(20);
private JLabel labelSource = new JLabel("文件地址");
private JLabel labelTarget = new JLabel("复制地址");
private JButton btn1 = new JButton("选择源文件");
private JButton btn2 = new JButton("选择目标文件");
private JButton btn3 = new JButton("合并");
public UserMonitorFrame() {
JPanel p1 = new JPanel();
p1.add(labelSource);
p1.add(fSource);
p1.add(btn1);
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);// 指示显示文件和目录
jfc.showDialog(new JLabel(), "选择");
File file = jfc.getSelectedFile();
String s=file.getAbsolutePath();
if(s==null){
System.out.println("输入文件为空");
}else{
fSource.setText(file.getAbsolutePath());
}
}
});
JPanel p2 = new JPanel();
p2.add(labelTarget);
p2.add(fTarget);
p2.add(btn2);
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
jfc.showDialog(new JLabel(), "选择");
File file = jfc.getSelectedFile();
fTarget.setText(file.getAbsolutePath());
}
});
JPanel p3 = new JPanel();
p3.setLayout(new FlowLayout(FlowLayout.CENTER));
p3.add(btn3);
btn3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
copyFileUtil(fSource.getText(), fTarget.getText());
}
});
Box box = Box.createVerticalBox();
box.add(p1);
box.add(p2);
box.add(p3);
add(box);
setTitle("文件复制");
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
}
public void copyFileUtil(String source, String target) {
File file1 = new File(source);
File file2 = new File(target);
FileWriter fw=null;
FileReader fr=null;
int len=0;
char[] c=new char[1024];
try{
fr=new FileReader(file1);
fw=new FileWriter(file2);
while((len=fr.read(c))!=-1){
fw.write(c,0,len);
}
JOptionPane .showMessageDialog(null, "复制成功","复制",JOptionPane .INFORMATION_MESSAGE);
}catch(Exception e){
e.printStackTrace();
}finally{
if(fw!=null){
try{
fw.close();
}catch(Exception e){
e.printStackTrace();
}
}
if(fr!=null){
try{
fr.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new UserMonitorFrame();
}
}
2.合并文件,实现效果如下
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class MergeFilesFrame extends JFrame {
private JTextArea jtx=new JTextArea(10,10);
private JButton btn1=new JButton("添加要合并的文件到列表");
private JButton btn2=new JButton("选择目标文件");
private JButton btn3=new JButton("合并");
List<File> pathList=new ArrayList<File>();
private JTextField fTarget=new JTextField(20);
private JLabel labelTarget=new JLabel("复制地址");
public MergeFilesFrame(){
Box box=Box.createVerticalBox();
btn1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser jfc=new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
jfc.showDialog(new JLabel(), "选择");
File file=jfc.getSelectedFile();
jtx.setText(jtx.getText()+"\n"+file.getAbsolutePath());
pathList.add(file);
}
});
box.add(btn1);
JPanel p2=new JPanel();
p2.add(labelTarget);
p2.add(fTarget);
p2.add(btn2);
btn2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser jfc=new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
jfc.showDialog(new JLabel(), "选择");
File file=jfc.getSelectedFile();
fTarget.setText(file.getAbsolutePath());
}
});
box.add(p2);
box.add(jtx);
btn3.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
writeFiles(pathList,fTarget.getText());
}
});
box.add(btn3);
add(box);
setTitle("文件合并");
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
}
public void writeFiles(List<File> pathList, String text) {
Reader reader =null;
Writer writer=null;
File file=new File(text);
int len=0;
try{
for(File files:pathList ){
char[] c=new char[(int)files.length()];
reader=new BufferedReader(new FileReader(new File(files.toString())));
writer=new BufferedWriter(new FileWriter(file,true));
while((len=reader.read(c))!=-1){
writer.write(c,0,c.length);
}
writer.close();
reader.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
new MergeFilesFrame();
}
}
3.获取某文件夹下的所有文件和文件夹,实现效果如下:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class FileGUI extends JFrame{
private JLabel label = new JLabel("请输入文件夹路径:");
private JTextField jtf = new JTextField(30);
private JButton btn = new JButton("确认");
private JTextArea jta = new JTextArea();
public FileGUI() {
this.setTitle("File类常用方法练习");
JPanel panel = new JPanel();
panel.add(label);
panel.add(jtf);
panel.add(btn);
jtf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
showDir();
}
}
});
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showDir();
}
});
this.add(panel, BorderLayout.NORTH);
this.add(jta);
this.setSize(600, 600);
this.setLocation(500, 100);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
private void showDir() {
String dirPath = jtf.getText();
File dir = new File(dirPath);
if (dir.exists() && dir.isDirectory()) {
jta.setText("");
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
jta.append(files[i].toString() + "\n");
}
} else {
JOptionPane.showMessageDialog(null, "输入信息有误,请重新输入", "提示信息",
JOptionPane.INFORMATION_MESSAGE);
jtf.setText("");
}
}
public static void main(String[] args) {
new FileGUI();
}
}
获取某文件夹下的指定文件
public class FileDemo2 implements FilenameFilter{
String str;
public FileDemo2(){}
public FileDemo2(String ext){
str="."+ext;
}
public static void casual(){
Scanner sc=new Scanner(System.in);
System.out.print("请输入你要查看的文件类型:");
String str1=sc.next();
File file=null;
String[] paths;
try{
file=new File("d:/");
FilenameFilter filter=new FileDemo2(str1);
paths=file.list(filter);
for(String path:paths){
System.out.println(path);
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
casual();
}
@Override
public boolean accept(File dir, String name) {
return name.endsWith(str);
}
}
创建文件
import java.io.File;
import java.io.IOException;
public class File1 {
public static void main(String[] args) {
File file = new File("D:/JavaDemo1", "file1.text");
File file2 = new File(file.getParent());
if (file2.exists()) {
createFile(file);
} else {
file2.mkdir();
createFile(file);
}
}
public static void createFile(File file) {
try {
file.createNewFile();
System.out.println("创建成功");
} catch (IOException e) {
System.out.println("创建失败");
e.printStackTrace();
}
}
}
对象流
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectDemo02 {
public static void main(String[] args) {
writeObj();
readObj();
}
public static void writeObj(){
ObjectOutputStream oos=null;
try{
oos=new ObjectOutputStream(new FileOutputStream("student.dat"));
oos.writeObject(new Student("小明",21));
oos.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void readObj(){
ObjectInputStream ois=null;
try{
ois=new ObjectInputStream(new FileInputStream("student.dat"));
Student s=(Student)ois.readObject();
System.out.println(s);
}catch(Exception e){
e.printStackTrace();
}
}
}
电子邮箱和邮编的正则表达式
import java.util.Scanner;
public class ExpressDemo {
public static void email(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入电子邮箱:");
String str=new String("^[a-zA-Z0-9_\\.]+@[a-zA-Z0-9-]+[\\.a-zA-Z]+$");
String email;
if(sc.hasNext(str)){//如果下一个完整标记与指定模式匹配,则返回 true
email=sc.nextLine();
System.out.println("输入格式正确");
}else{
System.out.println("输入格式不正确");
}
}
public static void code(){
Scanner sc=new Scanner(System.in);
String s=new String("^[1-9]\\d{5}(?!\\d)");
String code;
System.out.println("请输入邮编:");
if(sc.hasNext(s)){
code=sc.nextLine();
System.out.println("输入格式正确");
}else{
System.out.println("输入格式不正确");
}
}
public static void main(String[] args) {
email();
code();
}
}