Java面向对象程序设计(第二版)第十四章课后习题

3.完成下面方法中的代码,要求建立一个缓冲区,将字节输入流中的内容转为字符串。

import java.io.*;
public class test {
	 static String loadStream(InputStream in) throws IOException {
	        //int ptr;
	        //in = new BufferedInputStream(in);
	        StringBuffer buffer = new StringBuffer();  
	        int n = 1,i=5;
	        byte[] buf = new byte[n];//缓冲区,大小为1字节
	        while(i-->0) {
	        	in.read(buf,0,n);
	        	System.out.println(new String(buf));//按字节显示一下
	            buffer.append(new String(buf));    //连接一个字符串
	        }
	        return new String(buffer);  
	  }
	
	public static void main(String[] args) throws IOException {
		InputStream in = new BufferedInputStream(System.in);//in必须要初始化一个对象,不能为null
		String test=loadStream(in);
		System.out.println("result=: "+test);
	}
}



4.编写程序,将一个字符串转为字节数组输入流,将这个流中所有小写字母换成大写字母并写入字节数组输出流中,再将数组输出流转为字符串。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
public class test {
public static void main(String[] args) {
	String str = "Hello World!"; //源字符串
	//字节数组输入流
	ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes());
	//字节数组输出流
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	//循 环读取
	int b = -1;
	while((b = bais.read()) != -1){
		//把小写字母转换成大写字母
		System.out.print(" "+(char)b);
		if(b >= 97 && b <= 122){ //大写字母从 65~90, 小写字母从 97~122
			b -= 32;
		}
		//写回到字节数组输出流中
		baos.write(b);
	}
	System.out.println();
	//输出,并把字节数组输出流转换成字符串
	String out = baos.toString();
	System.out.println(out);
	}
}

5.完成下面方法中的代码,方法中的参数为一个文本文件的名称,要求将文件中的内容转为字符串。static public String loadFile(String filename){}
import java.io.*;
public class test {
	static public String loadFile(String filename) {
	    File file = new File( filename );//建立文件对象
	    try {
	        Reader rdr = new FileReader( file );//建立读文件对象
	        long sz = file.length();
	        //一次全部读入
	        char[] ch = new char[(int)sz]; //开辟一次读入的大小  
	        rdr.read(ch);
	        rdr.close();
	        return new String(ch);//变为字符串
	    } catch(IOException ioe) {
	        return null;
	    }
	}
	public static void main(String[] args) {
		//先在test工程的目录下手动新建一个test.txt(和bin,src文件夹并列的位置),自己保存点内容
		//设定文件名
		String fname = "test.txt";
		String test=loadFile(fname);//调用方法
		System.out.println(test);
	}
}

6.完成下面方法中的代码,将字符串contents中的内容写入文件filename中。

static public boolean saveFile(String filename,String contents){}
import java.io.*;
public class test {
	static public boolean saveFile(String filename, String contents) {
	    try {
	        File file = new File( filename );
	        if(!file.exists()) {//判断该txt是否存在
	              file.createNewFile();//不存在就在当前目录下新建一个
	        }
	        Writer wtr = new FileWriter( file );
	        char[] ch = contents.toCharArray();//把字符串转为字符数组
	        wtr.write(ch);
	        wtr.close();
	        return true;
	    } catch(IOException ioe) {
	        return false;
	    }
	} 

	public static void main(String[] args) throws IOException {
		String fname = "test.txt";//给定文件名
		String contents = "hello world!";//给定写入的字符串
		if(saveFile(fname,contents))System.out.println("contents is save!");//显示是否成功
	}
}

7.socket套接字有一个方法getInputStream(),其含义是得到从网络上传过来的数据流。现要求编写一段程序,将接收的数据存入文件。
客户端:

import java.io.*;
import java.net.Socket;

public class TalkClient {
    public static void main(String[] args)throws IOException {
        Socket socket = new Socket("127.0.0.1",5000);
        OutputStream out = socket.getOutputStream();
        int i =10;
        while(i-->0)  
        {
        	out.write("HELLO".getBytes());
        	out.flush();
        }
        System.out.println("发送消息完毕!");
        out.close();
        socket.close();
    }
   }
   
服务器端:
import java.io.*;
import java.net.*;
public class MultiTalkServer{
	public static void main(String[] args)throws IOException {
        ServerSocket server = new ServerSocket(5000);//打开服务器制定端口,等待客户端连接
        //获得与服务器相连的套接字对象     套接字:绑定ip地址和端口号的网络对象
        Socket socket = server.accept();
        //查看该地址文件夹是否存在,如果不存在,创建一个
        String name = "test.txt";        //文件名,按照我的设定,应该在test文件夹下面
        File file = new File(name); 
        if(!file.exists()){
            file.createNewFile();
            System.out.println("文件已新建!");
        }   
        InputStream in = socket.getInputStream();  //套接字的字节输入流,读取客户端传过来的数据
        FileOutputStream fos = new FileOutputStream(name);  //创建输出流对象           
        byte[] data = new byte[5];//一次读取5字节,方便阅读,因为客户端传的就是5个字节
        int len = 0;
        //如果客户端没有关闭socket输出流,这里的read方法会一直读取
        while((len = in.read(data)) != -1) 
        {
        	fos.write(data, 0, len);
        	fos.write("\r\n".getBytes());// 写入一个换行
        }  
        System.out.println("上传成功!");
        server.close();
        fos.close();
    }
}

8.编写程序实现文件查找功能。提供两个参数,第一个参数为查找的起始路径,第二个参数为要查找的文件名称。如果找到,则给出文件的完整路径,否则提示文件不存在。

import java.io.File;
public class test
{
	String path = null;
	public String searchFile(File dir, String fileName) 
	{
		if(dir.isFile())//测试当前dir是否为文件
		{
			if(dir.getName().equals(fileName))//此时表明dir为一个文件,和我们要找的文件比对一些
				path = dir.getAbsolutePath();
		}
		if (dir.isDirectory())//进入if表明dir为一个文件夹
		{
			//列出dir中所有的文件和目录
			File[] files = dir.listFiles();
			File f ;
			for (int i=0;i<files.length;i++ ){
				f = files[i];
				path = searchFile(f, fileName);//递归调用,因为文件夹可能有多层
			}				
		}
		return path;
	}
 
	public static void main(String[] args) {
		File dir = new File("D:/360Downloads/");//此处不能写D:/,原因应该是根目录不支持吧
		String fileName = "filelist.dat";	//自己修改个文件名	
		if (!dir.exists())
		{
			System.out.println("目录不存在:" + dir);
			System.exit(0);
		}
		String path = new test().searchFile(dir,fileName);
		if(path!=null)
			System.out.println("文件完整路径:" + path);
		else
			System.out.println("不存在此文件");
	}
}


15-6.利用串行化技术和Socket通信,将一个客户端构造的对象传送到服务器端,并输出该对象的属性值。
注:共三个class,那个User也可以写到另外两个里面,不过分开会清楚一点,User类就是用来传送的对象模板。

User对象类:
import java.io.Serializable;

public class User implements Serializable{
	String Name;
	String Password;
	User()//默认构造函数
	{
		Name="null";
		Password="00000";
	}
	User(String name,String password)//带参数的构造函数
	{
		Name=name;
		Password=password;
	}
	void setName(String name) {Name=name;}
	void setPassword(String password) {Password=password;}
	String getName() {return Name;}
	String getPassword() {return Password;}
}

客户端:
import java.io.*;
import java.net.Socket;

public class TalkClient {
	public static void main(String[] args) throws IOException{
	    Socket socket = null;
		try {
			socket = new Socket("127.0.0.1", 4700);
		} catch (IOException e) {
			e.printStackTrace();
		} 
        User u1 = new User();
        u1.setName("Tommy");
        u1.setPassword("1234567"); //赋值
        //把对象串行化为可输出的形式,输入到Socket的输出流里面
        ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
        out.writeObject(u1);//以串行化方式写入这个对象
        System.out.println("successful!");
        out.flush();
        out.close();//超级重要,要是没有close来正常退出,服务器端就会被意外中止,导致出错。
    }
}

服务器端:
import java.io.*;
import java.net.*;
public class MultiTalkServer {
	public static void main(String[] args) throws ClassNotFoundException, IOException {
	    ServerSocket server;
	    Socket socket = null; 
        try {
            server = new ServerSocket(4700);
            socket = server.accept();
            //这步很重要,socket.getInputStream()是输入流,要用ObjectInputStream装配为串行化输入流
            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            System.out.println("连接成功!");
            User u2 = (User) in.readObject();//接受一个被串行化的对象,赋值给u2
            System.out.println("Name: "+ u2.getName() + "  Password: " + u2.getPassword());
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值